From 9cf4eeedad959340d71dc6e4d1f49eb563be6e71 Mon Sep 17 00:00:00 2001 From: Thomas Hodnemyr Date: Sat, 17 Sep 2022 14:28:51 +0200 Subject: [PATCH] Update 1 --- cogs/setup.py | 13 + .../site/python3.10/greenlet/greenlet.h | 161 + .../INSTALLER | 0 .../SQLAlchemy-1.4.41.dist-info/LICENSE | 19 + .../SQLAlchemy-1.4.41.dist-info/METADATA | 237 + .../SQLAlchemy-1.4.41.dist-info/RECORD | 486 ++ .../REQUESTED | 0 .../SQLAlchemy-1.4.41.dist-info/WHEEL | 5 + .../SQLAlchemy-1.4.41.dist-info/top_level.txt | 1 + .../greenlet-1.1.3.dist-info/AUTHORS | 51 + .../INSTALLER} | 0 .../greenlet-1.1.3.dist-info/LICENSE | 30 + .../greenlet-1.1.3.dist-info/LICENSE.PSF | 47 + .../greenlet-1.1.3.dist-info/METADATA | 103 + .../greenlet-1.1.3.dist-info/RECORD | 71 + .../greenlet-1.1.3.dist-info/WHEEL | 5 + .../greenlet-1.1.3.dist-info/top_level.txt | 1 + .../Lib/site-packages/greenlet/__init__.py | 63 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 846 bytes .../greenlet/_greenlet.cp310-win_amd64.pyd | Bin 0 -> 29184 bytes .../Lib/site-packages/greenlet/greenlet.c | 2170 +++++ .../Lib/site-packages/greenlet/greenlet.h | 161 + .../platform/setup_switch_x64_masm.cmd | 2 + .../greenlet/platform/switch_aarch64_gcc.h | 69 + .../greenlet/platform/switch_alpha_unix.h | 30 + .../greenlet/platform/switch_amd64_unix.h | 84 + .../greenlet/platform/switch_arm32_gcc.h | 79 + .../greenlet/platform/switch_arm32_ios.h | 67 + .../greenlet/platform/switch_csky_gcc.h | 48 + .../greenlet/platform/switch_m68k_gcc.h | 38 + .../greenlet/platform/switch_mips_unix.h | 64 + .../greenlet/platform/switch_ppc64_aix.h | 103 + .../greenlet/platform/switch_ppc64_linux.h | 105 + .../greenlet/platform/switch_ppc_aix.h | 87 + .../greenlet/platform/switch_ppc_linux.h | 84 + .../greenlet/platform/switch_ppc_macosx.h | 82 + .../greenlet/platform/switch_ppc_unix.h | 82 + .../greenlet/platform/switch_riscv_unix.h | 32 + .../greenlet/platform/switch_s390_unix.h | 87 + .../greenlet/platform/switch_sparc_sun_gcc.h | 92 + .../greenlet/platform/switch_x32_unix.h | 63 + .../greenlet/platform/switch_x64_masm.asm | 111 + .../greenlet/platform/switch_x64_masm.obj | Bin 0 -> 1078 bytes .../greenlet/platform/switch_x64_msvc.h | 60 + .../greenlet/platform/switch_x86_msvc.h | 88 + .../greenlet/platform/switch_x86_unix.h | 105 + .../greenlet/slp_platformselect.h | 58 + .../filters => greenlet/tests}/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 187 bytes .../test_contextvars.cpython-310.pyc | Bin 0 -> 7364 bytes .../__pycache__/test_cpp.cpython-310.pyc | Bin 0 -> 857 bytes .../test_extension_interface.cpython-310.pyc | Bin 0 -> 3530 bytes .../tests/__pycache__/test_gc.cpython-310.pyc | Bin 0 -> 2915 bytes .../test_generator.cpython-310.pyc | Bin 0 -> 2245 bytes .../test_generator_nested.cpython-310.pyc | Bin 0 -> 5334 bytes .../__pycache__/test_greenlet.cpython-310.pyc | Bin 0 -> 26794 bytes .../__pycache__/test_leaks.cpython-310.pyc | Bin 0 -> 5041 bytes .../test_stack_saved.cpython-310.pyc | Bin 0 -> 867 bytes .../__pycache__/test_throw.cpython-310.pyc | Bin 0 -> 2961 bytes .../__pycache__/test_tracing.cpython-310.pyc | Bin 0 -> 8930 bytes .../__pycache__/test_version.cpython-310.pyc | Bin 0 -> 1531 bytes .../__pycache__/test_weakref.cpython-310.pyc | Bin 0 -> 1854 bytes .../greenlet/tests/_test_extension.c | 216 + .../tests/_test_extension.cp310-win_amd64.pyd | Bin 0 -> 13312 bytes .../_test_extension_cpp.cp310-win_amd64.pyd | Bin 0 -> 12800 bytes .../greenlet/tests/_test_extension_cpp.cpp | 121 + .../greenlet/tests/test_contextvars.py | 266 + .../site-packages/greenlet/tests/test_cpp.py | 18 + .../tests/test_extension_interface.py | 77 + .../site-packages/greenlet/tests/test_gc.py | 77 + .../greenlet/tests/test_generator.py | 59 + .../greenlet/tests/test_generator_nested.py | 165 + .../greenlet/tests/test_greenlet.py | 728 ++ .../greenlet/tests/test_leaks.py | 178 + .../greenlet/tests/test_stack_saved.py | 19 + .../greenlet/tests/test_throw.py | 100 + .../greenlet/tests/test_tracing.py | 267 + .../greenlet/tests/test_version.py | 39 + .../greenlet/tests/test_weakref.py | 34 + .../pip-22.2.2.dist-info/INSTALLER | 1 + .../LICENSE.txt | 0 .../METADATA | 6 +- .../RECORD | 695 +- .../pip-22.2.2.dist-info/REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 3 +- .../pip-22.2.2.dist-info/top_level.txt | 1 + sbsheriff/Lib/site-packages/pip/__init__.py | 2 +- .../Lib/site-packages/pip/__pip-runner__.py | 36 + .../pip/__pycache__/__init__.cpython-310.pyc | Bin 632 -> 632 bytes .../pip/__pycache__/__main__.cpython-310.pyc | Bin 594 -> 594 bytes .../__pip-runner__.cpython-310.pyc | Bin 0 -> 1401 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 753 -> 753 bytes .../__pycache__/build_env.cpython-310.pyc | Bin 9597 -> 9184 bytes .../__pycache__/cache.cpython-310.pyc | Bin 8380 -> 9215 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 11126 -> 11213 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 23125 -> 23125 bytes .../__pycache__/main.cpython-310.pyc | Bin 618 -> 618 bytes .../__pycache__/pyproject.cpython-310.pyc | Bin 3537 -> 3622 bytes .../self_outdated_check.cpython-310.pyc | Bin 4577 -> 6574 bytes .../__pycache__/wheel_builder.cpython-310.pyc | Bin 9139 -> 9206 bytes .../site-packages/pip/_internal/build_env.py | 60 +- .../Lib/site-packages/pip/_internal/cache.py | 25 + .../cli/__pycache__/__init__.cpython-310.pyc | Bin 273 -> 273 bytes .../autocompletion.cpython-310.pyc | Bin 5308 -> 5308 bytes .../__pycache__/base_command.cpython-310.pyc | Bin 6348 -> 6342 bytes .../__pycache__/cmdoptions.cpython-310.pyc | Bin 22548 -> 23676 bytes .../command_context.cpython-310.pyc | Bin 1307 -> 1313 bytes .../cli/__pycache__/main.cpython-310.pyc | Bin 1371 -> 1371 bytes .../__pycache__/main_parser.cpython-310.pyc | Bin 2157 -> 2157 bytes .../cli/__pycache__/parser.cpython-310.pyc | Bin 9944 -> 9955 bytes .../__pycache__/progress_bars.cpython-310.pyc | Bin 9233 -> 1897 bytes .../__pycache__/req_command.cpython-310.pyc | Bin 13534 -> 13092 bytes .../cli/__pycache__/spinners.cpython-310.pyc | Bin 4947 -> 4935 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 352 -> 352 bytes .../pip/_internal/cli/base_command.py | 2 +- .../pip/_internal/cli/cmdoptions.py | 68 +- .../pip/_internal/cli/command_context.py | 4 +- .../site-packages/pip/_internal/cli/parser.py | 6 +- .../pip/_internal/cli/progress_bars.py | 263 +- .../pip/_internal/cli/req_command.py | 116 +- .../pip/_internal/cli/spinners.py | 12 +- .../pip/_internal/commands/__init__.py | 5 + .../__pycache__/__init__.cpython-310.pyc | Bin 3136 -> 3252 bytes .../__pycache__/cache.cpython-310.pyc | Bin 6177 -> 6235 bytes .../__pycache__/check.cpython-310.pyc | Bin 1570 -> 1570 bytes .../__pycache__/completion.cpython-310.pyc | Bin 3137 -> 4161 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 8319 -> 8826 bytes .../__pycache__/debug.cpython-310.pyc | Bin 6686 -> 6667 bytes .../__pycache__/download.cpython-310.pyc | Bin 3984 -> 4047 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 2635 -> 2635 bytes .../commands/__pycache__/hash.cpython-310.pyc | Bin 2149 -> 2149 bytes .../commands/__pycache__/help.cpython-310.pyc | Bin 1310 -> 1310 bytes .../__pycache__/index.cpython-310.pyc | Bin 4633 -> 4559 bytes .../__pycache__/inspect.cpython-310.pyc | Bin 0 -> 3123 bytes .../__pycache__/install.cpython-310.pyc | Bin 17796 -> 19420 bytes .../commands/__pycache__/list.cpython-310.pyc | Bin 10260 -> 10191 bytes .../__pycache__/search.cpython-310.pyc | Bin 5363 -> 5363 bytes .../commands/__pycache__/show.cpython-310.pyc | Bin 6116 -> 6395 bytes .../__pycache__/uninstall.cpython-310.pyc | Bin 3107 -> 3223 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 4839 -> 4886 bytes .../pip/_internal/commands/cache.py | 8 +- .../pip/_internal/commands/completion.py | 30 + .../pip/_internal/commands/configuration.py | 22 +- .../pip/_internal/commands/debug.py | 11 +- .../pip/_internal/commands/download.py | 8 +- .../pip/_internal/commands/index.py | 1 - .../pip/_internal/commands/inspect.py | 97 + .../pip/_internal/commands/install.py | 68 +- .../pip/_internal/commands/list.py | 5 +- .../pip/_internal/commands/show.py | 13 +- .../pip/_internal/commands/uninstall.py | 7 +- .../pip/_internal/commands/wheel.py | 14 +- .../pip/_internal/configuration.py | 12 +- .../__pycache__/__init__.cpython-310.pyc | Bin 800 -> 800 bytes .../__pycache__/base.cpython-310.pyc | Bin 1857 -> 1888 bytes .../__pycache__/installed.cpython-310.pyc | Bin 1234 -> 1265 bytes .../__pycache__/sdist.cpython-310.pyc | Bin 4446 -> 4996 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 1601 -> 1632 bytes .../pip/_internal/distributions/base.py | 5 +- .../pip/_internal/distributions/installed.py | 5 +- .../pip/_internal/distributions/sdist.py | 27 +- .../pip/_internal/distributions/wheel.py | 5 +- .../__pycache__/__init__.cpython-310.pyc | Bin 227 -> 227 bytes .../__pycache__/collector.cpython-310.pyc | Bin 18065 -> 17711 bytes .../package_finder.cpython-310.pyc | Bin 28121 -> 29064 bytes .../index/__pycache__/sources.cpython-310.pyc | Bin 7120 -> 7120 bytes .../pip/_internal/index/collector.py | 237 +- .../pip/_internal/index/package_finder.py | 111 +- .../pip/_internal/locations/__init__.py | 22 +- .../__pycache__/__init__.cpython-310.pyc | Bin 12387 -> 12543 bytes .../__pycache__/_distutils.cpython-310.pyc | Bin 4655 -> 4776 bytes .../__pycache__/_sysconfig.cpython-310.pyc | Bin 6238 -> 6200 bytes .../__pycache__/base.cpython-310.pyc | Bin 1537 -> 2403 bytes .../pip/_internal/locations/_distutils.py | 13 +- .../pip/_internal/locations/_sysconfig.py | 5 +- .../pip/_internal/locations/base.py | 29 + .../pip/_internal/metadata/__init__.py | 69 +- .../__pycache__/__init__.cpython-310.pyc | Bin 2293 -> 4008 bytes .../__pycache__/_json.cpython-310.pyc | Bin 0 -> 2187 bytes .../metadata/__pycache__/base.cpython-310.pyc | Bin 20847 -> 25948 bytes .../__pycache__/pkg_resources.cpython-310.pyc | Bin 9863 -> 9810 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 176 +- .../_internal/metadata/importlib/__init__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 318 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 2124 bytes .../__pycache__/_dists.cpython-310.pyc | Bin 0 -> 8380 bytes .../__pycache__/_envs.cpython-310.pyc | Bin 0 -> 7491 bytes .../_internal/metadata/importlib/_compat.py | 43 + .../_internal/metadata/importlib/_dists.py | 206 + .../pip/_internal/metadata/importlib/_envs.py | 180 + .../pip/_internal/metadata/pkg_resources.py | 49 +- .../__pycache__/__init__.cpython-310.pyc | Bin 261 -> 261 bytes .../__pycache__/candidate.cpython-310.pyc | Bin 1413 -> 1413 bytes .../__pycache__/direct_url.cpython-310.pyc | Bin 7290 -> 7107 bytes .../format_control.cpython-310.pyc | Bin 2738 -> 2738 bytes .../models/__pycache__/index.cpython-310.pyc | Bin 1230 -> 1230 bytes .../installation_report.cpython-310.pyc | Bin 0 -> 1740 bytes .../models/__pycache__/link.cpython-310.pyc | Bin 10162 -> 10536 bytes .../models/__pycache__/scheme.cpython-310.pyc | Bin 1029 -> 1029 bytes .../__pycache__/search_scope.cpython-310.pyc | Bin 3484 -> 3484 bytes .../selection_prefs.cpython-310.pyc | Bin 1691 -> 1691 bytes .../__pycache__/target_python.cpython-310.pyc | Bin 3446 -> 3446 bytes .../models/__pycache__/wheel.cpython-310.pyc | Bin 4337 -> 4440 bytes .../pip/_internal/models/direct_url.py | 8 - .../_internal/models/installation_report.py | 53 + .../pip/_internal/models/link.py | 36 +- .../pip/_internal/models/wheel.py | 5 +- .../__pycache__/__init__.cpython-310.pyc | Bin 249 -> 249 bytes .../network/__pycache__/auth.cpython-310.pyc | Bin 7529 -> 7529 bytes .../network/__pycache__/cache.cpython-310.pyc | Bin 2930 -> 2936 bytes .../__pycache__/download.cpython-310.pyc | Bin 5496 -> 5531 bytes .../__pycache__/lazy_wheel.cpython-310.pyc | Bin 8404 -> 8416 bytes .../__pycache__/session.cpython-310.pyc | Bin 10735 -> 12429 bytes .../network/__pycache__/utils.cpython-310.pyc | Bin 1445 -> 1452 bytes .../__pycache__/xmlrpc.cpython-310.pyc | Bin 2062 -> 2062 bytes .../pip/_internal/network/cache.py | 4 +- .../pip/_internal/network/download.py | 9 +- .../pip/_internal/network/lazy_wheel.py | 12 +- .../pip/_internal/network/session.py | 76 +- .../pip/_internal/network/utils.py | 4 +- .../__pycache__/__init__.cpython-310.pyc | Bin 197 -> 197 bytes .../__pycache__/check.cpython-310.pyc | Bin 4010 -> 4010 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 6195 -> 6202 bytes .../__pycache__/prepare.cpython-310.pyc | Bin 14893 -> 14054 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 203 -> 203 bytes .../__pycache__/build_tracker.cpython-310.pyc | Bin 0 -> 4284 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 1430 -> 1430 bytes .../metadata_editable.cpython-310.pyc | Bin 1464 -> 1464 bytes .../metadata_legacy.cpython-310.pyc | Bin 2375 -> 2375 bytes .../build/__pycache__/wheel.cpython-310.pyc | Bin 1220 -> 1220 bytes .../wheel_editable.cpython-310.pyc | Bin 1444 -> 1444 bytes .../__pycache__/wheel_legacy.cpython-310.pyc | Bin 2760 -> 2760 bytes .../build/build_tracker.py} | 20 +- .../pip/_internal/operations/freeze.py | 4 +- .../__pycache__/__init__.cpython-310.pyc | Bin 261 -> 261 bytes .../editable_legacy.cpython-310.pyc | Bin 1548 -> 1548 bytes .../__pycache__/legacy.cpython-310.pyc | Bin 3332 -> 3346 bytes .../install/__pycache__/wheel.cpython-310.pyc | Bin 21094 -> 21120 bytes .../_internal/operations/install/legacy.py | 2 +- .../pip/_internal/operations/install/wheel.py | 30 +- .../pip/_internal/operations/prepare.py | 128 +- .../site-packages/pip/_internal/pyproject.py | 11 +- .../pip/_internal/req/__init__.py | 4 +- .../req/__pycache__/__init__.cpython-310.pyc | Bin 2597 -> 2604 bytes .../__pycache__/constructors.cpython-310.pyc | Bin 12162 -> 12376 bytes .../req/__pycache__/req_file.cpython-310.pyc | Bin 13492 -> 13541 bytes .../__pycache__/req_install.cpython-310.pyc | Bin 22177 -> 22682 bytes .../req/__pycache__/req_set.cpython-310.pyc | Bin 5839 -> 3912 bytes .../__pycache__/req_tracker.cpython-310.pyc | Bin 4305 -> 0 bytes .../__pycache__/req_uninstall.cpython-310.pyc | Bin 18947 -> 19063 bytes .../pip/_internal/req/constructors.py | 11 + .../pip/_internal/req/req_file.py | 14 +- .../pip/_internal/req/req_install.py | 25 +- .../pip/_internal/req/req_set.py | 135 +- .../pip/_internal/req/req_uninstall.py | 27 +- .../__pycache__/__init__.cpython-310.pyc | Bin 197 -> 197 bytes .../__pycache__/base.cpython-310.pyc | Bin 1049 -> 1049 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 204 -> 204 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 12291 -> 14952 bytes .../_internal/resolution/legacy/resolver.py | 139 +- .../__pycache__/__init__.cpython-310.pyc | Bin 208 -> 208 bytes .../__pycache__/base.cpython-310.pyc | Bin 6451 -> 6451 bytes .../__pycache__/candidates.cpython-310.pyc | Bin 18362 -> 18592 bytes .../__pycache__/factory.cpython-310.pyc | Bin 19216 -> 19072 bytes .../found_candidates.cpython-310.pyc | Bin 4868 -> 4868 bytes .../__pycache__/provider.cpython-310.pyc | Bin 7710 -> 7709 bytes .../__pycache__/reporter.cpython-310.pyc | Bin 3177 -> 3177 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 7466 -> 7466 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 8228 -> 8181 bytes .../resolution/resolvelib/candidates.py | 21 +- .../resolution/resolvelib/factory.py | 22 +- .../resolution/resolvelib/provider.py | 2 +- .../resolution/resolvelib/resolver.py | 2 - .../pip/_internal/self_outdated_check.py | 232 +- .../__pycache__/__init__.cpython-310.pyc | Bin 192 -> 192 bytes .../utils/__pycache__/_log.cpython-310.pyc | Bin 1520 -> 1520 bytes .../utils/__pycache__/appdirs.cpython-310.pyc | Bin 1618 -> 1618 bytes .../utils/__pycache__/compat.cpython-310.pyc | Bin 1508 -> 1508 bytes .../compatibility_tags.cpython-310.pyc | Bin 4077 -> 4077 bytes .../__pycache__/datetime.cpython-310.pyc | Bin 515 -> 515 bytes .../__pycache__/deprecation.cpython-310.pyc | Bin 3317 -> 3317 bytes .../direct_url_helpers.cpython-310.pyc | Bin 2083 -> 2083 bytes .../distutils_args.cpython-310.pyc | Bin 1099 -> 1057 bytes .../__pycache__/egg_link.cpython-310.pyc | Bin 2148 -> 2148 bytes .../__pycache__/encoding.cpython-310.pyc | Bin 1305 -> 1305 bytes .../__pycache__/entrypoints.cpython-310.pyc | Bin 1302 -> 2643 bytes .../__pycache__/filesystem.cpython-310.pyc | Bin 5160 -> 4481 bytes .../__pycache__/filetypes.cpython-310.pyc | Bin 942 -> 942 bytes .../utils/__pycache__/glibc.cpython-310.pyc | Bin 1671 -> 1671 bytes .../utils/__pycache__/hashes.cpython-310.pyc | Bin 5194 -> 5194 bytes .../inject_securetransport.cpython-310.pyc | Bin 987 -> 987 bytes .../utils/__pycache__/logging.cpython-310.pyc | Bin 9633 -> 9719 bytes .../utils/__pycache__/misc.cpython-310.pyc | Bin 18715 -> 21598 bytes .../utils/__pycache__/models.cpython-310.pyc | Bin 1988 -> 1988 bytes .../__pycache__/packaging.cpython-310.pyc | Bin 2080 -> 2080 bytes .../setuptools_build.cpython-310.pyc | Bin 4595 -> 4595 bytes .../__pycache__/subprocess.cpython-310.pyc | Bin 5774 -> 5768 bytes .../__pycache__/temp_dir.cpython-310.pyc | Bin 7297 -> 7315 bytes .../__pycache__/unpacking.cpython-310.pyc | Bin 6666 -> 6666 bytes .../utils/__pycache__/urls.cpython-310.pyc | Bin 1593 -> 1593 bytes .../__pycache__/virtualenv.cpython-310.pyc | Bin 3288 -> 3288 bytes .../utils/__pycache__/wheel.cpython-310.pyc | Bin 4413 -> 4413 bytes .../pip/_internal/utils/distutils_args.py | 51 +- .../pip/_internal/utils/encoding.py | 2 +- .../pip/_internal/utils/entrypoints.py | 52 + .../pip/_internal/utils/filesystem.py | 33 +- .../pip/_internal/utils/hashes.py | 4 +- .../pip/_internal/utils/logging.py | 25 +- .../site-packages/pip/_internal/utils/misc.py | 104 +- .../pip/_internal/utils/subprocess.py | 4 +- .../pip/_internal/utils/temp_dir.py | 8 +- .../pip/_internal/utils/unpacking.py | 3 +- .../vcs/__pycache__/__init__.cpython-310.pyc | Bin 515 -> 515 bytes .../vcs/__pycache__/bazaar.cpython-310.pyc | Bin 3342 -> 3342 bytes .../vcs/__pycache__/git.cpython-310.pyc | Bin 12545 -> 12545 bytes .../vcs/__pycache__/mercurial.cpython-310.pyc | Bin 5061 -> 5061 bytes .../__pycache__/subversion.cpython-310.pyc | Bin 8449 -> 8449 bytes .../versioncontrol.cpython-310.pyc | Bin 21144 -> 21144 bytes .../pip/_internal/wheel_builder.py | 6 + .../Lib/site-packages/pip/_vendor/__init__.py | 11 +- .../__pycache__/__init__.cpython-310.pyc | Bin 2915 -> 3128 bytes .../_vendor/__pycache__/six.cpython-310.pyc | Bin 27586 -> 27586 bytes .../typing_extensions.cpython-310.pyc | Bin 66598 -> 60726 bytes .../pip/_vendor/cachecontrol/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 643 -> 643 bytes .../__pycache__/_cmd.cpython-310.pyc | Bin 1581 -> 1581 bytes .../__pycache__/adapter.cpython-310.pyc | Bin 3157 -> 3157 bytes .../__pycache__/cache.cpython-310.pyc | Bin 1847 -> 2691 bytes .../__pycache__/compat.cpython-310.pyc | Bin 757 -> 757 bytes .../__pycache__/controller.cpython-310.pyc | Bin 8217 -> 8597 bytes .../__pycache__/filewrapper.cpython-310.pyc | Bin 2793 -> 2793 bytes .../__pycache__/heuristics.cpython-310.pyc | Bin 4717 -> 4717 bytes .../__pycache__/serialize.cpython-310.pyc | Bin 4252 -> 4332 bytes .../__pycache__/wrapper.cpython-310.pyc | Bin 688 -> 688 bytes .../pip/_vendor/cachecontrol/cache.py | 22 + .../_vendor/cachecontrol/caches/__init__.py | 7 +- .../__pycache__/__init__.cpython-310.pyc | Bin 294 -> 362 bytes .../__pycache__/file_cache.cpython-310.pyc | Bin 3368 -> 4962 bytes .../__pycache__/redis_cache.cpython-310.pyc | Bin 1574 -> 1620 bytes .../_vendor/cachecontrol/caches/file_cache.py | 52 +- .../cachecontrol/caches/redis_cache.py | 4 +- .../pip/_vendor/cachecontrol/controller.py | 60 +- .../pip/_vendor/cachecontrol/serialize.py | 30 +- .../pip/_vendor/certifi/__init__.py | 3 +- .../__pycache__/__init__.cpython-310.pyc | Bin 276 -> 305 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 455 -> 455 bytes .../certifi/__pycache__/core.cpython-310.pyc | Bin 1550 -> 1799 bytes .../pip/_vendor/certifi/cacert.pem | 847 +- .../site-packages/pip/_vendor/certifi/core.py | 22 +- .../pip/_vendor/chardet/__init__.py | 72 +- .../__pycache__/__init__.cpython-310.pyc | Bin 1900 -> 2382 bytes .../__pycache__/big5freq.cpython-310.pyc | Bin 27179 -> 27179 bytes .../__pycache__/big5prober.cpython-310.pyc | Bin 1130 -> 1121 bytes .../chardistribution.cpython-310.pyc | Bin 5740 -> 6224 bytes .../charsetgroupprober.cpython-310.pyc | Bin 2229 -> 2215 bytes .../__pycache__/charsetprober.cpython-310.pyc | Bin 3483 -> 3403 bytes .../codingstatemachine.cpython-310.pyc | Bin 2902 -> 2888 bytes .../__pycache__/compat.cpython-310.pyc | Bin 401 -> 0 bytes .../__pycache__/cp949prober.cpython-310.pyc | Bin 1137 -> 1128 bytes .../chardet/__pycache__/enums.cpython-310.pyc | Bin 2584 -> 2564 bytes .../__pycache__/escprober.cpython-310.pyc | Bin 2631 -> 2609 bytes .../chardet/__pycache__/escsm.cpython-310.pyc | Bin 8378 -> 8378 bytes .../__pycache__/eucjpprober.cpython-310.pyc | Bin 2435 -> 2412 bytes .../__pycache__/euckrfreq.cpython-310.pyc | Bin 12063 -> 12063 bytes .../__pycache__/euckrprober.cpython-310.pyc | Bin 1138 -> 1129 bytes .../__pycache__/euctwfreq.cpython-310.pyc | Bin 27183 -> 27183 bytes .../__pycache__/euctwprober.cpython-310.pyc | Bin 1138 -> 1129 bytes .../__pycache__/gb2312freq.cpython-310.pyc | Bin 19107 -> 19107 bytes .../__pycache__/gb2312prober.cpython-310.pyc | Bin 1146 -> 1137 bytes .../__pycache__/hebrewprober.cpython-310.pyc | Bin 3023 -> 3020 bytes .../__pycache__/jisfreq.cpython-310.pyc | Bin 22135 -> 22135 bytes .../__pycache__/johabfreq.cpython-310.pyc} | Bin 161262 -> 138759 bytes .../__pycache__/johabprober.cpython-310.pyc | Bin 0 -> 1128 bytes .../__pycache__/jpcntx.cpython-310.pyc | Bin 37642 -> 37631 bytes .../langbulgarianmodel.cpython-310.pyc | Bin 47923 -> 47927 bytes .../langgreekmodel.cpython-310.pyc | Bin 46113 -> 46117 bytes .../langhebrewmodel.cpython-310.pyc | Bin 44562 -> 44564 bytes .../langhungarianmodel.cpython-310.pyc | Bin 47883 -> 47887 bytes .../langrussianmodel.cpython-310.pyc | Bin 61016 -> 61028 bytes .../__pycache__/langthaimodel.cpython-310.pyc | Bin 44738 -> 44740 bytes .../langturkishmodel.cpython-310.pyc | Bin 44579 -> 44581 bytes .../__pycache__/latin1prober.cpython-310.pyc | Bin 4429 -> 4405 bytes .../mbcharsetprober.cpython-310.pyc | Bin 2250 -> 2231 bytes .../mbcsgroupprober.cpython-310.pyc | Bin 1133 -> 1182 bytes .../__pycache__/mbcssm.cpython-310.pyc | Bin 18760 -> 20705 bytes .../sbcharsetprober.cpython-310.pyc | Bin 3079 -> 3198 bytes .../sbcsgroupprober.cpython-310.pyc | Bin 1702 -> 1721 bytes .../__pycache__/sjisprober.cpython-310.pyc | Bin 2473 -> 2450 bytes .../universaldetector.cpython-310.pyc | Bin 5825 -> 6467 bytes .../__pycache__/utf1632prober.cpython-310.pyc | Bin 0 -> 5881 bytes .../__pycache__/utf8prober.cpython-310.pyc | Bin 1982 -> 1964 bytes .../__pycache__/version.cpython-310.pyc | Bin 439 -> 439 bytes .../pip/_vendor/chardet/big5freq.py | 6 +- .../pip/_vendor/chardet/big5prober.py | 6 +- .../pip/_vendor/chardet/chardistribution.py | 98 +- .../pip/_vendor/chardet/charsetgroupprober.py | 16 +- .../pip/_vendor/chardet/charsetprober.py | 47 +- .../pip/_vendor/chardet/cli/__init__.py | 1 - .../cli/__pycache__/__init__.cpython-310.pyc | Bin 196 -> 196 bytes .../__pycache__/chardetect.cpython-310.pyc | Bin 2695 -> 2404 bytes .../pip/_vendor/chardet/cli/chardetect.py | 52 +- .../pip/_vendor/chardet/codingstatemachine.py | 16 +- .../pip/_vendor/chardet/cp949prober.py | 2 +- .../pip/_vendor/chardet/enums.py | 18 +- .../pip/_vendor/chardet/escprober.py | 19 +- .../pip/_vendor/chardet/escsm.py | 384 +- .../pip/_vendor/chardet/eucjpprober.py | 41 +- .../pip/_vendor/chardet/euckrfreq.py | 3 +- .../pip/_vendor/chardet/euckrprober.py | 6 +- .../pip/_vendor/chardet/euctwfreq.py | 677 +- .../pip/_vendor/chardet/euctwprober.py | 7 +- .../pip/_vendor/chardet/gb2312freq.py | 3 +- .../pip/_vendor/chardet/gb2312prober.py | 7 +- .../pip/_vendor/chardet/hebrewprober.py | 68 +- .../pip/_vendor/chardet/jisfreq.py | 4 +- .../pip/_vendor/chardet/johabfreq.py | 2382 ++++++ .../chardet/{compat.py => johabprober.py} | 41 +- .../pip/_vendor/chardet/jpcntx.py | 190 +- .../pip/_vendor/chardet/langbulgarianmodel.py | 1061 ++- .../pip/_vendor/chardet/langgreekmodel.py | 1061 ++- .../pip/_vendor/chardet/langhebrewmodel.py | 533 +- .../pip/_vendor/chardet/langhungarianmodel.py | 1061 ++- .../pip/_vendor/chardet/langrussianmodel.py | 3173 ++++---- .../pip/_vendor/chardet/langthaimodel.py | 533 +- .../pip/_vendor/chardet/langturkishmodel.py | 533 +- .../pip/_vendor/chardet/latin1prober.py | 26 +- .../pip/_vendor/chardet/mbcharsetprober.py | 32 +- .../pip/_vendor/chardet/mbcsgroupprober.py | 20 +- .../pip/_vendor/chardet/mbcssm.py | 816 +- .../__pycache__/__init__.cpython-310.pyc | Bin 201 -> 201 bytes .../__pycache__/languages.cpython-310.pyc | Bin 7963 -> 7959 bytes .../pip/_vendor/chardet/metadata/languages.py | 571 +- .../pip/_vendor/chardet/sbcharsetprober.py | 73 +- .../pip/_vendor/chardet/sbcsgroupprober.py | 31 +- .../pip/_vendor/chardet/sjisprober.py | 46 +- .../pip/_vendor/chardet/universaldetector.py | 174 +- .../pip/_vendor/chardet/utf1632prober.py | 223 + .../pip/_vendor/chardet/utf8prober.py | 16 +- .../pip/_vendor/chardet/version.py | 4 +- .../pip/_vendor/colorama/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 444 -> 444 bytes .../colorama/__pycache__/ansi.cpython-310.pyc | Bin 3005 -> 3005 bytes .../__pycache__/ansitowin32.cpython-310.pyc | Bin 7903 -> 8207 bytes .../__pycache__/initialise.cpython-310.pyc | Bin 1691 -> 1691 bytes .../__pycache__/win32.cpython-310.pyc | Bin 3951 -> 3951 bytes .../__pycache__/winterm.cpython-310.pyc | Bin 4568 -> 4568 bytes .../pip/_vendor/colorama/ansitowin32.py | 10 +- .../pip/_vendor/distlib/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 1063 -> 1063 bytes .../__pycache__/compat.cpython-310.pyc | Bin 31537 -> 31409 bytes .../__pycache__/database.cpython-310.pyc | Bin 42617 -> 43149 bytes .../distlib/__pycache__/index.cpython-310.pyc | Bin 17318 -> 17314 bytes .../__pycache__/locators.cpython-310.pyc | Bin 38384 -> 38371 bytes .../__pycache__/manifest.cpython-310.pyc | Bin 10231 -> 10231 bytes .../__pycache__/markers.cpython-310.pyc | Bin 4955 -> 5037 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 26563 -> 26788 bytes .../__pycache__/resources.cpython-310.pyc | Bin 11037 -> 11037 bytes .../__pycache__/scripts.cpython-310.pyc | Bin 11255 -> 11503 bytes .../distlib/__pycache__/util.cpython-310.pyc | Bin 52575 -> 51698 bytes .../__pycache__/version.cpython-310.pyc | Bin 20152 -> 20152 bytes .../distlib/__pycache__/wheel.cpython-310.pyc | Bin 27310 -> 28132 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 - .../__pycache__/__init__.cpython-310.pyc | Bin 484 -> 0 bytes .../__pycache__/misc.cpython-310.pyc | Bin 1106 -> 0 bytes .../__pycache__/shutil.cpython-310.pyc | Bin 21543 -> 0 bytes .../__pycache__/sysconfig.cpython-310.pyc | Bin 15898 -> 0 bytes .../__pycache__/tarfile.cpython-310.pyc | Bin 62481 -> 0 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 - .../pip/_vendor/distlib/_backport/shutil.py | 764 -- .../_vendor/distlib/_backport/sysconfig.cfg | 84 - .../_vendor/distlib/_backport/sysconfig.py | 786 -- .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ------- .../pip/_vendor/distlib/compat.py | 28 +- .../pip/_vendor/distlib/database.py | 67 +- .../pip/_vendor/distlib/index.py | 13 +- .../pip/_vendor/distlib/locators.py | 6 +- .../pip/_vendor/distlib/markers.py | 9 +- .../pip/_vendor/distlib/metadata.py | 48 +- .../pip/_vendor/distlib/scripts.py | 10 +- .../site-packages/pip/_vendor/distlib/t32.exe | Bin 96768 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 180736 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 105984 -> 107520 bytes .../site-packages/pip/_vendor/distlib/util.py | 81 +- .../site-packages/pip/_vendor/distlib/w32.exe | Bin 90112 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 166400 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 99840 -> 101888 bytes .../pip/_vendor/distlib/wheel.py | 51 +- .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 916 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 270 bytes .../__pycache__/distro.cpython-310.pyc | Bin 38233 -> 41333 bytes .../pip/_vendor/{ => distro}/distro.py | 410 +- .../pip/_vendor/html5lib/__init__.py | 35 - .../__pycache__/__init__.cpython-310.pyc | Bin 1303 -> 0 bytes .../__pycache__/_ihatexml.cpython-310.pyc | Bin 13860 -> 0 bytes .../__pycache__/_inputstream.cpython-310.pyc | Bin 21679 -> 0 bytes .../__pycache__/_tokenizer.cpython-310.pyc | Bin 37361 -> 0 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 4797 -> 0 bytes .../__pycache__/html5parser.cpython-310.pyc | Bin 88520 -> 0 bytes .../__pycache__/serializer.cpython-310.pyc | Bin 10744 -> 0 bytes .../pip/_vendor/html5lib/_ihatexml.py | 289 - .../pip/_vendor/html5lib/_inputstream.py | 918 --- .../pip/_vendor/html5lib/_tokenizer.py | 1735 ---- .../pip/_vendor/html5lib/_trie/__init__.py | 5 - .../__pycache__/__init__.cpython-310.pyc | Bin 353 -> 0 bytes .../_trie/__pycache__/_base.cpython-310.pyc | Bin 1605 -> 0 bytes .../_trie/__pycache__/py.cpython-310.pyc | Bin 2268 -> 0 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 - .../pip/_vendor/html5lib/_trie/py.py | 67 - .../pip/_vendor/html5lib/_utils.py | 159 - .../pip/_vendor/html5lib/constants.py | 2946 ------- .../__pycache__/__init__.cpython-310.pyc | Bin 201 -> 0 bytes .../alphabeticalattributes.cpython-310.pyc | Bin 1331 -> 0 bytes .../filters/__pycache__/base.cpython-310.pyc | Bin 871 -> 0 bytes .../inject_meta_charset.cpython-310.pyc | Bin 1869 -> 0 bytes .../filters/__pycache__/lint.cpython-310.pyc | Bin 2577 -> 0 bytes .../__pycache__/optionaltags.cpython-310.pyc | Bin 2730 -> 0 bytes .../__pycache__/sanitizer.cpython-310.pyc | Bin 20035 -> 0 bytes .../__pycache__/whitespace.cpython-310.pyc | Bin 1377 -> 0 bytes .../filters/alphabeticalattributes.py | 29 - .../pip/_vendor/html5lib/filters/base.py | 12 - .../html5lib/filters/inject_meta_charset.py | 73 - .../pip/_vendor/html5lib/filters/lint.py | 93 - .../_vendor/html5lib/filters/optionaltags.py | 207 - .../pip/_vendor/html5lib/filters/sanitizer.py | 916 --- .../_vendor/html5lib/filters/whitespace.py | 38 - .../pip/_vendor/html5lib/html5parser.py | 2795 ------- .../pip/_vendor/html5lib/serializer.py | 409 - .../_vendor/html5lib/treeadapters/__init__.py | 30 - .../__pycache__/__init__.cpython-310.pyc | Bin 942 -> 0 bytes .../__pycache__/genshi.cpython-310.pyc | Bin 1554 -> 0 bytes .../__pycache__/sax.cpython-310.pyc | Bin 1461 -> 0 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 - .../pip/_vendor/html5lib/treeadapters/sax.py | 50 - .../_vendor/html5lib/treebuilders/__init__.py | 88 - .../__pycache__/__init__.cpython-310.pyc | Bin 3333 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 11326 -> 0 bytes .../__pycache__/dom.cpython-310.pyc | Bin 9413 -> 0 bytes .../__pycache__/etree.cpython-310.pyc | Bin 11713 -> 0 bytes .../__pycache__/etree_lxml.cpython-310.pyc | Bin 13032 -> 0 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 - .../pip/_vendor/html5lib/treebuilders/dom.py | 239 - .../_vendor/html5lib/treebuilders/etree.py | 343 - .../html5lib/treebuilders/etree_lxml.py | 392 - .../_vendor/html5lib/treewalkers/__init__.py | 154 - .../__pycache__/__init__.cpython-310.pyc | Bin 3983 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 6944 -> 0 bytes .../__pycache__/dom.cpython-310.pyc | Bin 1715 -> 0 bytes .../__pycache__/etree.cpython-310.pyc | Bin 3473 -> 0 bytes .../__pycache__/etree_lxml.cpython-310.pyc | Bin 6560 -> 0 bytes .../__pycache__/genshi.cpython-310.pyc | Bin 1921 -> 0 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 - .../pip/_vendor/html5lib/treewalkers/dom.py | 43 - .../pip/_vendor/html5lib/treewalkers/etree.py | 131 - .../html5lib/treewalkers/etree_lxml.py | 215 - .../_vendor/html5lib/treewalkers/genshi.py | 69 - .../idna/__pycache__/__init__.cpython-310.pyc | Bin 848 -> 848 bytes .../idna/__pycache__/codec.cpython-310.pyc | Bin 2819 -> 2819 bytes .../idna/__pycache__/compat.cpython-310.pyc | Bin 748 -> 748 bytes .../idna/__pycache__/core.cpython-310.pyc | Bin 9591 -> 9591 bytes .../idna/__pycache__/idnadata.cpython-310.pyc | Bin 38226 -> 38226 bytes .../__pycache__/intranges.cpython-310.pyc | Bin 1985 -> 1985 bytes .../__pycache__/package_data.cpython-310.pyc | Bin 212 -> 212 bytes .../__pycache__/uts46data.cpython-310.pyc | Bin 150947 -> 150947 bytes .../pip/_vendor/msgpack/__init__.py | 5 +- .../__pycache__/__init__.cpython-310.pyc | Bin 1428 -> 1446 bytes .../__pycache__/_version.cpython-310.pyc | Bin 219 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 1809 -> 1809 bytes .../msgpack/__pycache__/ext.cpython-310.pyc | Bin 6317 -> 6317 bytes .../__pycache__/fallback.cpython-310.pyc | Bin 25446 -> 25484 bytes .../pip/_vendor/msgpack/_version.py | 1 - .../site-packages/pip/_vendor/msgpack/ext.py | 8 +- .../pip/_vendor/msgpack/fallback.py | 18 +- .../__pycache__/__about__.cpython-310.pyc | Bin 591 -> 591 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 447 -> 447 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 7301 -> 7301 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 4613 -> 4613 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 2706 -> 2706 bytes .../__pycache__/markers.cpython-310.pyc | Bin 9290 -> 9290 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 3976 -> 3976 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 21528 -> 21528 bytes .../__pycache__/tags.cpython-310.pyc | Bin 12197 -> 12197 bytes .../__pycache__/utils.cpython-310.pyc | Bin 3576 -> 3576 bytes .../__pycache__/version.cpython-310.pyc | Bin 12926 -> 12926 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 314 -> 314 bytes .../pep517/__pycache__/build.cpython-310.pyc | Bin 3597 -> 3597 bytes .../pep517/__pycache__/check.cpython-310.pyc | Bin 4561 -> 4561 bytes .../__pycache__/colorlog.cpython-310.pyc | Bin 2965 -> 2965 bytes .../pep517/__pycache__/compat.cpython-310.pyc | Bin 1538 -> 1538 bytes .../__pycache__/dirtools.cpython-310.pyc | Bin 1356 -> 1356 bytes .../__pycache__/envbuild.cpython-310.pyc | Bin 4379 -> 4379 bytes .../pep517/__pycache__/meta.cpython-310.pyc | Bin 2961 -> 2961 bytes .../__pycache__/wrappers.cpython-310.pyc | Bin 12307 -> 12307 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 922 -> 922 bytes .../__pycache__/_in_process.cpython-310.pyc | Bin 10069 -> 10069 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 99891 -> 99891 bytes .../__pycache__/py31compat.cpython-310.pyc | Bin 661 -> 661 bytes .../pip/_vendor/platformdirs/__init__.py | 27 +- .../__pycache__/__init__.cpython-310.pyc | Bin 10477 -> 10529 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 1237 -> 1237 bytes .../__pycache__/android.cpython-310.pyc | Bin 4269 -> 4327 bytes .../__pycache__/api.cpython-310.pyc | Bin 5203 -> 5203 bytes .../__pycache__/macos.cpython-310.pyc | Bin 3191 -> 3191 bytes .../__pycache__/unix.cpython-310.pyc | Bin 6892 -> 6892 bytes .../__pycache__/version.cpython-310.pyc | Bin 296 -> 294 bytes .../__pycache__/windows.cpython-310.pyc | Bin 6435 -> 6435 bytes .../pip/_vendor/platformdirs/android.py | 15 +- .../pip/_vendor/platformdirs/version.py | 6 +- .../pip/_vendor/progress/__init__.py | 189 - .../__pycache__/__init__.cpython-310.pyc | Bin 5733 -> 0 bytes .../progress/__pycache__/bar.cpython-310.pyc | Bin 2696 -> 0 bytes .../__pycache__/colors.cpython-310.pyc | Bin 1489 -> 0 bytes .../__pycache__/counter.cpython-310.pyc | Bin 1560 -> 0 bytes .../__pycache__/spinner.cpython-310.pyc | Bin 1390 -> 0 bytes .../site-packages/pip/_vendor/progress/bar.py | 93 - .../pip/_vendor/progress/colors.py | 79 - .../pip/_vendor/progress/counter.py | 47 - .../pip/_vendor/progress/spinner.py | 45 - .../pip/_vendor/pygments/__init__.py | 4 +- .../pip/_vendor/pygments/__main__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 3001 -> 3001 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 589 -> 589 bytes .../__pycache__/cmdline.cpython-310.pyc | Bin 15454 -> 15454 bytes .../__pycache__/console.cpython-310.pyc | Bin 1884 -> 1884 bytes .../__pycache__/filter.cpython-310.pyc | Bin 2655 -> 2655 bytes .../__pycache__/formatter.cpython-310.pyc | Bin 3011 -> 3011 bytes .../__pycache__/lexer.cpython-310.pyc | Bin 24367 -> 24374 bytes .../__pycache__/modeline.cpython-310.pyc | Bin 1193 -> 1193 bytes .../__pycache__/plugin.cpython-310.pyc | Bin 2045 -> 2045 bytes .../__pycache__/regexopt.cpython-310.pyc | Bin 2957 -> 2957 bytes .../__pycache__/scanner.cpython-310.pyc | Bin 3558 -> 3559 bytes .../__pycache__/sphinxext.cpython-310.pyc | Bin 4543 -> 4543 bytes .../__pycache__/style.cpython-310.pyc | Bin 4580 -> 4580 bytes .../__pycache__/token.cpython-310.pyc | Bin 4652 -> 4652 bytes .../__pycache__/unistring.cpython-310.pyc | Bin 31206 -> 31206 bytes .../pygments/__pycache__/util.cpython-310.pyc | Bin 9163 -> 9148 bytes .../pip/_vendor/pygments/cmdline.py | 4 +- .../pip/_vendor/pygments/console.py | 2 +- .../pip/_vendor/pygments/filter.py | 2 +- .../pip/_vendor/pygments/filters/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 29518 -> 29518 bytes .../pip/_vendor/pygments/formatter.py | 2 +- .../_vendor/pygments/formatters/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 4669 -> 4669 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 5536 -> 5537 bytes .../__pycache__/bbcode.cpython-310.pyc | Bin 3086 -> 3086 bytes .../__pycache__/groff.cpython-310.pyc | Bin 4359 -> 4399 bytes .../__pycache__/html.cpython-310.pyc | Bin 29072 -> 29133 bytes .../__pycache__/img.cpython-310.pyc | Bin 17498 -> 17498 bytes .../__pycache__/irc.cpython-310.pyc | Bin 4589 -> 4589 bytes .../__pycache__/latex.cpython-310.pyc | Bin 13495 -> 13799 bytes .../__pycache__/other.cpython-310.pyc | Bin 4805 -> 4805 bytes .../__pycache__/pangomarkup.cpython-310.pyc | Bin 2105 -> 2105 bytes .../__pycache__/rtf.cpython-310.pyc | Bin 4135 -> 4135 bytes .../__pycache__/svg.cpython-310.pyc | Bin 6333 -> 6333 bytes .../__pycache__/terminal.cpython-310.pyc | Bin 4000 -> 4000 bytes .../__pycache__/terminal256.cpython-310.pyc | Bin 9250 -> 9250 bytes .../_vendor/pygments/formatters/_mapping.py | 6 +- .../pip/_vendor/pygments/formatters/bbcode.py | 2 +- .../pip/_vendor/pygments/formatters/groff.py | 4 +- .../pip/_vendor/pygments/formatters/html.py | 44 +- .../pip/_vendor/pygments/formatters/img.py | 2 +- .../pip/_vendor/pygments/formatters/irc.py | 2 +- .../pip/_vendor/pygments/formatters/latex.py | 38 +- .../pip/_vendor/pygments/formatters/other.py | 2 +- .../pygments/formatters/pangomarkup.py | 2 +- .../pip/_vendor/pygments/formatters/rtf.py | 2 +- .../pip/_vendor/pygments/formatters/svg.py | 2 +- .../_vendor/pygments/formatters/terminal.py | 2 +- .../pygments/formatters/terminal256.py | 2 +- .../pip/_vendor/pygments/lexer.py | 11 +- .../pip/_vendor/pygments/lexers/__init__.py | 12 +- .../__pycache__/__init__.cpython-310.pyc | Bin 9185 -> 9355 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 58123 -> 60150 bytes .../lexers/__pycache__/python.cpython-310.pyc | Bin 29384 -> 29358 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 38 +- .../pip/_vendor/pygments/lexers/python.py | 21 +- .../pip/_vendor/pygments/modeline.py | 2 +- .../pip/_vendor/pygments/plugin.py | 2 +- .../pip/_vendor/pygments/regexopt.py | 2 +- .../pip/_vendor/pygments/scanner.py | 4 +- .../pip/_vendor/pygments/sphinxext.py | 2 +- .../pip/_vendor/pygments/style.py | 2 +- .../pip/_vendor/pygments/styles/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 3221 -> 3221 bytes .../pip/_vendor/pygments/token.py | 2 +- .../pip/_vendor/pygments/unistring.py | 4 +- .../pip/_vendor/pygments/util.py | 4 +- .../pip/_vendor/pyparsing/__init__.py | 25 +- .../__pycache__/__init__.cpython-310.pyc | Bin 7126 -> 7130 bytes .../__pycache__/actions.cpython-310.pyc | Bin 7183 -> 7180 bytes .../__pycache__/common.cpython-310.pyc | Bin 10106 -> 10106 bytes .../__pycache__/core.cpython-310.pyc | Bin 175300 -> 176521 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 9073 -> 9064 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 34768 -> 35341 bytes .../__pycache__/results.cpython-310.pyc | Bin 24786 -> 24788 bytes .../__pycache__/testing.cpython-310.pyc | Bin 12103 -> 12100 bytes .../__pycache__/unicode.cpython-310.pyc | Bin 9815 -> 10059 bytes .../__pycache__/util.cpython-310.pyc | Bin 8606 -> 8606 bytes .../pip/_vendor/pyparsing/actions.py | 2 +- .../pip/_vendor/pyparsing/core.py | 281 +- .../pip/_vendor/pyparsing/diagram/__init__.py | 81 +- .../__pycache__/__init__.cpython-310.pyc | Bin 15658 -> 16594 bytes .../pip/_vendor/pyparsing/exceptions.py | 4 +- .../pip/_vendor/pyparsing/helpers.py | 67 +- .../pip/_vendor/pyparsing/results.py | 26 +- .../pip/_vendor/pyparsing/testing.py | 10 +- .../pip/_vendor/pyparsing/unicode.py | 30 +- .../pip/_vendor/requests/__init__.py | 94 +- .../__pycache__/__init__.cpython-310.pyc | Bin 4039 -> 4017 bytes .../__pycache__/__version__.cpython-310.pyc | Bin 556 -> 556 bytes .../_internal_utils.cpython-310.pyc | Bin 1308 -> 1566 bytes .../__pycache__/adapters.cpython-310.pyc | Bin 17044 -> 16900 bytes .../requests/__pycache__/api.cpython-310.pyc | Bin 6655 -> 6655 bytes .../requests/__pycache__/auth.cpython-310.pyc | Bin 8098 -> 8123 bytes .../__pycache__/certs.cpython-310.pyc | Bin 640 -> 640 bytes .../__pycache__/compat.cpython-310.pyc | Bin 1675 -> 1372 bytes .../__pycache__/cookies.cpython-310.pyc | Bin 18700 -> 18698 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 5249 -> 5742 bytes .../requests/__pycache__/help.cpython-310.pyc | Bin 2908 -> 2868 bytes .../__pycache__/hooks.cpython-310.pyc | Bin 995 -> 995 bytes .../__pycache__/models.cpython-310.pyc | Bin 24314 -> 24268 bytes .../__pycache__/packages.cpython-310.pyc | Bin 509 -> 509 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 19630 -> 19587 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 4672 -> 4674 bytes .../__pycache__/structures.cpython-310.pyc | Bin 4454 -> 4439 bytes .../__pycache__/utils.cpython-310.pyc | Bin 24397 -> 24337 bytes .../pip/_vendor/requests/__version__.py | 20 +- .../pip/_vendor/requests/_internal_utils.py | 24 +- .../pip/_vendor/requests/adapters.py | 232 +- .../site-packages/pip/_vendor/requests/api.py | 18 +- .../pip/_vendor/requests/auth.py | 156 +- .../pip/_vendor/requests/certs.py | 3 +- .../pip/_vendor/requests/compat.py | 90 +- .../pip/_vendor/requests/cookies.py | 152 +- .../pip/_vendor/requests/exceptions.py | 22 +- .../pip/_vendor/requests/help.py | 101 +- .../pip/_vendor/requests/hooks.py | 7 +- .../pip/_vendor/requests/models.py | 347 +- .../pip/_vendor/requests/sessions.py | 276 +- .../pip/_vendor/requests/status_codes.py | 169 +- .../pip/_vendor/requests/structures.py | 12 +- .../pip/_vendor/requests/utils.py | 388 +- .../__pycache__/__init__.cpython-310.pyc | Bin 607 -> 607 bytes .../__pycache__/providers.cpython-310.pyc | Bin 6658 -> 6658 bytes .../__pycache__/reporters.cpython-310.pyc | Bin 2578 -> 2578 bytes .../__pycache__/resolvers.cpython-310.pyc | Bin 15131 -> 15131 bytes .../__pycache__/structs.cpython-310.pyc | Bin 7164 -> 7164 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 202 -> 202 bytes .../collections_abc.cpython-310.pyc | Bin 378 -> 378 bytes .../pip/_vendor/rich/__init__.py | 12 +- .../pip/_vendor/rich/__main__.py | 20 +- .../rich/__pycache__/__init__.cpython-310.pyc | Bin 5892 -> 5975 bytes .../rich/__pycache__/__main__.cpython-310.pyc | Bin 7326 -> 7297 bytes .../__pycache__/_cell_widths.cpython-310.pyc | Bin 7815 -> 7815 bytes .../__pycache__/_emoji_codes.cpython-310.pyc | Bin 360055 -> 360055 bytes .../_emoji_replace.cpython-310.pyc | Bin 1195 -> 1195 bytes .../_export_format.cpython-310.pyc | Bin 0 -> 2312 bytes .../__pycache__/_extension.cpython-310.pyc | Bin 496 -> 496 bytes .../rich/__pycache__/_inspect.cpython-310.pyc | Bin 6613 -> 8673 bytes .../__pycache__/_log_render.cpython-310.pyc | Bin 2641 -> 2641 bytes .../rich/__pycache__/_loop.cpython-310.pyc | Bin 1293 -> 1293 bytes .../__pycache__/_lru_cache.cpython-310.pyc | Bin 1576 -> 0 bytes .../__pycache__/_palettes.cpython-310.pyc | Bin 5098 -> 5098 bytes .../rich/__pycache__/_pick.cpython-310.pyc | Bin 641 -> 641 bytes .../rich/__pycache__/_ratio.cpython-310.pyc | Bin 5160 -> 5160 bytes .../__pycache__/_spinners.cpython-310.pyc | Bin 15214 -> 12272 bytes .../rich/__pycache__/_stack.cpython-310.pyc | Bin 839 -> 839 bytes .../rich/__pycache__/_timer.cpython-310.pyc | Bin 688 -> 688 bytes .../_win32_console.cpython-310.pyc | Bin 0 -> 19008 bytes .../rich/__pycache__/_windows.cpython-310.pyc | Bin 1879 -> 1790 bytes .../_windows_renderer.cpython-310.pyc | Bin 0 -> 2044 bytes .../rich/__pycache__/_wrap.cpython-310.pyc | Bin 1517 -> 1552 bytes .../rich/__pycache__/abc.cpython-310.pyc | Bin 1315 -> 1315 bytes .../rich/__pycache__/align.cpython-310.pyc | Bin 7969 -> 7950 bytes .../rich/__pycache__/ansi.cpython-310.pyc | Bin 6018 -> 5957 bytes .../rich/__pycache__/bar.cpython-310.pyc | Bin 2984 -> 2984 bytes .../rich/__pycache__/box.cpython-310.pyc | Bin 7758 -> 8404 bytes .../rich/__pycache__/cells.cpython-310.pyc | Bin 3500 -> 3974 bytes .../rich/__pycache__/color.cpython-310.pyc | Bin 16756 -> 17462 bytes .../__pycache__/color_triplet.cpython-310.pyc | Bin 1438 -> 1438 bytes .../rich/__pycache__/columns.cpython-310.pyc | Bin 6198 -> 6198 bytes .../rich/__pycache__/console.cpython-310.pyc | Bin 70445 -> 80958 bytes .../__pycache__/constrain.cpython-310.pyc | Bin 1755 -> 1755 bytes .../__pycache__/containers.cpython-310.pyc | Bin 6487 -> 6487 bytes .../rich/__pycache__/control.cpython-310.pyc | Bin 6830 -> 8160 bytes .../default_styles.cpython-310.pyc | Bin 6030 -> 6199 bytes .../rich/__pycache__/diagnose.cpython-310.pyc | Bin 356 -> 1222 bytes .../rich/__pycache__/emoji.cpython-310.pyc | Bin 3268 -> 3268 bytes .../rich/__pycache__/errors.cpython-310.pyc | Bin 1528 -> 1528 bytes .../__pycache__/file_proxy.cpython-310.pyc | Bin 2265 -> 2261 bytes .../rich/__pycache__/filesize.cpython-310.pyc | Bin 2617 -> 2617 bytes .../__pycache__/highlighter.cpython-310.pyc | Bin 5344 -> 8061 bytes .../rich/__pycache__/json.cpython-310.pyc | Bin 4748 -> 4748 bytes .../rich/__pycache__/jupyter.cpython-310.pyc | Bin 3827 -> 4000 bytes .../rich/__pycache__/layout.cpython-310.pyc | Bin 14679 -> 14687 bytes .../rich/__pycache__/live.cpython-310.pyc | Bin 11569 -> 11625 bytes .../__pycache__/live_render.cpython-310.pyc | Bin 3403 -> 3403 bytes .../rich/__pycache__/logging.cpython-310.pyc | Bin 9297 -> 9774 bytes .../rich/__pycache__/markup.cpython-310.pyc | Bin 5914 -> 5942 bytes .../rich/__pycache__/measure.cpython-310.pyc | Bin 5059 -> 5077 bytes .../rich/__pycache__/padding.cpython-310.pyc | Bin 4483 -> 4483 bytes .../rich/__pycache__/pager.cpython-310.pyc | Bin 1496 -> 1477 bytes .../rich/__pycache__/palette.cpython-310.pyc | Bin 3709 -> 3709 bytes .../rich/__pycache__/panel.cpython-310.pyc | Bin 6392 -> 6420 bytes .../rich/__pycache__/pretty.cpython-310.pyc | Bin 25110 -> 27404 bytes .../rich/__pycache__/progress.cpython-310.pyc | Bin 33338 -> 53903 bytes .../__pycache__/progress_bar.cpython-310.pyc | Bin 6708 -> 6908 bytes .../rich/__pycache__/prompt.cpython-310.pyc | Bin 11302 -> 11302 bytes .../rich/__pycache__/protocol.cpython-310.pyc | Bin 1372 -> 1353 bytes .../rich/__pycache__/region.cpython-310.pyc | Bin 528 -> 528 bytes .../rich/__pycache__/repr.cpython-310.pyc | Bin 4041 -> 4116 bytes .../rich/__pycache__/rule.cpython-310.pyc | Bin 3738 -> 4310 bytes .../rich/__pycache__/scope.cpython-310.pyc | Bin 2989 -> 2989 bytes .../rich/__pycache__/screen.cpython-310.pyc | Bin 1880 -> 1880 bytes .../rich/__pycache__/segment.cpython-310.pyc | Bin 20570 -> 20758 bytes .../rich/__pycache__/spinner.cpython-310.pyc | Bin 4400 -> 4418 bytes .../rich/__pycache__/status.cpython-310.pyc | Bin 4594 -> 4594 bytes .../rich/__pycache__/style.cpython-310.pyc | Bin 20523 -> 20790 bytes .../rich/__pycache__/styled.cpython-310.pyc | Bin 1764 -> 1764 bytes .../rich/__pycache__/syntax.cpython-310.pyc | Bin 19039 -> 25363 bytes .../rich/__pycache__/table.cpython-310.pyc | Bin 26983 -> 29730 bytes .../rich/__pycache__/tabulate.cpython-310.pyc | Bin 1757 -> 0 bytes .../terminal_theme.cpython-310.pyc | Bin 1721 -> 3017 bytes .../rich/__pycache__/text.cpython-310.pyc | Bin 39297 -> 39421 bytes .../rich/__pycache__/theme.cpython-310.pyc | Bin 4701 -> 4701 bytes .../rich/__pycache__/themes.cpython-310.pyc | Bin 294 -> 294 bytes .../__pycache__/traceback.cpython-310.pyc | Bin 19540 -> 19650 bytes .../rich/__pycache__/tree.cpython-310.pyc | Bin 7318 -> 7335 bytes .../pip/_vendor/rich/_export_format.py | 78 + .../pip/_vendor/rich/_inspect.py | 104 +- .../pip/_vendor/rich/_lru_cache.py | 34 - .../pip/_vendor/rich/_spinners.py | 474 +- .../pip/_vendor/rich/_win32_console.py | 662 ++ .../pip/_vendor/rich/_windows.py | 34 +- .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 11 +- .../site-packages/pip/_vendor/rich/align.py | 1 - .../site-packages/pip/_vendor/rich/ansi.py | 51 +- .../Lib/site-packages/pip/_vendor/rich/box.py | 34 + .../site-packages/pip/_vendor/rich/cells.py | 55 +- .../site-packages/pip/_vendor/rich/color.py | 40 +- .../site-packages/pip/_vendor/rich/console.py | 531 +- .../site-packages/pip/_vendor/rich/control.py | 60 +- .../pip/_vendor/rich/default_styles.py | 7 +- .../pip/_vendor/rich/diagnose.py | 37 +- .../pip/_vendor/rich/file_proxy.py | 10 +- .../pip/_vendor/rich/filesize.py | 6 +- .../pip/_vendor/rich/highlighter.py | 109 +- .../site-packages/pip/_vendor/rich/jupyter.py | 19 +- .../site-packages/pip/_vendor/rich/layout.py | 3 +- .../site-packages/pip/_vendor/rich/live.py | 10 +- .../site-packages/pip/_vendor/rich/logging.py | 18 +- .../site-packages/pip/_vendor/rich/markup.py | 18 +- .../site-packages/pip/_vendor/rich/measure.py | 8 +- .../site-packages/pip/_vendor/rich/pager.py | 2 +- .../site-packages/pip/_vendor/rich/panel.py | 15 +- .../site-packages/pip/_vendor/rich/pretty.py | 169 +- .../pip/_vendor/rich/progress.py | 765 +- .../pip/_vendor/rich/progress_bar.py | 24 +- .../site-packages/pip/_vendor/rich/prompt.py | 4 +- .../pip/_vendor/rich/protocol.py | 2 +- .../site-packages/pip/_vendor/rich/repr.py | 37 +- .../site-packages/pip/_vendor/rich/rule.py | 37 +- .../site-packages/pip/_vendor/rich/segment.py | 157 +- .../site-packages/pip/_vendor/rich/spinner.py | 6 +- .../site-packages/pip/_vendor/rich/style.py | 90 +- .../site-packages/pip/_vendor/rich/syntax.py | 301 +- .../site-packages/pip/_vendor/rich/table.py | 32 +- .../pip/_vendor/rich/tabulate.py | 51 - .../pip/_vendor/rich/terminal_theme.py | 98 + .../site-packages/pip/_vendor/rich/text.py | 20 +- .../pip/_vendor/rich/traceback.py | 31 +- .../site-packages/pip/_vendor/rich/tree.py | 12 +- .../__pycache__/__init__.cpython-310.pyc | Bin 16375 -> 16375 bytes .../__pycache__/_asyncio.cpython-310.pyc | Bin 2615 -> 2615 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 1228 -> 1228 bytes .../__pycache__/after.cpython-310.pyc | Bin 1232 -> 1232 bytes .../__pycache__/before.cpython-310.pyc | Bin 1110 -> 1110 bytes .../__pycache__/before_sleep.cpython-310.pyc | Bin 1412 -> 1412 bytes .../tenacity/__pycache__/nap.cpython-310.pyc | Bin 1200 -> 1200 bytes .../__pycache__/retry.cpython-310.pyc | Bin 8430 -> 8430 bytes .../tenacity/__pycache__/stop.cpython-310.pyc | Bin 4018 -> 4018 bytes .../__pycache__/tornadoweb.cpython-310.pyc | Bin 1765 -> 1765 bytes .../tenacity/__pycache__/wait.cpython-310.pyc | Bin 7962 -> 7962 bytes .../pip/_vendor/tomli/__init__.py | 11 +- .../__pycache__/__init__.cpython-310.pyc | Bin 380 -> 356 bytes .../tomli/__pycache__/_parser.cpython-310.pyc | Bin 16334 -> 17070 bytes .../tomli/__pycache__/_re.cpython-310.pyc | Bin 2424 -> 2902 bytes .../tomli/__pycache__/_types.cpython-310.pyc | Bin 0 -> 326 bytes .../pip/_vendor/tomli/_parser.py | 372 +- .../site-packages/pip/_vendor/tomli/_re.py | 94 +- .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/typing_extensions.py | 1889 ++--- .../__pycache__/__init__.cpython-310.pyc | Bin 2190 -> 2190 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 10864 -> 10864 bytes .../__pycache__/_version.cpython-310.pyc | Bin 214 -> 215 bytes .../__pycache__/connection.cpython-310.pyc | Bin 13645 -> 13644 bytes .../connectionpool.cpython-310.pyc | Bin 25375 -> 25406 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 10995 -> 10995 bytes .../__pycache__/fields.cpython-310.pyc | Bin 8186 -> 8186 bytes .../__pycache__/filepost.cpython-310.pyc | Bin 2751 -> 2751 bytes .../__pycache__/poolmanager.cpython-310.pyc | Bin 15203 -> 15220 bytes .../__pycache__/request.cpython-310.pyc | Bin 5627 -> 5627 bytes .../__pycache__/response.cpython-310.pyc | Bin 20928 -> 20875 bytes .../pip/_vendor/urllib3/_version.py | 2 +- .../pip/_vendor/urllib3/connection.py | 8 +- .../pip/_vendor/urllib3/connectionpool.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 200 -> 200 bytes .../_appengine_environ.cpython-310.pyc | Bin 1380 -> 1380 bytes .../__pycache__/appengine.cpython-310.pyc | Bin 8196 -> 8196 bytes .../__pycache__/ntlmpool.cpython-310.pyc | Bin 3635 -> 3635 bytes .../__pycache__/pyopenssl.cpython-310.pyc | Bin 15539 -> 15539 bytes .../securetransport.cpython-310.pyc | Bin 21942 -> 21942 bytes .../contrib/__pycache__/socks.cpython-310.pyc | Bin 5602 -> 5602 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 217 -> 217 bytes .../__pycache__/bindings.cpython-310.pyc | Bin 10713 -> 10713 bytes .../__pycache__/low_level.cpython-310.pyc | Bin 9100 -> 9100 bytes .../pip/_vendor/urllib3/contrib/pyopenssl.py | 1 - .../urllib3/contrib/securetransport.py | 1 - .../__pycache__/__init__.cpython-310.pyc | Bin 201 -> 201 bytes .../packages/__pycache__/six.cpython-310.pyc | Bin 27661 -> 27661 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 211 -> 211 bytes .../__pycache__/makefile.cpython-310.pyc | Bin 1311 -> 1311 bytes .../pip/_vendor/urllib3/packages/six.py | 1 - .../pip/_vendor/urllib3/poolmanager.py | 1 + .../pip/_vendor/urllib3/response.py | 5 +- .../util/__pycache__/__init__.cpython-310.pyc | Bin 1110 -> 1110 bytes .../__pycache__/connection.cpython-310.pyc | Bin 3438 -> 3438 bytes .../util/__pycache__/proxy.cpython-310.pyc | Bin 1345 -> 1345 bytes .../util/__pycache__/queue.cpython-310.pyc | Bin 1065 -> 1065 bytes .../util/__pycache__/request.cpython-310.pyc | Bin 3473 -> 3372 bytes .../util/__pycache__/response.cpython-310.pyc | Bin 2358 -> 2358 bytes .../util/__pycache__/retry.cpython-310.pyc | Bin 16143 -> 16143 bytes .../util/__pycache__/ssl_.cpython-310.pyc | Bin 11312 -> 11312 bytes .../ssl_match_hostname.cpython-310.pyc | Bin 3282 -> 3262 bytes .../__pycache__/ssltransport.cpython-310.pyc | Bin 7400 -> 7400 bytes .../util/__pycache__/timeout.cpython-310.pyc | Bin 8942 -> 8942 bytes .../util/__pycache__/url.cpython-310.pyc | Bin 10685 -> 10698 bytes .../util/__pycache__/wait.cpython-310.pyc | Bin 3094 -> 3094 bytes .../pip/_vendor/urllib3/util/request.py | 6 - .../urllib3/util/ssl_match_hostname.py | 10 +- .../pip/_vendor/urllib3/util/url.py | 5 +- .../pip/_vendor/urllib3/util/wait.py | 1 - .../Lib/site-packages/pip/_vendor/vendor.txt | 32 +- .../__pycache__/__init__.cpython-310.pyc | Bin 9747 -> 9747 bytes .../__pycache__/labels.cpython-310.pyc | Bin 5237 -> 5237 bytes .../__pycache__/mklabels.cpython-310.pyc | Bin 1942 -> 1942 bytes .../__pycache__/tests.cpython-310.pyc | Bin 5044 -> 5044 bytes .../x_user_defined.cpython-310.pyc | Bin 2593 -> 2593 bytes .../Lib/site-packages/psycopg2/__init__.py | 126 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3314 bytes .../__pycache__/_ipaddress.cpython-310.pyc | Bin 0 -> 1997 bytes .../__pycache__/_json.cpython-310.pyc | Bin 0 -> 6209 bytes .../__pycache__/_range.cpython-310.pyc | Bin 0 -> 14186 bytes .../__pycache__/errorcodes.cpython-310.pyc | Bin 0 -> 12817 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 511 bytes .../__pycache__/extensions.cpython-310.pyc | Bin 0 -> 6251 bytes .../__pycache__/extras.cpython-310.pyc | Bin 0 -> 41789 bytes .../psycopg2/__pycache__/pool.cpython-310.pyc | Bin 0 -> 4905 bytes .../psycopg2/__pycache__/sql.cpython-310.pyc | Bin 0 -> 15017 bytes .../psycopg2/__pycache__/tz.cpython-310.pyc | Bin 0 -> 4487 bytes .../Lib/site-packages/psycopg2/_ipaddress.py | 90 + sbsheriff/Lib/site-packages/psycopg2/_json.py | 199 + .../psycopg2/_psycopg.cp310-win_amd64.pyd | Bin 0 -> 2440704 bytes .../Lib/site-packages/psycopg2/_range.py | 537 ++ .../Lib/site-packages/psycopg2/errorcodes.py | 448 ++ .../Lib/site-packages/psycopg2/errors.py | 38 + .../Lib/site-packages/psycopg2/extensions.py | 213 + .../Lib/site-packages/psycopg2/extras.py | 1306 ++++ sbsheriff/Lib/site-packages/psycopg2/pool.py | 187 + sbsheriff/Lib/site-packages/psycopg2/sql.py | 455 ++ sbsheriff/Lib/site-packages/psycopg2/tz.py | 158 + .../psycopg2_binary-2.9.3.dist-info/INSTALLER | 1 + .../psycopg2_binary-2.9.3.dist-info/LICENSE | 49 + .../psycopg2_binary-2.9.3.dist-info/METADATA | 111 + .../psycopg2_binary-2.9.3.dist-info/RECORD | 30 + .../psycopg2_binary-2.9.3.dist-info/REQUESTED | 0 .../psycopg2_binary-2.9.3.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../Lib/site-packages/sqlalchemy/__init__.py | 158 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4764 bytes .../__pycache__/events.cpython-310.pyc | Bin 0 -> 450 bytes .../__pycache__/exc.cpython-310.pyc | Bin 0 -> 21189 bytes .../__pycache__/inspection.cpython-310.pyc | Bin 0 -> 2956 bytes .../__pycache__/log.cpython-310.pyc | Bin 0 -> 6830 bytes .../__pycache__/processors.cpython-310.pyc | Bin 0 -> 4154 bytes .../__pycache__/schema.cpython-310.pyc | Bin 0 -> 2006 bytes .../__pycache__/types.cpython-310.pyc | Bin 0 -> 2272 bytes .../cimmutabledict.cp310-win_amd64.pyd | Bin 0 -> 14848 bytes .../sqlalchemy/connectors/__init__.py | 10 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 357 bytes .../__pycache__/mxodbc.cpython-310.pyc | Bin 0 -> 5464 bytes .../__pycache__/pyodbc.cpython-310.pyc | Bin 0 -> 5189 bytes .../sqlalchemy/connectors/mxodbc.py | 166 + .../sqlalchemy/connectors/pyodbc.py | 193 + .../cprocessors.cp310-win_amd64.pyd | Bin 0 -> 16896 bytes .../cresultproxy.cp310-win_amd64.pyd | Bin 0 -> 20992 bytes .../sqlalchemy/databases/__init__.py | 38 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 855 bytes .../sqlalchemy/dialects/__init__.py | 72 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1357 bytes .../sqlalchemy/dialects/firebird/__init__.py | 41 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 755 bytes .../firebird/__pycache__/base.cpython-310.pyc | Bin 0 -> 25600 bytes .../firebird/__pycache__/fdb.cpython-310.pyc | Bin 0 -> 4117 bytes .../__pycache__/kinterbasdb.cpython-310.pyc | Bin 0 -> 6484 bytes .../sqlalchemy/dialects/firebird/base.py | 989 +++ .../sqlalchemy/dialects/firebird/fdb.py | 112 + .../dialects/firebird/kinterbasdb.py | 202 + .../sqlalchemy/dialects/mssql/__init__.py | 85 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1519 bytes .../mssql/__pycache__/base.cpython-310.pyc | Bin 0 -> 96925 bytes .../information_schema.cpython-310.pyc | Bin 0 -> 5407 bytes .../mssql/__pycache__/json.cpython-310.pyc | Bin 0 -> 4694 bytes .../mssql/__pycache__/mxodbc.cpython-310.pyc | Bin 0 -> 5048 bytes .../__pycache__/provision.cpython-310.pyc | Bin 0 -> 3691 bytes .../mssql/__pycache__/pymssql.cpython-310.pyc | Bin 0 -> 4207 bytes .../mssql/__pycache__/pyodbc.cpython-310.pyc | Bin 0 -> 22932 bytes .../sqlalchemy/dialects/mssql/base.py | 3558 +++++++++ .../dialects/mssql/information_schema.py | 232 + .../sqlalchemy/dialects/mssql/json.py | 125 + .../sqlalchemy/dialects/mssql/mxodbc.py | 150 + .../sqlalchemy/dialects/mssql/provision.py | 116 + .../sqlalchemy/dialects/mssql/pymssql.py | 120 + .../sqlalchemy/dialects/mssql/pyodbc.py | 673 ++ .../sqlalchemy/dialects/mysql/__init__.py | 103 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1908 bytes .../__pycache__/aiomysql.cpython-310.pyc | Bin 0 -> 10646 bytes .../mysql/__pycache__/asyncmy.cpython-310.pyc | Bin 0 -> 11255 bytes .../mysql/__pycache__/base.cpython-310.pyc | Bin 0 -> 96837 bytes .../mysql/__pycache__/cymysql.cpython-310.pyc | Bin 0 -> 2593 bytes .../mysql/__pycache__/dml.cpython-310.pyc | Bin 0 -> 6074 bytes .../__pycache__/enumerated.cpython-310.pyc | Bin 0 -> 8647 bytes .../__pycache__/expression.cpython-310.pyc | Bin 0 -> 3837 bytes .../mysql/__pycache__/json.cpython-310.pyc | Bin 0 -> 2936 bytes .../mysql/__pycache__/mariadb.cpython-310.pyc | Bin 0 -> 854 bytes .../mariadbconnector.cpython-310.pyc | Bin 0 -> 7270 bytes .../mysqlconnector.cpython-310.pyc | Bin 0 -> 8119 bytes .../mysql/__pycache__/mysqldb.cpython-310.pyc | Bin 0 -> 9502 bytes .../mysql/__pycache__/oursql.cpython-310.pyc | Bin 0 -> 8069 bytes .../__pycache__/provision.cpython-310.pyc | Bin 0 -> 2109 bytes .../mysql/__pycache__/pymysql.cpython-310.pyc | Bin 0 -> 2803 bytes .../mysql/__pycache__/pyodbc.cpython-310.pyc | Bin 0 -> 4285 bytes .../__pycache__/reflection.cpython-310.pyc | Bin 0 -> 12822 bytes .../reserved_words.cpython-310.pyc | Bin 0 -> 4317 bytes .../mysql/__pycache__/types.cpython-310.pyc | Bin 0 -> 25686 bytes .../sqlalchemy/dialects/mysql/aiomysql.py | 317 + .../sqlalchemy/dialects/mysql/asyncmy.py | 328 + .../sqlalchemy/dialects/mysql/base.py | 3306 ++++++++ .../sqlalchemy/dialects/mysql/cymysql.py | 82 + .../sqlalchemy/dialects/mysql/dml.py | 175 + .../sqlalchemy/dialects/mysql/enumerated.py | 263 + .../sqlalchemy/dialects/mysql/expression.py | 130 + .../sqlalchemy/dialects/mysql/json.py | 84 + .../sqlalchemy/dialects/mysql/mariadb.py | 25 + .../dialects/mysql/mariadbconnector.py | 240 + .../dialects/mysql/mysqlconnector.py | 240 + .../sqlalchemy/dialects/mysql/mysqldb.py | 331 + .../sqlalchemy/dialects/mysql/oursql.py | 273 + .../sqlalchemy/dialects/mysql/provision.py | 78 + .../sqlalchemy/dialects/mysql/pymysql.py | 98 + .../sqlalchemy/dialects/mysql/pyodbc.py | 136 + .../sqlalchemy/dialects/mysql/reflection.py | 558 ++ .../dialects/mysql/reserved_words.py | 564 ++ .../sqlalchemy/dialects/mysql/types.py | 773 ++ .../sqlalchemy/dialects/oracle/__init__.py | 58 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1037 bytes .../oracle/__pycache__/base.cpython-310.pyc | Bin 0 -> 73559 bytes .../__pycache__/cx_oracle.cpython-310.pyc | Bin 0 -> 45829 bytes .../__pycache__/provision.cpython-310.pyc | Bin 0 -> 4970 bytes .../sqlalchemy/dialects/oracle/base.py | 2522 ++++++ .../sqlalchemy/dialects/oracle/cx_oracle.py | 1424 ++++ .../sqlalchemy/dialects/oracle/provision.py | 160 + .../dialects/postgresql/__init__.py | 117 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2189 bytes .../__pycache__/array.cpython-310.pyc | Bin 0 -> 13670 bytes .../__pycache__/asyncpg.cpython-310.pyc | Bin 0 -> 36857 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 137332 bytes .../__pycache__/dml.cpython-310.pyc | Bin 0 -> 8402 bytes .../__pycache__/ext.cpython-310.pyc | Bin 0 -> 8457 bytes .../__pycache__/hstore.cpython-310.pyc | Bin 0 -> 12600 bytes .../__pycache__/json.cpython-310.pyc | Bin 0 -> 10574 bytes .../__pycache__/pg8000.cpython-310.pyc | Bin 0 -> 20111 bytes .../__pycache__/provision.cpython-310.pyc | Bin 0 -> 3957 bytes .../__pycache__/psycopg2.cpython-310.pyc | Bin 0 -> 34929 bytes .../__pycache__/psycopg2cffi.cpython-310.pyc | Bin 0 -> 1782 bytes .../__pycache__/pygresql.cpython-310.pyc | Bin 0 -> 7951 bytes .../__pycache__/pypostgresql.cpython-310.pyc | Bin 0 -> 4068 bytes .../__pycache__/ranges.cpython-310.pyc | Bin 0 -> 5502 bytes .../sqlalchemy/dialects/postgresql/array.py | 438 ++ .../sqlalchemy/dialects/postgresql/asyncpg.py | 1119 +++ .../sqlalchemy/dialects/postgresql/base.py | 4651 +++++++++++ .../sqlalchemy/dialects/postgresql/dml.py | 274 + .../sqlalchemy/dialects/postgresql/ext.py | 277 + .../sqlalchemy/dialects/postgresql/hstore.py | 459 ++ .../sqlalchemy/dialects/postgresql/json.py | 327 + .../sqlalchemy/dialects/postgresql/pg8000.py | 594 ++ .../dialects/postgresql/provision.py | 124 + .../dialects/postgresql/psycopg2.py | 1088 +++ .../dialects/postgresql/psycopg2cffi.py | 60 + .../dialects/postgresql/pygresql.py | 278 + .../dialects/postgresql/pypostgresql.py | 126 + .../sqlalchemy/dialects/postgresql/ranges.py | 138 + .../sqlalchemy/dialects/sqlite/__init__.py | 58 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1038 bytes .../__pycache__/aiosqlite.cpython-310.pyc | Bin 0 -> 10449 bytes .../sqlite/__pycache__/base.cpython-310.pyc | Bin 0 -> 70995 bytes .../sqlite/__pycache__/dml.cpython-310.pyc | Bin 0 -> 6824 bytes .../sqlite/__pycache__/json.cpython-310.pyc | Bin 0 -> 3185 bytes .../__pycache__/provision.cpython-310.pyc | Bin 0 -> 4150 bytes .../__pycache__/pysqlcipher.cpython-310.pyc | Bin 0 -> 5598 bytes .../__pycache__/pysqlite.cpython-310.pyc | Bin 0 -> 22299 bytes .../sqlalchemy/dialects/sqlite/aiosqlite.py | 335 + .../sqlalchemy/dialects/sqlite/base.py | 2556 ++++++ .../sqlalchemy/dialects/sqlite/dml.py | 200 + .../sqlalchemy/dialects/sqlite/json.py | 84 + .../sqlalchemy/dialects/sqlite/provision.py | 142 + .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 164 + .../sqlalchemy/dialects/sqlite/pysqlite.py | 613 ++ .../sqlalchemy/dialects/sybase/__init__.py | 67 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1154 bytes .../sybase/__pycache__/base.cpython-310.pyc | Bin 0 -> 27553 bytes .../sybase/__pycache__/mxodbc.cpython-310.pyc | Bin 0 -> 1063 bytes .../sybase/__pycache__/pyodbc.cpython-310.pyc | Bin 0 -> 2628 bytes .../__pycache__/pysybase.cpython-310.pyc | Bin 0 -> 3770 bytes .../sqlalchemy/dialects/sybase/base.py | 1100 +++ .../sqlalchemy/dialects/sybase/mxodbc.py | 34 + .../sqlalchemy/dialects/sybase/pyodbc.py | 89 + .../sqlalchemy/dialects/sybase/pysybase.py | 106 + .../sqlalchemy/engine/__init__.py | 62 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2254 bytes .../engine/__pycache__/base.cpython-310.pyc | Bin 0 -> 100603 bytes .../characteristics.cpython-310.pyc | Bin 0 -> 2680 bytes .../engine/__pycache__/create.cpython-310.pyc | Bin 0 -> 27939 bytes .../engine/__pycache__/cursor.cpython-310.pyc | Bin 0 -> 55832 bytes .../__pycache__/default.cpython-310.pyc | Bin 0 -> 46490 bytes .../engine/__pycache__/events.cpython-310.pyc | Bin 0 -> 34087 bytes .../__pycache__/interfaces.cpython-310.pyc | Bin 0 -> 57922 bytes .../engine/__pycache__/mock.cpython-310.pyc | Bin 0 -> 4295 bytes .../__pycache__/reflection.cpython-310.pyc | Bin 0 -> 31423 bytes .../engine/__pycache__/result.cpython-310.pyc | Bin 0 -> 57050 bytes .../engine/__pycache__/row.cpython-310.pyc | Bin 0 -> 19163 bytes .../__pycache__/strategies.cpython-310.pyc | Bin 0 -> 489 bytes .../engine/__pycache__/url.cpython-310.pyc | Bin 0 -> 24404 bytes .../engine/__pycache__/util.cpython-310.pyc | Bin 0 -> 5410 bytes .../site-packages/sqlalchemy/engine/base.py | 3450 ++++++++ .../sqlalchemy/engine/characteristics.py | 56 + .../site-packages/sqlalchemy/engine/create.py | 743 ++ .../site-packages/sqlalchemy/engine/cursor.py | 1942 +++++ .../sqlalchemy/engine/default.py | 1940 +++++ .../site-packages/sqlalchemy/engine/events.py | 835 ++ .../sqlalchemy/engine/interfaces.py | 1736 ++++ .../site-packages/sqlalchemy/engine/mock.py | 118 + .../sqlalchemy/engine/reflection.py | 1160 +++ .../site-packages/sqlalchemy/engine/result.py | 1857 +++++ .../site-packages/sqlalchemy/engine/row.py | 621 ++ .../sqlalchemy/engine/strategies.py | 17 + .../site-packages/sqlalchemy/engine/url.py | 806 ++ .../site-packages/sqlalchemy/engine/util.py | 253 + .../sqlalchemy/event/__init__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 536 bytes .../event/__pycache__/api.cpython-310.pyc | Bin 0 -> 8238 bytes .../event/__pycache__/attr.cpython-310.pyc | Bin 0 -> 15946 bytes .../event/__pycache__/base.cpython-310.pyc | Bin 0 -> 10656 bytes .../event/__pycache__/legacy.cpython-310.pyc | Bin 0 -> 5131 bytes .../__pycache__/registry.cpython-310.pyc | Bin 0 -> 5890 bytes .../Lib/site-packages/sqlalchemy/event/api.py | 219 + .../site-packages/sqlalchemy/event/attr.py | 459 ++ .../site-packages/sqlalchemy/event/base.py | 345 + .../site-packages/sqlalchemy/event/legacy.py | 185 + .../sqlalchemy/event/registry.py | 297 + .../Lib/site-packages/sqlalchemy/events.py | 14 + sbsheriff/Lib/site-packages/sqlalchemy/exc.py | 733 ++ .../site-packages/sqlalchemy/ext/__init__.py | 11 + .../ext/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 282 bytes .../associationproxy.cpython-310.pyc | Bin 0 -> 49580 bytes .../ext/__pycache__/automap.cpython-310.pyc | Bin 0 -> 38486 bytes .../ext/__pycache__/baked.cpython-310.pyc | Bin 0 -> 19004 bytes .../ext/__pycache__/compiler.cpython-310.pyc | Bin 0 -> 21638 bytes .../horizontal_shard.cpython-310.pyc | Bin 0 -> 7074 bytes .../ext/__pycache__/hybrid.cpython-310.pyc | Bin 0 -> 42582 bytes .../ext/__pycache__/indexable.cpython-310.pyc | Bin 0 -> 10976 bytes .../instrumentation.cpython-310.pyc | Bin 0 -> 14072 bytes .../ext/__pycache__/mutable.cpython-310.pyc | Bin 0 -> 33770 bytes .../__pycache__/orderinglist.cpython-310.pyc | Bin 0 -> 14239 bytes .../__pycache__/serializer.cpython-310.pyc | Bin 0 -> 5040 bytes .../sqlalchemy/ext/associationproxy.py | 1627 ++++ .../sqlalchemy/ext/asyncio/__init__.py | 22 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 840 bytes .../asyncio/__pycache__/base.cpython-310.pyc | Bin 0 -> 3203 bytes .../__pycache__/engine.cpython-310.pyc | Bin 0 -> 25356 bytes .../__pycache__/events.cpython-310.pyc | Bin 0 -> 1706 bytes .../asyncio/__pycache__/exc.cpython-310.pyc | Bin 0 -> 860 bytes .../__pycache__/result.cpython-310.pyc | Bin 0 -> 21364 bytes .../__pycache__/scoping.cpython-310.pyc | Bin 0 -> 2801 bytes .../__pycache__/session.cpython-310.pyc | Bin 0 -> 22225 bytes .../sqlalchemy/ext/asyncio/base.py | 89 + .../sqlalchemy/ext/asyncio/engine.py | 828 ++ .../sqlalchemy/ext/asyncio/events.py | 44 + .../sqlalchemy/ext/asyncio/exc.py | 21 + .../sqlalchemy/ext/asyncio/result.py | 671 ++ .../sqlalchemy/ext/asyncio/scoping.py | 107 + .../sqlalchemy/ext/asyncio/session.py | 759 ++ .../site-packages/sqlalchemy/ext/automap.py | 1234 +++ .../Lib/site-packages/sqlalchemy/ext/baked.py | 648 ++ .../site-packages/sqlalchemy/ext/compiler.py | 613 ++ .../sqlalchemy/ext/declarative/__init__.py | 64 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1632 bytes .../__pycache__/extensions.cpython-310.pyc | Bin 0 -> 15475 bytes .../sqlalchemy/ext/declarative/extensions.py | 463 ++ .../sqlalchemy/ext/horizontal_shard.py | 256 + .../site-packages/sqlalchemy/ext/hybrid.py | 1206 +++ .../site-packages/sqlalchemy/ext/indexable.py | 352 + .../sqlalchemy/ext/instrumentation.py | 416 + .../site-packages/sqlalchemy/ext/mutable.py | 966 +++ .../sqlalchemy/ext/mypy/__init__.py | 0 .../mypy/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 192 bytes .../mypy/__pycache__/apply.cpython-310.pyc | Bin 0 -> 5973 bytes .../__pycache__/decl_class.cpython-310.pyc | Bin 0 -> 8106 bytes .../mypy/__pycache__/infer.cpython-310.pyc | Bin 0 -> 8885 bytes .../mypy/__pycache__/names.cpython-310.pyc | Bin 0 -> 5719 bytes .../mypy/__pycache__/plugin.cpython-310.pyc | Bin 0 -> 7340 bytes .../ext/mypy/__pycache__/util.cpython-310.pyc | Bin 0 -> 8153 bytes .../sqlalchemy/ext/mypy/apply.py | 299 + .../sqlalchemy/ext/mypy/decl_class.py | 516 ++ .../sqlalchemy/ext/mypy/infer.py | 556 ++ .../sqlalchemy/ext/mypy/names.py | 253 + .../sqlalchemy/ext/mypy/plugin.py | 284 + .../site-packages/sqlalchemy/ext/mypy/util.py | 305 + .../sqlalchemy/ext/orderinglist.py | 388 + .../sqlalchemy/ext/serializer.py | 177 + .../sqlalchemy/future/__init__.py | 18 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 505 bytes .../future/__pycache__/engine.cpython-310.pyc | Bin 0 -> 16697 bytes .../site-packages/sqlalchemy/future/engine.py | 413 + .../sqlalchemy/future/orm/__init__.py | 10 + .../orm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 240 bytes .../site-packages/sqlalchemy/inspection.py | 93 + sbsheriff/Lib/site-packages/sqlalchemy/log.py | 241 + .../site-packages/sqlalchemy/orm/__init__.py | 344 + .../orm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 10861 bytes .../__pycache__/attributes.cpython-310.pyc | Bin 0 -> 59466 bytes .../orm/__pycache__/base.cpython-310.pyc | Bin 0 -> 13034 bytes .../__pycache__/clsregistry.cpython-310.pyc | Bin 0 -> 12084 bytes .../__pycache__/collections.cpython-310.pyc | Bin 0 -> 52808 bytes .../orm/__pycache__/context.cpython-310.pyc | Bin 0 -> 53531 bytes .../orm/__pycache__/decl_api.cpython-310.pyc | Bin 0 -> 34800 bytes .../orm/__pycache__/decl_base.cpython-310.pyc | Bin 0 -> 25701 bytes .../__pycache__/dependency.cpython-310.pyc | Bin 0 -> 23593 bytes .../descriptor_props.cpython-310.pyc | Bin 0 -> 25891 bytes .../orm/__pycache__/dynamic.cpython-310.pyc | Bin 0 -> 13298 bytes .../orm/__pycache__/evaluator.cpython-310.pyc | Bin 0 -> 7021 bytes .../orm/__pycache__/events.cpython-310.pyc | Bin 0 -> 113295 bytes .../orm/__pycache__/exc.cpython-310.pyc | Bin 0 -> 6726 bytes .../orm/__pycache__/identity.cpython-310.pyc | Bin 0 -> 7452 bytes .../instrumentation.cpython-310.pyc | Bin 0 -> 18606 bytes .../__pycache__/interfaces.cpython-310.pyc | Bin 0 -> 32860 bytes .../orm/__pycache__/loading.cpython-310.pyc | Bin 0 -> 26040 bytes .../orm/__pycache__/mapper.cpython-310.pyc | Bin 0 -> 98419 bytes .../__pycache__/path_registry.cpython-310.pyc | Bin 0 -> 14951 bytes .../__pycache__/persistence.cpython-310.pyc | Bin 0 -> 43634 bytes .../__pycache__/properties.cpython-310.pyc | Bin 0 -> 13630 bytes .../orm/__pycache__/query.cpython-310.pyc | Bin 0 -> 112084 bytes .../__pycache__/relationships.cpython-310.pyc | Bin 0 -> 107237 bytes .../orm/__pycache__/scoping.cpython-310.pyc | Bin 0 -> 6545 bytes .../orm/__pycache__/session.cpython-310.pyc | Bin 0 -> 132526 bytes .../orm/__pycache__/state.cpython-310.pyc | Bin 0 -> 28409 bytes .../__pycache__/strategies.cpython-310.pyc | Bin 0 -> 57333 bytes .../strategy_options.cpython-310.pyc | Bin 0 -> 51648 bytes .../orm/__pycache__/sync.cpython-310.pyc | Bin 0 -> 3948 bytes .../__pycache__/unitofwork.cpython-310.pyc | Bin 0 -> 20874 bytes .../orm/__pycache__/util.cpython-310.pyc | Bin 0 -> 64119 bytes .../sqlalchemy/orm/attributes.py | 2331 ++++++ .../Lib/site-packages/sqlalchemy/orm/base.py | 572 ++ .../sqlalchemy/orm/clsregistry.py | 441 ++ .../sqlalchemy/orm/collections.py | 1706 ++++ .../site-packages/sqlalchemy/orm/context.py | 3125 ++++++++ .../site-packages/sqlalchemy/orm/decl_api.py | 1062 +++ .../site-packages/sqlalchemy/orm/decl_base.py | 1210 +++ .../sqlalchemy/orm/dependency.py | 1290 +++ .../sqlalchemy/orm/descriptor_props.py | 745 ++ .../site-packages/sqlalchemy/orm/dynamic.py | 491 ++ .../site-packages/sqlalchemy/orm/evaluator.py | 241 + .../site-packages/sqlalchemy/orm/events.py | 2893 +++++++ .../Lib/site-packages/sqlalchemy/orm/exc.py | 204 + .../site-packages/sqlalchemy/orm/identity.py | 254 + .../sqlalchemy/orm/instrumentation.py | 652 ++ .../sqlalchemy/orm/interfaces.py | 1018 +++ .../site-packages/sqlalchemy/orm/loading.py | 1465 ++++ .../site-packages/sqlalchemy/orm/mapper.py | 3697 +++++++++ .../sqlalchemy/orm/path_registry.py | 519 ++ .../sqlalchemy/orm/persistence.py | 2517 ++++++ .../sqlalchemy/orm/properties.py | 430 + .../Lib/site-packages/sqlalchemy/orm/query.py | 3508 +++++++++ .../sqlalchemy/orm/relationships.py | 3684 +++++++++ .../site-packages/sqlalchemy/orm/scoping.py | 228 + .../site-packages/sqlalchemy/orm/session.py | 4389 +++++++++++ .../Lib/site-packages/sqlalchemy/orm/state.py | 1025 +++ .../sqlalchemy/orm/strategies.py | 3126 ++++++++ .../sqlalchemy/orm/strategy_options.py | 2011 +++++ .../Lib/site-packages/sqlalchemy/orm/sync.py | 167 + .../sqlalchemy/orm/unitofwork.py | 784 ++ .../Lib/site-packages/sqlalchemy/orm/util.py | 2156 +++++ .../site-packages/sqlalchemy/pool/__init__.py | 56 + .../pool/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1314 bytes .../pool/__pycache__/base.cpython-310.pyc | Bin 0 -> 31226 bytes .../__pycache__/dbapi_proxy.cpython-310.pyc | Bin 0 -> 4879 bytes .../pool/__pycache__/events.cpython-310.pyc | Bin 0 -> 10783 bytes .../pool/__pycache__/impl.cpython-310.pyc | Bin 0 -> 15904 bytes .../Lib/site-packages/sqlalchemy/pool/base.py | 1137 +++ .../sqlalchemy/pool/dbapi_proxy.py | 147 + .../site-packages/sqlalchemy/pool/events.py | 284 + .../Lib/site-packages/sqlalchemy/pool/impl.py | 514 ++ .../site-packages/sqlalchemy/processors.py | 176 + .../Lib/site-packages/sqlalchemy/schema.py | 59 + .../site-packages/sqlalchemy/sql/__init__.py | 150 + .../sql/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4211 bytes .../__pycache__/annotation.cpython-310.pyc | Bin 0 -> 9713 bytes .../sql/__pycache__/base.cpython-310.pyc | Bin 0 -> 56739 bytes .../sql/__pycache__/coercions.cpython-310.pyc | Bin 0 -> 27223 bytes .../sql/__pycache__/compiler.cpython-310.pyc | Bin 0 -> 127561 bytes .../sql/__pycache__/crud.cpython-310.pyc | Bin 0 -> 17832 bytes .../sql/__pycache__/ddl.cpython-310.pyc | Bin 0 -> 40159 bytes .../default_comparator.cpython-310.pyc | Bin 0 -> 7110 bytes .../sql/__pycache__/dml.cpython-310.pyc | Bin 0 -> 50154 bytes .../sql/__pycache__/elements.cpython-310.pyc | Bin 0 -> 163820 bytes .../sql/__pycache__/events.cpython-310.pyc | Bin 0 -> 13939 bytes .../__pycache__/expression.cpython-310.pyc | Bin 0 -> 6693 bytes .../sql/__pycache__/functions.cpython-310.pyc | Bin 0 -> 49133 bytes .../sql/__pycache__/lambdas.cpython-310.pyc | Bin 0 -> 34733 bytes .../sql/__pycache__/naming.cpython-310.pyc | Bin 0 -> 5234 bytes .../sql/__pycache__/operators.cpython-310.pyc | Bin 0 -> 50706 bytes .../sql/__pycache__/roles.cpython-310.pyc | Bin 0 -> 8499 bytes .../sql/__pycache__/schema.cpython-310.pyc | Bin 0 -> 171813 bytes .../__pycache__/selectable.cpython-310.pyc | Bin 0 -> 218177 bytes .../sql/__pycache__/sqltypes.cpython-310.pyc | Bin 0 -> 105148 bytes .../__pycache__/traversals.cpython-310.pyc | Bin 0 -> 45252 bytes .../sql/__pycache__/type_api.cpython-310.pyc | Bin 0 -> 61559 bytes .../sql/__pycache__/util.cpython-310.pyc | Bin 0 -> 27017 bytes .../sql/__pycache__/visitors.cpython-310.pyc | Bin 0 -> 22230 bytes .../sqlalchemy/sql/annotation.py | 364 + .../Lib/site-packages/sqlalchemy/sql/base.py | 1702 ++++ .../site-packages/sqlalchemy/sql/coercions.py | 1096 +++ .../site-packages/sqlalchemy/sql/compiler.py | 5525 +++++++++++++ .../Lib/site-packages/sqlalchemy/sql/crud.py | 1091 +++ .../Lib/site-packages/sqlalchemy/sql/ddl.py | 1341 ++++ .../sqlalchemy/sql/default_comparator.py | 360 + .../Lib/site-packages/sqlalchemy/sql/dml.py | 1514 ++++ .../site-packages/sqlalchemy/sql/elements.py | 5415 +++++++++++++ .../site-packages/sqlalchemy/sql/events.py | 328 + .../sqlalchemy/sql/expression.py | 278 + .../site-packages/sqlalchemy/sql/functions.py | 1575 ++++ .../site-packages/sqlalchemy/sql/lambdas.py | 1314 ++++ .../site-packages/sqlalchemy/sql/naming.py | 210 + .../site-packages/sqlalchemy/sql/operators.py | 1688 ++++ .../Lib/site-packages/sqlalchemy/sql/roles.py | 239 + .../site-packages/sqlalchemy/sql/schema.py | 5268 +++++++++++++ .../sqlalchemy/sql/selectable.py | 6947 +++++++++++++++++ .../site-packages/sqlalchemy/sql/sqltypes.py | 3380 ++++++++ .../sqlalchemy/sql/traversals.py | 1559 ++++ .../site-packages/sqlalchemy/sql/type_api.py | 1974 +++++ .../Lib/site-packages/sqlalchemy/sql/util.py | 1120 +++ .../site-packages/sqlalchemy/sql/visitors.py | 852 ++ .../sqlalchemy/testing/__init__.py | 86 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2881 bytes .../__pycache__/assertions.cpython-310.pyc | Bin 0 -> 25325 bytes .../__pycache__/assertsql.cpython-310.pyc | Bin 0 -> 12141 bytes .../__pycache__/asyncio.cpython-310.pyc | Bin 0 -> 3056 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 6765 bytes .../__pycache__/engines.cpython-310.pyc | Bin 0 -> 13944 bytes .../__pycache__/entities.cpython-310.pyc | Bin 0 -> 2879 bytes .../__pycache__/exclusions.cpython-310.pyc | Bin 0 -> 14599 bytes .../__pycache__/fixtures.cpython-310.pyc | Bin 0 -> 22381 bytes .../testing/__pycache__/mock.cpython-310.pyc | Bin 0 -> 680 bytes .../__pycache__/pickleable.cpython-310.pyc | Bin 0 -> 5127 bytes .../__pycache__/profiling.cpython-310.pyc | Bin 0 -> 8623 bytes .../__pycache__/provision.cpython-310.pyc | Bin 0 -> 11208 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 57274 bytes .../__pycache__/schema.cpython-310.pyc | Bin 0 -> 5889 bytes .../testing/__pycache__/util.cpython-310.pyc | Bin 0 -> 13168 bytes .../__pycache__/warnings.cpython-310.pyc | Bin 0 -> 2018 bytes .../sqlalchemy/testing/assertions.py | 845 ++ .../sqlalchemy/testing/assertsql.py | 457 ++ .../sqlalchemy/testing/asyncio.py | 128 + .../sqlalchemy/testing/config.py | 209 + .../sqlalchemy/testing/engines.py | 465 ++ .../sqlalchemy/testing/entities.py | 111 + .../sqlalchemy/testing/exclusions.py | 465 ++ .../sqlalchemy/testing/fixtures.py | 870 +++ .../site-packages/sqlalchemy/testing/mock.py | 32 + .../sqlalchemy/testing/pickleable.py | 151 + .../sqlalchemy/testing/plugin/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 198 bytes .../__pycache__/bootstrap.cpython-310.pyc | Bin 0 -> 1735 bytes .../__pycache__/plugin_base.cpython-310.pyc | Bin 0 -> 18202 bytes .../__pycache__/pytestplugin.cpython-310.pyc | Bin 0 -> 19302 bytes .../reinvent_fixtures_py2k.cpython-310.pyc | Bin 0 -> 3161 bytes .../sqlalchemy/testing/plugin/bootstrap.py | 54 + .../sqlalchemy/testing/plugin/plugin_base.py | 789 ++ .../sqlalchemy/testing/plugin/pytestplugin.py | 820 ++ .../testing/plugin/reinvent_fixtures_py2k.py | 112 + .../sqlalchemy/testing/profiling.py | 335 + .../sqlalchemy/testing/provision.py | 416 + .../sqlalchemy/testing/requirements.py | 1518 ++++ .../sqlalchemy/testing/schema.py | 218 + .../sqlalchemy/testing/suite/__init__.py | 13 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 522 bytes .../__pycache__/test_cte.cpython-310.pyc | Bin 0 -> 4549 bytes .../__pycache__/test_ddl.cpython-310.pyc | Bin 0 -> 11074 bytes .../test_deprecations.cpython-310.pyc | Bin 0 -> 4428 bytes .../__pycache__/test_dialect.cpython-310.pyc | Bin 0 -> 10452 bytes .../__pycache__/test_insert.cpython-310.pyc | Bin 0 -> 8570 bytes .../test_reflection.cpython-310.pyc | Bin 0 -> 42510 bytes .../__pycache__/test_results.cpython-310.pyc | Bin 0 -> 11492 bytes .../__pycache__/test_rowcount.cpython-310.pyc | Bin 0 -> 4528 bytes .../__pycache__/test_select.cpython-310.pyc | Bin 0 -> 52185 bytes .../__pycache__/test_sequence.cpython-310.pyc | Bin 0 -> 8000 bytes .../__pycache__/test_types.cpython-310.pyc | Bin 0 -> 40962 bytes .../test_unicode_ddl.cpython-310.pyc | Bin 0 -> 4386 bytes .../test_update_delete.cpython-310.pyc | Bin 0 -> 2059 bytes .../sqlalchemy/testing/suite/test_cte.py | 204 + .../sqlalchemy/testing/suite/test_ddl.py | 381 + .../testing/suite/test_deprecations.py | 145 + .../sqlalchemy/testing/suite/test_dialect.py | 361 + .../sqlalchemy/testing/suite/test_insert.py | 367 + .../testing/suite/test_reflection.py | 1738 +++++ .../sqlalchemy/testing/suite/test_results.py | 426 + .../sqlalchemy/testing/suite/test_rowcount.py | 165 + .../sqlalchemy/testing/suite/test_select.py | 1783 +++++ .../sqlalchemy/testing/suite/test_sequence.py | 282 + .../sqlalchemy/testing/suite/test_types.py | 1508 ++++ .../testing/suite/test_unicode_ddl.py | 206 + .../testing/suite/test_update_delete.py | 60 + .../site-packages/sqlalchemy/testing/util.py | 458 ++ .../sqlalchemy/testing/warnings.py | 82 + .../Lib/site-packages/sqlalchemy/types.py | 119 + .../site-packages/sqlalchemy/util/__init__.py | 175 + .../util/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 6175 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 0 -> 36687 bytes .../__pycache__/_compat_py3k.cpython-310.pyc | Bin 0 -> 1937 bytes .../_concurrency_py3k.cpython-310.pyc | Bin 0 -> 4872 bytes .../__pycache__/_preloaded.cpython-310.pyc | Bin 0 -> 2662 bytes .../util/__pycache__/compat.cpython-310.pyc | Bin 0 -> 16258 bytes .../__pycache__/concurrency.cpython-310.pyc | Bin 0 -> 1824 bytes .../__pycache__/deprecations.cpython-310.pyc | Bin 0 -> 8967 bytes .../__pycache__/langhelpers.cpython-310.pyc | Bin 0 -> 50883 bytes .../util/__pycache__/queue.cpython-310.pyc | Bin 0 -> 8414 bytes .../__pycache__/topological.cpython-310.pyc | Bin 0 -> 2265 bytes .../sqlalchemy/util/_collections.py | 1089 +++ .../sqlalchemy/util/_compat_py3k.py | 67 + .../sqlalchemy/util/_concurrency_py3k.py | 194 + .../sqlalchemy/util/_preloaded.py | 68 + .../site-packages/sqlalchemy/util/compat.py | 632 ++ .../sqlalchemy/util/concurrency.py | 73 + .../sqlalchemy/util/deprecations.py | 417 + .../sqlalchemy/util/langhelpers.py | 1945 +++++ .../site-packages/sqlalchemy/util/queue.py | 291 + .../sqlalchemy/util/topological.py | 100 + sbsheriff/Scripts/pip.exe | Bin 106379 -> 107915 bytes sbsheriff/Scripts/pip3.10.exe | Bin 106379 -> 107915 bytes sbsheriff/Scripts/pip3.exe | Bin 106379 -> 107915 bytes 1465 files changed, 214240 insertions(+), 29493 deletions(-) create mode 100644 cogs/setup.py create mode 100644 sbsheriff/Include/site/python3.10/greenlet/greenlet.h rename sbsheriff/Lib/site-packages/{pip-22.0.4.dist-info => SQLAlchemy-1.4.41.dist-info}/INSTALLER (100%) create mode 100644 sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/RECORD rename sbsheriff/Lib/site-packages/{pip-22.0.4.dist-info => SQLAlchemy-1.4.41.dist-info}/REQUESTED (100%) create mode 100644 sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/AUTHORS rename sbsheriff/Lib/site-packages/{pip-22.0.4.dist-info/top_level.txt => greenlet-1.1.3.dist-info/INSTALLER} (100%) create mode 100644 sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/LICENSE.PSF create mode 100644 sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/greenlet/__init__.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/_greenlet.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/greenlet/greenlet.c create mode 100644 sbsheriff/Lib/site-packages/greenlet/greenlet.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/setup_switch_x64_masm.cmd create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_aarch64_gcc.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_alpha_unix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_amd64_unix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_arm32_ios.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_csky_gcc.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_mips_unix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_aix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_linux.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_unix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_riscv_unix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_s390_unix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_x32_unix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_masm.asm create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_masm.obj create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_msvc.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_x86_msvc.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/platform/switch_x86_unix.h create mode 100644 sbsheriff/Lib/site-packages/greenlet/slp_platformselect.h rename sbsheriff/Lib/site-packages/{pip/_vendor/html5lib/filters => greenlet/tests}/__init__.py (100%) create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_contextvars.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_extension_interface.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_gc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_generator.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_generator_nested.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_leaks.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_stack_saved.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_throw.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_tracing.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/_test_extension.c create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/_test_extension.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/_test_extension_cpp.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/_test_extension_cpp.cpp create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_contextvars.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_cpp.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_extension_interface.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_gc.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_generator.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_generator_nested.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_greenlet.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_leaks.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_stack_saved.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_throw.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_tracing.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_version.py create mode 100644 sbsheriff/Lib/site-packages/greenlet/tests/test_weakref.py create mode 100644 sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/INSTALLER rename sbsheriff/Lib/site-packages/{pip-22.0.4.dist-info => pip-22.2.2.dist-info}/LICENSE.txt (100%) rename sbsheriff/Lib/site-packages/{pip-22.0.4.dist-info => pip-22.2.2.dist-info}/METADATA (98%) rename sbsheriff/Lib/site-packages/{pip-22.0.4.dist-info => pip-22.2.2.dist-info}/RECORD (59%) create mode 100644 sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/REQUESTED rename sbsheriff/Lib/site-packages/{pip-22.0.4.dist-info => pip-22.2.2.dist-info}/WHEEL (100%) rename sbsheriff/Lib/site-packages/{pip-22.0.4.dist-info => pip-22.2.2.dist-info}/entry_points.txt (69%) create mode 100644 sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/pip/__pip-runner__.py create mode 100644 sbsheriff/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/inspect.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/_json.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/installation_report.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc rename sbsheriff/Lib/site-packages/pip/_internal/{req/req_tracker.py => operations/build/build_tracker.py} (85%) delete mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-310.pyc rename sbsheriff/Lib/site-packages/pip/_vendor/{html5lib/__pycache__/constants.cpython-310.pyc => chardet/__pycache__/johabfreq.cpython-310.pyc} (51%) create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/johabfreq.py rename sbsheriff/Lib/site-packages/pip/_vendor/chardet/{compat.py => johabprober.py} (51%) create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distro/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distro/__main__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc rename sbsheriff/Lib/site-packages/pip/_vendor/{ => distro}/__pycache__/distro.cpython-310.pyc (56%) rename sbsheriff/Lib/site-packages/pip/_vendor/{ => distro}/distro.py (83%) delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__init__.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_utils.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/constants.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/base.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/html5parser.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/serializer.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/_version.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__init__.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/colors.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/bar.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/colors.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/counter.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_lru_cache.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-310.pyc delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/tabulate.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_lru_cache.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/tabulate.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tomli/_types.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__init__.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/_ipaddress.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/_json.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/_range.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/errorcodes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/errors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/extensions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/extras.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/pool.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/sql.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/__pycache__/tz.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/psycopg2/_ipaddress.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/_json.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/_psycopg.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/psycopg2/_range.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/errorcodes.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/errors.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/extensions.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/extras.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/pool.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/sql.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2/tz.py create mode 100644 sbsheriff/Lib/site-packages/psycopg2_binary-2.9.3.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/psycopg2_binary-2.9.3.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/psycopg2_binary-2.9.3.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/psycopg2_binary-2.9.3.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/psycopg2_binary-2.9.3.dist-info/REQUESTED create mode 100644 sbsheriff/Lib/site-packages/psycopg2_binary-2.9.3.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/psycopg2_binary-2.9.3.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/__pycache__/events.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/__pycache__/exc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/__pycache__/inspection.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/__pycache__/log.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/__pycache__/processors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/__pycache__/schema.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/__pycache__/types.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/cimmutabledict.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/connectors/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/connectors/__pycache__/mxodbc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/connectors/mxodbc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/connectors/pyodbc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/cprocessors.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/cresultproxy.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/databases/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/databases/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/firebird/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/firebird/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/firebird/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/firebird/fdb.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/json.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/provision.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/information_schema.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/json.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/mxodbc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/provision.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/pymssql.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mssql/pyodbc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/provision.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/aiomysql.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/asyncmy.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/cymysql.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/dml.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/enumerated.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/expression.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/json.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/mariadb.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/mysqldb.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/oursql.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/provision.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/pymysql.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/pyodbc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/reflection.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/reserved_words.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/mysql/types.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/oracle/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/provision.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/oracle/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/oracle/provision.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/array.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/dml.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/ext.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/hstore.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/json.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/pg8000.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/provision.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/pygresql.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/pypostgresql.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/postgresql/ranges.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/json.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/dml.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/json.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/provision.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/mxodbc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/pyodbc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/dialects/sybase/pysybase.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/create.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/default.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/events.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/result.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/row.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/url.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/__pycache__/util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/characteristics.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/create.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/cursor.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/default.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/events.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/interfaces.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/mock.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/reflection.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/result.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/row.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/strategies.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/url.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/engine/util.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/__pycache__/api.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/__pycache__/attr.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/__pycache__/registry.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/api.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/attr.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/legacy.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/event/registry.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/events.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/exc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/associationproxy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/baked.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/compiler.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/horizontal_shard.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/hybrid.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/indexable.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/instrumentation.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/mutable.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/orderinglist.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/__pycache__/serializer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/associationproxy.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/engine.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/events.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/exc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/result.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/session.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/engine.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/events.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/exc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/result.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/scoping.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/asyncio/session.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/automap.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/baked.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/compiler.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/declarative/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/declarative/extensions.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/horizontal_shard.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/hybrid.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/indexable.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/instrumentation.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mutable.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/apply.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/infer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/names.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/plugin.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/apply.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/decl_class.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/infer.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/names.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/plugin.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/mypy/util.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/orderinglist.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/ext/serializer.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/future/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/future/__pycache__/engine.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/future/engine.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/future/orm/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/future/orm/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/inspection.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/log.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/context.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/events.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/query.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/session.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/state.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/__pycache__/util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/attributes.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/clsregistry.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/collections.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/context.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/decl_api.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/decl_base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/dependency.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/descriptor_props.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/dynamic.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/evaluator.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/events.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/exc.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/identity.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/instrumentation.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/interfaces.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/loading.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/mapper.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/path_registry.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/persistence.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/properties.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/query.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/relationships.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/scoping.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/session.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/state.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/strategies.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/strategy_options.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/sync.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/unitofwork.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/orm/util.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/__pycache__/dbapi_proxy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/__pycache__/events.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/dbapi_proxy.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/events.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/pool/impl.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/processors.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/schema.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/events.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/annotation.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/coercions.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/compiler.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/crud.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/ddl.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/default_comparator.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/dml.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/elements.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/events.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/expression.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/functions.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/lambdas.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/naming.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/operators.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/roles.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/schema.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/selectable.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/sqltypes.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/traversals.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/type_api.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/util.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/sql/visitors.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/assertions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/assertsql.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/asyncio.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/config.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/engines.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/entities.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/exclusions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/fixtures.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/mock.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/pickleable.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/profiling.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/provision.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/requirements.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/schema.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/__pycache__/warnings.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/assertions.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/assertsql.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/asyncio.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/config.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/engines.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/entities.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/exclusions.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/fixtures.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/mock.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/pickleable.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/reinvent_fixtures_py2k.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/bootstrap.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/plugin_base.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/pytestplugin.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/plugin/reinvent_fixtures_py2k.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/profiling.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/provision.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/requirements.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/schema.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_cte.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_insert.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_results.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_select.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_types.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_cte.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_ddl.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_deprecations.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_dialect.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_insert.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_reflection.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_results.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_rowcount.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_select.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_sequence.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_types.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_unicode_ddl.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/suite/test_update_delete.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/util.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/testing/warnings.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/types.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__init__.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/_compat_py3k.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/_preloaded.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/queue.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/__pycache__/topological.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/_collections.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/_compat_py3k.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/_concurrency_py3k.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/_preloaded.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/compat.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/concurrency.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/deprecations.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/langhelpers.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/queue.py create mode 100644 sbsheriff/Lib/site-packages/sqlalchemy/util/topological.py diff --git a/cogs/setup.py b/cogs/setup.py new file mode 100644 index 0000000..5503780 --- /dev/null +++ b/cogs/setup.py @@ -0,0 +1,13 @@ +from disnake.ext import commands +import disnake +class Setup(commands.Cog): + typelist = ["liegelord","vm_tracker","diplomacy"] + def __init__(self,bot) -> None: + self.bot = bot + + @commands.slash_command(description='Define an advert channel',default_member_permissions=disnake.Permissions(manage_guild=True)) + async def create_advert(self, + inter:disnake.ApplicationCommandInteraction, + advert_type:str = commands.Param(description='What type=',choices=typelist), + target: disnake.abc.GuildChannel = commands.Param(description='Channel override, optional')): + diff --git a/sbsheriff/Include/site/python3.10/greenlet/greenlet.h b/sbsheriff/Include/site/python3.10/greenlet/greenlet.h new file mode 100644 index 0000000..c788b2f --- /dev/null +++ b/sbsheriff/Include/site/python3.10/greenlet/greenlet.h @@ -0,0 +1,161 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is deprecated and undocumented. It does not change. */ +#define GREENLET_VERSION "1.0.0" + +#if PY_VERSION_HEX >= 0x30B00A6 +# define GREENLET_PY311 1 + /* _PyInterpreterFrame moved to the internal C API in Python 3.11 */ +# include +#else +# define GREENLET_PY311 0 +# define _PyCFrame CFrame +#endif + +typedef struct _greenlet { + PyObject_HEAD + char* stack_start; + char* stack_stop; + char* stack_copy; + intptr_t stack_saved; + struct _greenlet* stack_prev; + struct _greenlet* parent; + PyObject* run_info; + struct _frame* top_frame; + int recursion_depth; +#if GREENLET_PY311 + _PyInterpreterFrame *current_frame; + _PyStackChunk *datastack_chunk; + PyObject **datastack_top; + PyObject **datastack_limit; +#endif + PyObject* weakreflist; +#if PY_VERSION_HEX >= 0x030700A3 + _PyErr_StackItem* exc_info; + _PyErr_StackItem exc_state; +#else + PyObject* exc_type; + PyObject* exc_value; + PyObject* exc_traceback; +#endif + PyObject* dict; +#if PY_VERSION_HEX >= 0x030700A3 + PyObject* context; +#endif +#if PY_VERSION_HEX >= 0x30A00B1 + _PyCFrame* cframe; +#endif +} PyGreenlet; + +#define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type) +#define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*)-1) +#define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL) +#define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL) +#define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent) + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 8 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void** _PyGreenlet_API = NULL; + +# define PyGreenlet_Type \ + (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) + +# define PyExc_GreenletError \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) + +# define PyExc_GreenletExit \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +# define PyGreenlet_New \ + (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +# define PyGreenlet_GetCurrent \ + (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +# define PyGreenlet_Throw \ + (*(PyObject * (*)(PyGreenlet * self, \ + PyObject * typ, \ + PyObject * val, \ + PyObject * tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +# define PyGreenlet_Switch \ + (*(PyObject * \ + (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +# define PyGreenlet_SetParent \ + (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* Macro that imports greenlet and initializes C API */ +/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we + keep the older definition to be sure older code that might have a copy of + the header still works. */ +# define PyGreenlet_Import() \ + { \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ + } + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */ diff --git a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/INSTALLER b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/INSTALLER similarity index 100% rename from sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/INSTALLER rename to sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/INSTALLER diff --git a/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/LICENSE b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/LICENSE new file mode 100644 index 0000000..c933e4b --- /dev/null +++ b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright 2005-2022 SQLAlchemy authors and contributors . + +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/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/METADATA b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/METADATA new file mode 100644 index 0000000..c15ab9b --- /dev/null +++ b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/METADATA @@ -0,0 +1,237 @@ +Metadata-Version: 2.1 +Name: SQLAlchemy +Version: 1.4.41 +Summary: Database Abstraction Library +Home-page: https://www.sqlalchemy.org +Author: Mike Bayer +Author-email: mike_mp@zzzcomputing.com +License: MIT +Project-URL: Documentation, https://docs.sqlalchemy.org +Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/ +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +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 :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Database :: Front-Ends +Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: importlib-metadata ; python_version < "3.8" +Requires-Dist: greenlet (!=0.4.17) ; python_version >= "3" and (platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32")))))) +Provides-Extra: aiomysql +Requires-Dist: greenlet (!=0.4.17) ; (python_version >= "3") and extra == 'aiomysql' +Requires-Dist: aiomysql ; (python_version >= "3") and extra == 'aiomysql' +Provides-Extra: aiosqlite +Requires-Dist: typing-extensions (!=3.10.0.1) ; extra == 'aiosqlite' +Requires-Dist: greenlet (!=0.4.17) ; (python_version >= "3") and extra == 'aiosqlite' +Requires-Dist: aiosqlite ; (python_version >= "3") and extra == 'aiosqlite' +Provides-Extra: asyncio +Requires-Dist: greenlet (!=0.4.17) ; (python_version >= "3") and extra == 'asyncio' +Provides-Extra: asyncmy +Requires-Dist: greenlet (!=0.4.17) ; (python_version >= "3") and extra == 'asyncmy' +Requires-Dist: asyncmy (!=0.2.4,>=0.2.3) ; (python_version >= "3") and extra == 'asyncmy' +Provides-Extra: mariadb_connector +Requires-Dist: mariadb (!=1.1.2,>=1.0.1) ; (python_version >= "3") and extra == 'mariadb_connector' +Provides-Extra: mssql +Requires-Dist: pyodbc ; extra == 'mssql' +Provides-Extra: mssql_pymssql +Requires-Dist: pymssql ; extra == 'mssql_pymssql' +Provides-Extra: mssql_pyodbc +Requires-Dist: pyodbc ; extra == 'mssql_pyodbc' +Provides-Extra: mypy +Requires-Dist: sqlalchemy2-stubs ; extra == 'mypy' +Requires-Dist: mypy (>=0.910) ; (python_version >= "3") and extra == 'mypy' +Provides-Extra: mysql +Requires-Dist: mysqlclient (<2,>=1.4.0) ; (python_version < "3") and extra == 'mysql' +Requires-Dist: mysqlclient (>=1.4.0) ; (python_version >= "3") and extra == 'mysql' +Provides-Extra: mysql_connector +Requires-Dist: mysql-connector-python ; extra == 'mysql_connector' +Provides-Extra: oracle +Requires-Dist: cx-oracle (<8,>=7) ; (python_version < "3") and extra == 'oracle' +Requires-Dist: cx-oracle (>=7) ; (python_version >= "3") and extra == 'oracle' +Provides-Extra: postgresql +Requires-Dist: psycopg2 (>=2.7) ; extra == 'postgresql' +Provides-Extra: postgresql_asyncpg +Requires-Dist: greenlet (!=0.4.17) ; (python_version >= "3") and extra == 'postgresql_asyncpg' +Requires-Dist: asyncpg ; (python_version >= "3") and extra == 'postgresql_asyncpg' +Provides-Extra: postgresql_pg8000 +Requires-Dist: pg8000 (!=1.29.0,>=1.16.6) ; extra == 'postgresql_pg8000' +Provides-Extra: postgresql_psycopg2binary +Requires-Dist: psycopg2-binary ; extra == 'postgresql_psycopg2binary' +Provides-Extra: postgresql_psycopg2cffi +Requires-Dist: psycopg2cffi ; extra == 'postgresql_psycopg2cffi' +Provides-Extra: pymysql +Requires-Dist: pymysql (<1) ; (python_version < "3") and extra == 'pymysql' +Requires-Dist: pymysql ; (python_version >= "3") and extra == 'pymysql' +Provides-Extra: sqlcipher +Requires-Dist: sqlcipher3-binary ; (python_version >= "3") and extra == 'sqlcipher' + +SQLAlchemy +========== + +|PyPI| |Python| |Downloads| + +.. |PyPI| image:: https://img.shields.io/pypi/v/sqlalchemy + :target: https://pypi.org/project/sqlalchemy + :alt: PyPI + +.. |Python| image:: https://img.shields.io/pypi/pyversions/sqlalchemy + :target: https://pypi.org/project/sqlalchemy + :alt: PyPI - Python Version + +.. |Downloads| image:: https://img.shields.io/pypi/dm/sqlalchemy + :target: https://pypi.org/project/sqlalchemy + :alt: PyPI - Downloads + + +The Python SQL Toolkit and Object Relational Mapper + +Introduction +------------- + +SQLAlchemy is the Python SQL toolkit and Object Relational Mapper +that gives application developers the full power and +flexibility of SQL. SQLAlchemy provides a full suite +of well known enterprise-level persistence patterns, +designed for efficient and high-performing database +access, adapted into a simple and Pythonic domain +language. + +Major SQLAlchemy features include: + +* An industrial strength ORM, built + from the core on the identity map, unit of work, + and data mapper patterns. These patterns + allow transparent persistence of objects + using a declarative configuration system. + Domain models + can be constructed and manipulated naturally, + and changes are synchronized with the + current transaction automatically. +* A relationally-oriented query system, exposing + the full range of SQL's capabilities + explicitly, including joins, subqueries, + correlation, and most everything else, + in terms of the object model. + Writing queries with the ORM uses the same + techniques of relational composition you use + when writing SQL. While you can drop into + literal SQL at any time, it's virtually never + needed. +* A comprehensive and flexible system + of eager loading for related collections and objects. + Collections are cached within a session, + and can be loaded on individual access, all + at once using joins, or by query per collection + across the full result set. +* A Core SQL construction system and DBAPI + interaction layer. The SQLAlchemy Core is + separate from the ORM and is a full database + abstraction layer in its own right, and includes + an extensible Python-based SQL expression + language, schema metadata, connection pooling, + type coercion, and custom types. +* All primary and foreign key constraints are + assumed to be composite and natural. Surrogate + integer primary keys are of course still the + norm, but SQLAlchemy never assumes or hardcodes + to this model. +* Database introspection and generation. Database + schemas can be "reflected" in one step into + Python structures representing database metadata; + those same structures can then generate + CREATE statements right back out - all within + the Core, independent of the ORM. + +SQLAlchemy's philosophy: + +* SQL databases behave less and less like object + collections the more size and performance start to + matter; object collections behave less and less like + tables and rows the more abstraction starts to matter. + SQLAlchemy aims to accommodate both of these + principles. +* An ORM doesn't need to hide the "R". A relational + database provides rich, set-based functionality + that should be fully exposed. SQLAlchemy's + ORM provides an open-ended set of patterns + that allow a developer to construct a custom + mediation layer between a domain model and + a relational schema, turning the so-called + "object relational impedance" issue into + a distant memory. +* The developer, in all cases, makes all decisions + regarding the design, structure, and naming conventions + of both the object model as well as the relational + schema. SQLAlchemy only provides the means + to automate the execution of these decisions. +* With SQLAlchemy, there's no such thing as + "the ORM generated a bad query" - you + retain full control over the structure of + queries, including how joins are organized, + how subqueries and correlation is used, what + columns are requested. Everything SQLAlchemy + does is ultimately the result of a developer- + initiated decision. +* Don't use an ORM if the problem doesn't need one. + SQLAlchemy consists of a Core and separate ORM + component. The Core offers a full SQL expression + language that allows Pythonic construction + of SQL constructs that render directly to SQL + strings for a target database, returning + result sets that are essentially enhanced DBAPI + cursors. +* Transactions should be the norm. With SQLAlchemy's + ORM, nothing goes to permanent storage until + commit() is called. SQLAlchemy encourages applications + to create a consistent means of delineating + the start and end of a series of operations. +* Never render a literal value in a SQL statement. + Bound parameters are used to the greatest degree + possible, allowing query optimizers to cache + query plans effectively and making SQL injection + attacks a non-issue. + +Documentation +------------- + +Latest documentation is at: + +https://www.sqlalchemy.org/docs/ + +Installation / Requirements +--------------------------- + +Full documentation for installation is at +`Installation `_. + +Getting Help / Development / Bug reporting +------------------------------------------ + +Please refer to the `SQLAlchemy Community Guide `_. + +Code of Conduct +--------------- + +Above all, SQLAlchemy places great emphasis on polite, thoughtful, and +constructive communication between users and developers. +Please see our current Code of Conduct at +`Code of Conduct `_. + +License +------- + +SQLAlchemy is distributed under the `MIT license +`_. + diff --git a/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/RECORD b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/RECORD new file mode 100644 index 0000000..942f00f --- /dev/null +++ b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/RECORD @@ -0,0 +1,486 @@ +SQLAlchemy-1.4.41.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +SQLAlchemy-1.4.41.dist-info/LICENSE,sha256=dP1v9f1RkXCFEYZD8C5ZwxbqNkRvK9xgAtOyqk0OdxU,1119 +SQLAlchemy-1.4.41.dist-info/METADATA,sha256=gNJuv2R12HSAFjkjYhxqbhL9_7FmUvAU6ra5ijFGCKM,9972 +SQLAlchemy-1.4.41.dist-info/RECORD,, +SQLAlchemy-1.4.41.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +SQLAlchemy-1.4.41.dist-info/WHEEL,sha256=W26pYN7HLsBT1jrDSL9udgf_mdNKJmYmL23sIP-FcgM,102 +SQLAlchemy-1.4.41.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 +sqlalchemy/__init__.py,sha256=5BxGQv0nxzcyVGn21eDrHAB_mudXHL1gFbp-8Bx6NvE,4272 +sqlalchemy/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/__pycache__/events.cpython-310.pyc,, +sqlalchemy/__pycache__/exc.cpython-310.pyc,, +sqlalchemy/__pycache__/inspection.cpython-310.pyc,, +sqlalchemy/__pycache__/log.cpython-310.pyc,, +sqlalchemy/__pycache__/processors.cpython-310.pyc,, +sqlalchemy/__pycache__/schema.cpython-310.pyc,, +sqlalchemy/__pycache__/types.cpython-310.pyc,, +sqlalchemy/cimmutabledict.cp310-win_amd64.pyd,sha256=7ONb9bFWiFZ7lKfQkHuDP_SaSxk4SyOBjlm3OOWs7Yw,14848 +sqlalchemy/connectors/__init__.py,sha256=2h09OYe_UZoXRSQi_KmHawkWDOuzBZj2g5ABtmcBKTo,289 +sqlalchemy/connectors/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/connectors/__pycache__/mxodbc.cpython-310.pyc,, +sqlalchemy/connectors/__pycache__/pyodbc.cpython-310.pyc,, +sqlalchemy/connectors/mxodbc.py,sha256=-zj3Jg0Py0Uxlh_HA7KrPrbrpbfW1E_17HcLoF4X3qk,5950 +sqlalchemy/connectors/pyodbc.py,sha256=b_T2xsrPXfW77LHPYKz1zYc3pyFnYH8_5V4IZLLAw9Y,7048 +sqlalchemy/cprocessors.cp310-win_amd64.pyd,sha256=0H1uba0D64PbIiS3GaMxmCRIy8feGL5eNpEgGXwvg7w,16896 +sqlalchemy/cresultproxy.cp310-win_amd64.pyd,sha256=qfErQuv_BRyF6Utqk2ZZsumVbRr5JFzserPNdvoQHfY,20992 +sqlalchemy/databases/__init__.py,sha256=Gb2NTUKDtuIKhiegB8byTdZRn4lUbbRqXjmKT2EgVZQ,1048 +sqlalchemy/databases/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/dialects/__init__.py,sha256=SBefwy167apf6mMUy2OU9f6naeWdrAqBoyXSNaTGMB0,2157 +sqlalchemy/dialects/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/dialects/firebird/__init__.py,sha256=WjFeOMCyNJpexU5oMcPS-Wez2mPIGtXsO2EUqKhaKAM,1194 +sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/dialects/firebird/__pycache__/base.cpython-310.pyc,, +sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-310.pyc,, +sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-310.pyc,, +sqlalchemy/dialects/firebird/base.py,sha256=Wxhys-aoUSIqJrmaA-f1QNk9XpkayJlhfgDBOolJ4jg,32160 +sqlalchemy/dialects/firebird/fdb.py,sha256=DdO9GQE2mHDUrA1yQSvMBBbzN3ERPRBEj5ZmgBu7xmA,4228 +sqlalchemy/dialects/firebird/kinterbasdb.py,sha256=SkZwqKhxajeTXychIN7DUKtCGpso_kRnk7T0pEeLc8c,6681 +sqlalchemy/dialects/mssql/__init__.py,sha256=vs9yfSni1Gz3Nz-k-8wfPSXBRo1LVLJMqEAtYd4CxAs,1873 +sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/dialects/mssql/__pycache__/base.cpython-310.pyc,, +sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-310.pyc,, +sqlalchemy/dialects/mssql/__pycache__/json.cpython-310.pyc,, +sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-310.pyc,, +sqlalchemy/dialects/mssql/__pycache__/provision.cpython-310.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-310.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-310.pyc,, +sqlalchemy/dialects/mssql/base.py,sha256=LPxNgmfw4pCpouIKEDJ550u3E1I6GkcoFG49kRGK8-g,120024 +sqlalchemy/dialects/mssql/information_schema.py,sha256=gT8l6R_uPdmflprSiGdiZWq00i6TKC5_qfSz9cEdEiA,7816 +sqlalchemy/dialects/mssql/json.py,sha256=bAi9z-htrC6adJUiBRetVj3RwtJ2GNN5I_KGeHFL8_s,4683 +sqlalchemy/dialects/mssql/mxodbc.py,sha256=Wga13M6o1tpQH9axMKN6AL0JlA6xokoF9pIaSlb2HxQ,4958 +sqlalchemy/dialects/mssql/provision.py,sha256=oTGw0l5RNcXIWkA0s2erVgk2XKiNw26IRzZE84tN2uE,4371 +sqlalchemy/dialects/mssql/pymssql.py,sha256=_4_BDAC0Stw_e7tCsTs5znUXgjoezTsYS_3_A-GCTnU,3983 +sqlalchemy/dialects/mssql/pyodbc.py,sha256=b_Kl7xnr9Q38cUJ8g4-caQtpXvhodF1YxLstcGtxEZo,25105 +sqlalchemy/dialects/mysql/__init__.py,sha256=TjqqUAYi-dPaWLSZppFvFAw9fZcDqjZ5SSyE0Za3fko,2293 +sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/base.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/dml.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/expression.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/json.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/provision.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-310.pyc,, +sqlalchemy/dialects/mysql/__pycache__/types.cpython-310.pyc,, +sqlalchemy/dialects/mysql/aiomysql.py,sha256=qhZd-KR3xhGyLqiN4NjdDDb_VsBYnUWv0siYO7PrVZE,9926 +sqlalchemy/dialects/mysql/asyncmy.py,sha256=szrjefzFuWXB8olZ1XO7x5mNfWK9apFaxcuwUJy51zQ,10213 +sqlalchemy/dialects/mysql/base.py,sha256=WFocSULwwuyEJnYH5P15X0vrxwzsQe9VYfUv5MvgaIY,118534 +sqlalchemy/dialects/mysql/cymysql.py,sha256=723TrwHA1fjSqAKSAuBnWyBY_K0Hr8POHq6xYbZey9I,2353 +sqlalchemy/dialects/mysql/dml.py,sha256=d4dcIINNagmxaB-4APUKefPzq_rGFjav77G-NhUAP-8,6401 +sqlalchemy/dialects/mysql/enumerated.py,sha256=EMZeA_8UEfGd0jlwSY21ajhzBqe9xMYofaEqFTyQOds,9627 +sqlalchemy/dialects/mysql/expression.py,sha256=opg17QfNs805tLjcxdTLs_nGthpL-vSEiXl25iAPOO4,3871 +sqlalchemy/dialects/mysql/json.py,sha256=OobtcQPNOcLwyQ-ydC3FOtlXr1Q2PhSwZrnmZP40opA,2397 +sqlalchemy/dialects/mysql/mariadb.py,sha256=4NzNKjpGudJJLQQIYg0oYhlx4WKEPuncCPSTsfV6t6g,610 +sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=KcAu1GOwBa50X7pWh96dVUBkdFzUGauRC2X68KDjrko,7803 +sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=qB5mrfTA1GOEKPoLM2Bqi0FyfftQQ4gv0-CKB27IdCk,7930 +sqlalchemy/dialects/mysql/mysqldb.py,sha256=wLhLazw4F7L_9OVoI6TLJcoYIZsyMzBbLafr1KIsaGg,10768 +sqlalchemy/dialects/mysql/oursql.py,sha256=WY1sEFgn6NXnnxFCWtAaOrMWU-gVavjrM7YQS1y2vqA,8796 +sqlalchemy/dialects/mysql/provision.py,sha256=-gCG7MwEMtztSmNU107Q563t-nN-oqTVkCiay-HRRQI,2727 +sqlalchemy/dialects/mysql/pymysql.py,sha256=iXlxFuBQyCiV2EwbrwDImDw2al_fyFuYSgI9xXgo7ns,2868 +sqlalchemy/dialects/mysql/pyodbc.py,sha256=cTkEvvMtTi8r2DblPDuaMRrolsJlFO5Wq6Mr7dk-94s,4426 +sqlalchemy/dialects/mysql/reflection.py,sha256=oiWv6U-Us5DIbD0bH7zuuMOu9hi7fXPQLUbTKieOxsE,19111 +sqlalchemy/dialects/mysql/reserved_words.py,sha256=0EkRPqXXQ8elC1aFeYSUHIbsk5pnBXynTiKlg428ixg,9668 +sqlalchemy/dialects/mysql/types.py,sha256=hIOsOSHwxQ8nNbn8ZxWtEjPtoUb1WRTbN9x4v5apaJ8,25362 +sqlalchemy/dialects/oracle/__init__.py,sha256=ZRvKUEwMK3VYoZKJGOEQWKuUVtVNCzfwyc4nB6iMzfA,1287 +sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/dialects/oracle/__pycache__/base.cpython-310.pyc,, +sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-310.pyc,, +sqlalchemy/dialects/oracle/__pycache__/provision.cpython-310.pyc,, +sqlalchemy/dialects/oracle/base.py,sha256=3L7YWkTKK6hU5KK2DBVNL9HPcR_q_dGIdHsC_PivAro,90085 +sqlalchemy/dialects/oracle/cx_oracle.py,sha256=mX9VtepXIGMcS0egCuQS7QYxYRxHS4VsEwBTLCbd3wM,54626 +sqlalchemy/dialects/oracle/provision.py,sha256=SmVRWQL5WhTMhEyesNt_1CyROyQAKCoZz7-2IAKTb3I,5966 +sqlalchemy/dialects/postgresql/__init__.py,sha256=ThqXwUhiylsdcV65hgldUNdHeyFQjWWq9XX_AtVsC8A,2626 +sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/array.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/base.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/json.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-310.pyc,, +sqlalchemy/dialects/postgresql/array.py,sha256=E1BWXSNbh2VNUuFmUP_zYhelrYhPGjP7joCMTZDF8GQ,14635 +sqlalchemy/dialects/postgresql/asyncpg.py,sha256=pvHAWjtjiWKG6AevBc5A5_sV8-jaCiiva8ahghgk3xk,36564 +sqlalchemy/dialects/postgresql/base.py,sha256=9cuOJwn8rC5t_XfpgOtJi5n9L5ILAoIXUJ6R-0xSjPE,163752 +sqlalchemy/dialects/postgresql/dml.py,sha256=7HGPHwfpTsAxTryQKjI8VLyQTRMTIfFsVduAlI7vpOk,9856 +sqlalchemy/dialects/postgresql/ext.py,sha256=ZbiRJpnGua9_33cMRILHV_L2EwdeZepqYU0FiYRReDg,8716 +sqlalchemy/dialects/postgresql/hstore.py,sha256=CPDPzxbr9T83kOVnqzAVC_1kmqcQpHvUK27jlUm_G7E,13332 +sqlalchemy/dialects/postgresql/json.py,sha256=Z-V6h8Js_0rqLDNgmlTaEbimA126LyKTZ5ynprGLT78,10883 +sqlalchemy/dialects/postgresql/pg8000.py,sha256=mxnnaOAjcwk4XLIQznXwopCJ2Mq4OhrsrhKzal9mWh8,17638 +sqlalchemy/dialects/postgresql/provision.py,sha256=EI5cIapBexG9QGJSAwat98fGkaHuz0XC9JoQV9nN58w,4443 +sqlalchemy/dialects/postgresql/psycopg2.py,sha256=PqPP8zr3wATpOaa9g21hHTZkV9M9M96otqlzpoouxhs,41428 +sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=MFskOadJ1J9DFH9qFQfWI-3YB_jZTPmuDKRGW4CK8Zg,1751 +sqlalchemy/dialects/postgresql/pygresql.py,sha256=g-cgyaIYtRZ81WVMX6bR7ZkGvWgSJFQSA5KXaYYtuvE,8863 +sqlalchemy/dialects/postgresql/pypostgresql.py,sha256=A78mYw5N2kJqc1LVidQPRZ6Xw1xqZ-WGDpCom3vTSKM,3819 +sqlalchemy/dialects/postgresql/ranges.py,sha256=Mx6NXylBuaIc41OS0ukgXxsZIccQuG3SF6NgBCGqYbY,4901 +sqlalchemy/dialects/sqlite/__init__.py,sha256=1gBHBjm3vx-m1Z2YaqtC8ylSmC1W8lhe9R8H8b5ZBo4,1256 +sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-310.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/base.cpython-310.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-310.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/json.cpython-310.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-310.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-310.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-310.pyc,, +sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=hdIo9cm17A_CCW4Zwv49ooKDvTXH-28bYJQWImcrguU,10298 +sqlalchemy/dialects/sqlite/base.py,sha256=TwkY4Gvps9499Vcz4nUzv6TTNIv5JVEPAGLQF_5S9pM,90991 +sqlalchemy/dialects/sqlite/dml.py,sha256=u6DayAbj-FKv-xjD_XNu8-i2oXIOIfe3fBNakRz9tB4,7065 +sqlalchemy/dialects/sqlite/json.py,sha256=bz_1axFG5YI9kLszE-oiCN3-z95zIPPcLgVwug_-AT4,2602 +sqlalchemy/dialects/sqlite/provision.py,sha256=3F5ZX2dYGMFAGra99UVavCihth1_XazJXX9XAet8gbw,4818 +sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=9ZJh_h2uvKtIkCfhg7AywRMVeynMLC8I00kuPK0NUyE,5769 +sqlalchemy/dialects/sqlite/pysqlite.py,sha256=eAfyIYa_9KhHW39sffQcc0eNEXUMubx0lcSbYto1Uzo,24054 +sqlalchemy/dialects/sybase/__init__.py,sha256=TlAeZ4gYkJk7s-t85JWcENL9o0jBR-RURkA1g1MGvDI,1431 +sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/dialects/sybase/__pycache__/base.cpython-310.pyc,, +sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-310.pyc,, +sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-310.pyc,, +sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-310.pyc,, +sqlalchemy/dialects/sybase/base.py,sha256=nnIoOtknIQLc3qykSAMozwi5zqCbHDCW75fIEj1l3Gc,33521 +sqlalchemy/dialects/sybase/mxodbc.py,sha256=rDteimLqg5DCVXG7HfOeUAiOgxf9yuj5MZ9ncOEK0dA,973 +sqlalchemy/dialects/sybase/pyodbc.py,sha256=sYANs1jVJTXQbs3WciOuQuUOLO7Khgq1zuHa_09TLeU,2319 +sqlalchemy/dialects/sybase/pysybase.py,sha256=sWyYgdHd6skj51mXAB3RMZC-moGOEUFv2dSk9a-tJDQ,3476 +sqlalchemy/engine/__init__.py,sha256=3cq8BMoQfMgR8dZjnMPwI4bdnMFWbJ221ipPJSc1HCg,2170 +sqlalchemy/engine/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/base.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/characteristics.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/create.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/cursor.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/default.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/events.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/interfaces.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/mock.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/reflection.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/result.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/row.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/strategies.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/url.cpython-310.pyc,, +sqlalchemy/engine/__pycache__/util.cpython-310.pyc,, +sqlalchemy/engine/base.py,sha256=voxLEfvXG7SOQBZVv0BzBiwaRO0l3EteTDdC3VLHU0U,128036 +sqlalchemy/engine/characteristics.py,sha256=DrhLcmpnkMpmgo_kgQpcujoD4nW81vTt-GkuWqW9QaY,1873 +sqlalchemy/engine/create.py,sha256=PW4MyzmJC7CU9qCmduN3AB-BnVRg0jIxdrYe-F0VQi8,31540 +sqlalchemy/engine/cursor.py,sha256=8YrH8PHcO4aznkbwt2oY5ZUaWXWBUmQNGyF7EgUlmRw,70068 +sqlalchemy/engine/default.py,sha256=LmgY7Db-4fbNr9fKISoOxotTnXK2gbO5tAz1C0LK7mk,68925 +sqlalchemy/engine/events.py,sha256=yuG6AlOobpVZOANXK7T-z598VDiTIIUOb0lNCvVkZ08,34257 +sqlalchemy/engine/interfaces.py,sha256=MysnRnMpO4JWHGK0XrbsknV8sabdhsfa5z6jU5126b0,60708 +sqlalchemy/engine/mock.py,sha256=IO1Who4xVrfOc7apfataqhA8djkUrkIRIliRocCM81U,3744 +sqlalchemy/engine/reflection.py,sha256=X-cPoERL95dyj4ukibKFSDas3ERHGnxReWlgUFTJP_I,40090 +sqlalchemy/engine/result.py,sha256=mWQMuQuwvQospcI9qksl8ad0vHc-nTIYvPCAdQpPxek,60849 +sqlalchemy/engine/row.py,sha256=PyQhXcqXpc7xrjAaitHtNBtkZop8UZLrDL0CbcxOY68,19311 +sqlalchemy/engine/strategies.py,sha256=KV0fcHFsNFPs3DvB_PBSKz0AXSd5BeDyVXbIknMYKHA,431 +sqlalchemy/engine/url.py,sha256=XB06xzpZqxyd0Lpjh9WURvrAa0erQfYdKgIpYn1pAIc,27279 +sqlalchemy/engine/util.py,sha256=DYYyS8yGN7ivRIgqa2ikdKX6Gel4dklsDnCBcoEDz3Y,8695 +sqlalchemy/event/__init__.py,sha256=W0EsKWlR7MwIz4PD4p2QtI_Boj3d8yYhHJjDau_qyrI,534 +sqlalchemy/event/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/event/__pycache__/api.cpython-310.pyc,, +sqlalchemy/event/__pycache__/attr.cpython-310.pyc,, +sqlalchemy/event/__pycache__/base.cpython-310.pyc,, +sqlalchemy/event/__pycache__/legacy.cpython-310.pyc,, +sqlalchemy/event/__pycache__/registry.cpython-310.pyc,, +sqlalchemy/event/api.py,sha256=U1qNedjrauO62C0Nl2oUtQ1BOnL_FYh4u5KqMMrbWvk,8262 +sqlalchemy/event/attr.py,sha256=gHOqhCoXMtzjLhJ_2yKRetFvsmSBUw_H1WXyecID8_I,14568 +sqlalchemy/event/base.py,sha256=9LjfgYLbRq-3vTg-20Fn9_9NOrFR30-fUToPZXrGJ0g,11281 +sqlalchemy/event/legacy.py,sha256=HcGeCJ1-LXPJfUAX_pPpB3dOZUMHtkkv6vfbLvEu4Kg,6455 +sqlalchemy/event/registry.py,sha256=aH-pxTgMkbLjFqxRni9QgLCXn8jFP58ohrxSnqY0ahc,8783 +sqlalchemy/events.py,sha256=D6pT2iZJzxyDShQsZmctR_3hsj0rFNdf5451vpx9Ff0,481 +sqlalchemy/exc.py,sha256=BlvaHCAo2TFZgtV9fNnKlopeB5aTKr9iTZfTBuoBYUs,21849 +sqlalchemy/ext/__init__.py,sha256=rW1kXSAfsGwr4nlz-rie0mkH_cIxx625r5pFgr-vYh4,333 +sqlalchemy/ext/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/associationproxy.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/automap.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/baked.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/compiler.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/horizontal_shard.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/hybrid.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/indexable.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/instrumentation.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/mutable.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/orderinglist.cpython-310.pyc,, +sqlalchemy/ext/__pycache__/serializer.cpython-310.pyc,, +sqlalchemy/ext/associationproxy.py,sha256=x3r896H0OC4OLW9VKL-EAMewIdXIoXG9BByxtzV29W8,52766 +sqlalchemy/ext/asyncio/__init__.py,sha256=CbQR6BQDDcB2u-u1RRo9d_mVWxJUBVkvzmaZ_vphyqk,845 +sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/ext/asyncio/__pycache__/base.cpython-310.pyc,, +sqlalchemy/ext/asyncio/__pycache__/engine.cpython-310.pyc,, +sqlalchemy/ext/asyncio/__pycache__/events.cpython-310.pyc,, +sqlalchemy/ext/asyncio/__pycache__/exc.cpython-310.pyc,, +sqlalchemy/ext/asyncio/__pycache__/result.cpython-310.pyc,, +sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-310.pyc,, +sqlalchemy/ext/asyncio/__pycache__/session.cpython-310.pyc,, +sqlalchemy/ext/asyncio/base.py,sha256=SgGrnW1A817GFDsAbA1-juPIMTCx-LX-agyYaE-99Ck,2369 +sqlalchemy/ext/asyncio/engine.py,sha256=-_OBuXna46ZCAzKEWQaLsz3i-mb1CEWSZ7osjbsbWwg,27363 +sqlalchemy/ext/asyncio/events.py,sha256=gOfyb6X2AF7_vbAy-UX690ieIR3A0-L1MEGfI_n-cPU,1467 +sqlalchemy/ext/asyncio/exc.py,sha256=GORfjC6NfH8uZIt73JhxJKT0D59wOD8LoOxVOlXFw9g,660 +sqlalchemy/ext/asyncio/result.py,sha256=uzMpZnDLmEcG6aNjOg2cCjCEnJhLuhgAvj5UOnN-zv8,21909 +sqlalchemy/ext/asyncio/scoping.py,sha256=G8AGqbSyCViJc2fRKSNFx0hHToVnx43TA5mQt1E6MCo,3067 +sqlalchemy/ext/asyncio/session.py,sha256=S9LY-ocexGHDDwTP-4z1zDH9ZwvAasuAMLC3FX6xyCM,24784 +sqlalchemy/ext/automap.py,sha256=fIZXHSPb90Xj8DJO26EX6MnyrHt0cQOircVmuZzkpVg,47016 +sqlalchemy/ext/baked.py,sha256=uKMnOFtXanvVnNgj3QOETY8iP3vDjA4G_ZKHmxSvx0k,20617 +sqlalchemy/ext/compiler.py,sha256=IXdO7z8uTtKXsx45k1Mi0sQDmkLrZXUYW1ED62gExvc,23242 +sqlalchemy/ext/declarative/__init__.py,sha256=GZ-jwVK_PLihu4qaLw-4NCn9dAT5j2FxbEQrOtnZnWE,1906 +sqlalchemy/ext/declarative/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/ext/declarative/__pycache__/extensions.cpython-310.pyc,, +sqlalchemy/ext/declarative/extensions.py,sha256=RTbMBLqsI3cfpPm5Em4xNX2Su6CZiVQC1QxYT38u8ws,17004 +sqlalchemy/ext/horizontal_shard.py,sha256=KyF4Diqr3mCk4PYyAmbxdHqTYAqLpcKriBuGWLOiKyk,9178 +sqlalchemy/ext/hybrid.py,sha256=QX8vGO4E4SBylaxw8HONOiHWK4xufjcbmZP4Dv_nU9E,43145 +sqlalchemy/ext/indexable.py,sha256=8niAhjt-tymCUtAXvyVyziyDAKFu8zMx4i5Xb1MO5lg,11607 +sqlalchemy/ext/instrumentation.py,sha256=kx2zn8mN30F-CbWqiBxb7HgnMSJChLcvQhJ8Tb8VIXo,14802 +sqlalchemy/ext/mutable.py,sha256=JbRRdDXtYAOlHG5LeLK3hqEfZ6lI71CZNnN1T5J4KP8,33458 +sqlalchemy/ext/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sqlalchemy/ext/mypy/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/ext/mypy/__pycache__/apply.cpython-310.pyc,, +sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-310.pyc,, +sqlalchemy/ext/mypy/__pycache__/infer.cpython-310.pyc,, +sqlalchemy/ext/mypy/__pycache__/names.cpython-310.pyc,, +sqlalchemy/ext/mypy/__pycache__/plugin.cpython-310.pyc,, +sqlalchemy/ext/mypy/__pycache__/util.cpython-310.pyc,, +sqlalchemy/ext/mypy/apply.py,sha256=91CSdH2xynaH021h-3N8OgROti9AKEtr3vS1il7NpXU,9909 +sqlalchemy/ext/mypy/decl_class.py,sha256=Prj8raNTj62sthYQM9YkAN5i253ZtsjkOerI13Q0g-Y,17859 +sqlalchemy/ext/mypy/infer.py,sha256=FGlMhNssaytzeV2mY5eMzXPhFmqovjfNkC9jH-PoJbw,18584 +sqlalchemy/ext/mypy/names.py,sha256=x7eRwmrR-Doo3TeiCmOdWKIHw0bINnSRnILzUStdvxM,8183 +sqlalchemy/ext/mypy/plugin.py,sha256=-NJjASfM5fLPA85Mq7LN_78x565FetYx-WExRVHVyNM,9529 +sqlalchemy/ext/mypy/util.py,sha256=zDlbABxIbMOFzeSswlAI2RFnWUqBWGdfBn2otOiTLVI,8547 +sqlalchemy/ext/orderinglist.py,sha256=Q-TCtQ1bpi2Pq75yJkUL9K4Z2ALtqxTbvEMdF9y_Lpk,14263 +sqlalchemy/ext/serializer.py,sha256=Wlb2im2MtVg9JPigiCAQwwmyGVdMhPf8Y51AeQaJ89E,6133 +sqlalchemy/future/__init__.py,sha256=u-aPKVzAdaRVuXMRAtFcOVF3DsnnRuyFa3Hg6xQ4D7w,543 +sqlalchemy/future/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/future/__pycache__/engine.cpython-310.pyc,, +sqlalchemy/future/engine.py,sha256=mSCb1fWX81P7iHKlulgZPnwLGlfcjB8Y5vhOB_fvOL4,16597 +sqlalchemy/future/orm/__init__.py,sha256=EFbmp8wsBEdOsAMouDPBpP6xkONT0Eu73xayKQ5d2Uw,299 +sqlalchemy/future/orm/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/inspection.py,sha256=kp-w5ERC-cGh91Itw0ATEtWiEz0FJuQG_LcU6qBIfsM,3144 +sqlalchemy/log.py,sha256=hH5TstVQ32ivOB-s5gVQZ_LwqooDSAFSLjibB5EIi9U,7384 +sqlalchemy/orm/__init__.py,sha256=DAWyuZ1U-4ZCAbWRO4iUfBCn3ESf-iLX11s_hPaVZsc,11308 +sqlalchemy/orm/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/attributes.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/base.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/clsregistry.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/collections.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/context.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/decl_api.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/decl_base.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/dependency.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/descriptor_props.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/dynamic.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/evaluator.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/events.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/exc.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/identity.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/instrumentation.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/interfaces.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/loading.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/mapper.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/path_registry.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/persistence.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/properties.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/query.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/relationships.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/scoping.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/session.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/state.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/strategies.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/strategy_options.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/sync.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/unitofwork.cpython-310.pyc,, +sqlalchemy/orm/__pycache__/util.cpython-310.pyc,, +sqlalchemy/orm/attributes.py,sha256=RvhU6RrPWV9e-4pf1BvZdIbi0P1gIjuwVUK8yUm0ai0,79429 +sqlalchemy/orm/base.py,sha256=wrB54uDLzbdvlgQzTA7AGxP0US45z0UAcXIb_eQlMd4,15640 +sqlalchemy/orm/clsregistry.py,sha256=sHMwdpwuOS9aEUUfLG0btJWIjHbl2LVclw1NhTdXEHo,13727 +sqlalchemy/orm/collections.py,sha256=iTS23m05siT0k1edk1B0q1FbF4CJUF2m6fRclr3es5Y,56429 +sqlalchemy/orm/context.py,sha256=NZ-tyujmsYTKOyQO9AGDKaPMnMP9o5gacC5ZR3SyXl4,114246 +sqlalchemy/orm/decl_api.py,sha256=MgWNxkqi0ohyHMMcIcefX1yh-lsKdwjrguI51EePg3U,36626 +sqlalchemy/orm/decl_base.py,sha256=w7caFv9sIPxYhgXG_mAaYcqbDw5HPpvUJNhFSfNN0Ug,45956 +sqlalchemy/orm/dependency.py,sha256=KtPFM25nNGZ06qOG1kFUi_VVRy_WSXFm0Dx9l9cS1-Q,48277 +sqlalchemy/orm/descriptor_props.py,sha256=doXozzd36Lvedk39zb2bZYaZ4cvCVotaujijouRPd8g,26732 +sqlalchemy/orm/dynamic.py,sha256=kheoDUs0Ff3kZ36_qf2CUtFLScKRWMYqNvt7JbjSITU,16448 +sqlalchemy/orm/evaluator.py,sha256=MDmc5kKAhpPYYzOV_5cDvIs4GInZa47LUkE1tMXGQn8,7093 +sqlalchemy/orm/events.py,sha256=kddD-YBxnfixLLbFLs_LJsT-Js81VYfMOq-RS6AAfp8,115173 +sqlalchemy/orm/exc.py,sha256=IxhF_AZ2qbLjHPHrWNXen4KJNwACSnK9qLQVyaE2T3Y,6736 +sqlalchemy/orm/identity.py,sha256=-eNr9jsNTYwKOmtTF3LGekm3nNL6OnvWF4L_uIgiSZA,7487 +sqlalchemy/orm/instrumentation.py,sha256=_pLiv3F6YyfQMhqUi7jhdiRB3w-pb5jtMdZyV8XW9Ow,21030 +sqlalchemy/orm/interfaces.py,sha256=NzvUB847ltQGj7jqC8F7nQhuUfLKR0ydHOtyS4_Zk-8,33362 +sqlalchemy/orm/loading.py,sha256=iElrL1vyw2FHkKKURO67zbWZ5fVOIYC0vXa93ZkYwm8,50782 +sqlalchemy/orm/mapper.py,sha256=nj00N8a11Bzp3BwQBuvRYeIt68wCe13hFoJLwNLEtaI,145947 +sqlalchemy/orm/path_registry.py,sha256=eZWbu-pcNflx8n_AwiRithC1sOJsIaoy6DpNaC_1G2M,16930 +sqlalchemy/orm/persistence.py,sha256=FP5knuE1xwDEbV2zc5khlQsdUYVPy_mgqTtt2g7ZL9s,86767 +sqlalchemy/orm/properties.py,sha256=I3ZnJJ7ZPy8oWuSz2o3YV7I8WRuT_Bm6tkC7nsKhTnQ,15095 +sqlalchemy/orm/query.py,sha256=yU6O2CD1o6FJs26XnCMyCkrH6IkkUNhG2b_awGpViVE,129061 +sqlalchemy/orm/relationships.py,sha256=oF9rXIOnoxNr0Ot434txPQyalMU4-Eg9xK6YOqq1Xo8,146930 +sqlalchemy/orm/scoping.py,sha256=30vfl1vr4yR0Vz-5OzG6VOwJ0ZGMN4SrypbOEybqU2I,7485 +sqlalchemy/orm/session.py,sha256=TtVfLf9Zn1h_nBwVsJjf703mLQdjh-eeC2I-NHF_WOA,165430 +sqlalchemy/orm/state.py,sha256=2p8xqSyLsK77hDoDN1WfoVI5v4y_nQd3FvvIq9eFz48,34549 +sqlalchemy/orm/strategies.py,sha256=VTFbrof4JPIDxSJ1hHyn2OTNcrF__hJg7bQidLm-k6Q,110705 +sqlalchemy/orm/strategy_options.py,sha256=UjHr5LBWFMSWvfPXxCJzml_4lD5Ct1ULca26r13cu0c,69465 +sqlalchemy/orm/sync.py,sha256=EyKdz3NKVvVmAMwB5vdmGvLmAgppILpOWa7BxEIqsTw,5991 +sqlalchemy/orm/unitofwork.py,sha256=xh-j1z66pmFDwxlWjZELHf6ExXV0-wlFn9eAuU1Il_E,27874 +sqlalchemy/orm/util.py,sha256=sprQH4YW3-WjnivlbDGWFGyzpHWUyCClPRef4AZkGEI,77470 +sqlalchemy/pool/__init__.py,sha256=9j4YgD_2W2OBbih80IY5_jHyKaDZBSIL8GhwsTupqkc,1659 +sqlalchemy/pool/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/pool/__pycache__/base.cpython-310.pyc,, +sqlalchemy/pool/__pycache__/dbapi_proxy.cpython-310.pyc,, +sqlalchemy/pool/__pycache__/events.cpython-310.pyc,, +sqlalchemy/pool/__pycache__/impl.cpython-310.pyc,, +sqlalchemy/pool/base.py,sha256=XTs1_0DtAv_-C95RLV3kfCTO1u-7_LJs1AqaZSTHmuI,40244 +sqlalchemy/pool/dbapi_proxy.py,sha256=jLDwXbN3irsWPrbrAHs0jWGvIOKRcg44JDGWo-NEF10,4376 +sqlalchemy/pool/events.py,sha256=UkEBvlJnaovQLOY2FDVQugkWOLz6LDB5aGvZSDM3dgE,10583 +sqlalchemy/pool/impl.py,sha256=GiYG-rPejaB9eo9TZK_Gh5_SlGoz-uOyEl_AG4W4Fjc,16297 +sqlalchemy/processors.py,sha256=wRXMZbN7yCZK1LLFq8-P1aRumS0_OrKMwhSDvBs75IM,5921 +sqlalchemy/schema.py,sha256=Mw5ZePzKRbj_yDPnassmTcg8P462RSDa3nK4P6zEqlU,2472 +sqlalchemy/sql/__init__.py,sha256=xlG-KPS7czj8JULYxdkcW8hI1DzwSoE9U6nNfWLIH5c,4811 +sqlalchemy/sql/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/annotation.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/base.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/coercions.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/compiler.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/crud.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/ddl.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/default_comparator.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/dml.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/elements.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/events.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/expression.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/functions.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/lambdas.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/naming.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/operators.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/roles.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/schema.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/selectable.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/sqltypes.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/traversals.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/type_api.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/util.cpython-310.pyc,, +sqlalchemy/sql/__pycache__/visitors.cpython-310.pyc,, +sqlalchemy/sql/annotation.py,sha256=rEfFCBUM9VhmMlKE3ffeEk-oJu9k1TTLtcS9O_XUm7Y,11866 +sqlalchemy/sql/base.py,sha256=LfadTCd4ZZIs8-8QUWz8MnyxTSFImaMZBAuoovdWBb8,57599 +sqlalchemy/sql/coercions.py,sha256=lPJ6_p9ANElf0NgiEYefqEj7OeCRaKnnVv3HaKtRtlo,35626 +sqlalchemy/sql/compiler.py,sha256=YbRdYKWtHFcMnKY28aZct4_H_OsvvxSnAPh6P7ffc-A,193341 +sqlalchemy/sql/crud.py,sha256=PpisSEvrpSio2d2TJPCnxk7n0W70Gjwzo7yjFD2p-cU,37058 +sqlalchemy/sql/ddl.py,sha256=Rj92-HBBZJJpZ3VmY6k-CuwJtu4NoZAWZanTzPau468,45549 +sqlalchemy/sql/default_comparator.py,sha256=VL4Ykw5SlKK-95eIvLc4A-f5_FxF6ii1VtJ31r3rtzM,11538 +sqlalchemy/sql/dml.py,sha256=ao8ReN6FV4XyCl07mL0JEJ2gTRdk60VH5dkoo9JwF_M,56177 +sqlalchemy/sql/elements.py,sha256=sHt_1AujmnFdy0TnSP1uIfSbq9cEnTD-jSEe3SUGYJs,186936 +sqlalchemy/sql/events.py,sha256=5F3mCd7wfRm5Q0hjKKkOPbrFf18VzraK7C3fDgGtCCg,13574 +sqlalchemy/sql/expression.py,sha256=UEbH1-TdhgRZ-ZyC019l1YYJzah_rnzy1jr590KTsg0,9106 +sqlalchemy/sql/functions.py,sha256=VSe_o7igqUyHvJsSpQe06Fc2BRl1ffqwCIvytUYyHwE,50057 +sqlalchemy/sql/lambdas.py,sha256=n4f07Ojmzm2GU6VS9gFry9yKdhhAlv6knw8e6uHl_Ko,46227 +sqlalchemy/sql/naming.py,sha256=fhlnu3UQ4o5v0yEhlbRZFbQQAW_I93ktHpOpwHK23P8,6996 +sqlalchemy/sql/operators.py,sha256=_cwzYtOVUtD4ceRGrZM_0x9o6iQdPmkcREiQ-A3UuVs,49887 +sqlalchemy/sql/roles.py,sha256=jumdmZ88-6eibELufo0fLZVLCIwrMZpFx2sUeGMP3NY,5877 +sqlalchemy/sql/schema.py,sha256=JwiAxiu6rkZWP_hbjoijb7uPSqPgn9vDRW6GGwO7oj8,200615 +sqlalchemy/sql/selectable.py,sha256=5hRHZOoPRiXYgJY4VMMK9rLQqhPcHXTnhT69QGHLpwo,244337 +sqlalchemy/sql/sqltypes.py,sha256=XvfAyUmssJ4FZb8i9GL9uNUlEjRNNNJXj9f2fesHgIM,118122 +sqlalchemy/sql/traversals.py,sha256=pKfe8xcaMCzAL8k7NGwpZsKA7_sibLxkuzIaaEC5Pio,54278 +sqlalchemy/sql/type_api.py,sha256=XbE1qaNVj0kuTLGVrX4egnA-x09Qegz5OFDIdT1gP1o,73010 +sqlalchemy/sql/util.py,sha256=-GNA0exQRn12W6gDQXGv7yqyT-a9n-XnJ6xBf--D5tM,36976 +sqlalchemy/sql/visitors.py,sha256=yJGOQh_emoU24voh5mNITS8SR8BEyfMgGXh4J3EmNFM,28181 +sqlalchemy/testing/__init__.py,sha256=vLicxa_6BjJyIV5nhHv7jE8zgOzrptVARZueBzPNQ1I,2936 +sqlalchemy/testing/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/assertions.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/assertsql.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/asyncio.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/config.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/engines.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/entities.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/exclusions.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/fixtures.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/mock.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/pickleable.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/profiling.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/provision.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/requirements.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/schema.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/util.cpython-310.pyc,, +sqlalchemy/testing/__pycache__/warnings.cpython-310.pyc,, +sqlalchemy/testing/assertions.py,sha256=A4inDz60Q75AeRFr8qSW2r7LoQKFlex0XWNtmis9jSw,27347 +sqlalchemy/testing/assertsql.py,sha256=CEkFaGpBkR_R0YgtrPYGYN6ELQIGygLzcFD1qFtcrck,15421 +sqlalchemy/testing/asyncio.py,sha256=71yaLEj5B7PEIr0UKmno7VTiqkmUGmvxSeKCJwBIDu0,3799 +sqlalchemy/testing/config.py,sha256=ZIaA6IRBq7-lEPeQaNVX6J15mVlEUcsgzMw-yQPSgRU,6752 +sqlalchemy/testing/engines.py,sha256=dFF1Y7BK4dxPtnhcfzIuLot_KgwOW1P_ayBNFYmD_pg,13857 +sqlalchemy/testing/entities.py,sha256=clFhuzXngYlpqBLpWdj7tDUEXzw3sFC3ylMbzNmnBxI,3364 +sqlalchemy/testing/exclusions.py,sha256=U6KFE34ssz0y8KbjpF4YdEReENLtIxUUZlgWJhVxCV0,13794 +sqlalchemy/testing/fixtures.py,sha256=3GdCoxM2LhEqzTItZZndBW7O6pkZYNw7PmU9kARD5_c,27699 +sqlalchemy/testing/mock.py,sha256=Ui5wdDUdSGdXWicJoKCiwABlzaca1FsTFby0zFinNPA,926 +sqlalchemy/testing/pickleable.py,sha256=XPFVTWNsnLLrTjw5F01JpeUUe4E4fHvIpAHCg9TU5mk,3037 +sqlalchemy/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sqlalchemy/testing/plugin/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-310.pyc,, +sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-310.pyc,, +sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-310.pyc,, +sqlalchemy/testing/plugin/__pycache__/reinvent_fixtures_py2k.cpython-310.pyc,, +sqlalchemy/testing/plugin/bootstrap.py,sha256=Pykdrxtc5QVxY11Z0dyQjtRlpftk9pYeh35xunm-NdU,1755 +sqlalchemy/testing/plugin/plugin_base.py,sha256=cxzzd8FWyCxY6o7tklRr8jR9TWtr9bDGiaUeeRBX6y0,22329 +sqlalchemy/testing/plugin/pytestplugin.py,sha256=mG2b_NSpklZPSxKGRV7xrE4thcnPo6LED0f5RuVq2T8,26953 +sqlalchemy/testing/plugin/reinvent_fixtures_py2k.py,sha256=b9fWp5RXdePykrNviZPXaGDIjOEOfovchez2Ovr4IRQ,3400 +sqlalchemy/testing/profiling.py,sha256=oMzNhMpLbQr0lJUXtkl4MDIeZlUX0sN_W8cXhXoEHYI,10901 +sqlalchemy/testing/provision.py,sha256=KgkqJazFsLEY9CjeniUApQiR90_ghoQHiDBY2nuCErU,12486 +sqlalchemy/testing/requirements.py,sha256=gxvCI9f8P-B18hfMt-Q0H9cSpJJfbQD_TaBH1Entf0s,45017 +sqlalchemy/testing/schema.py,sha256=u-twx4-MlLa_PKJ_sOPnoXUZnxyJgjDssrrOhW1O7_Y,6762 +sqlalchemy/testing/suite/__init__.py,sha256=u3lEc0j47s7Dad_2SVWOZ6EU2aOMRWqE_WrQ17HmBsA,489 +sqlalchemy/testing/suite/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_cte.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_insert.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_results.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_select.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_types.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-310.pyc,, +sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-310.pyc,, +sqlalchemy/testing/suite/test_cte.py,sha256=shi2WJZpzAzDCdkmzx0IDEu-URsLLBsdyFdzDqsfpyw,6387 +sqlalchemy/testing/suite/test_ddl.py,sha256=BZuYkKaG_tNUkZcFLNd6o1qnfbzU0IYiedCw_NhOJBg,12143 +sqlalchemy/testing/suite/test_deprecations.py,sha256=0LUmXIiK8hHUr6tY8cJJC7VErOj9YNGNN-c324k08Dw,5204 +sqlalchemy/testing/suite/test_dialect.py,sha256=XpwZxIXlMVsZlP74khuPW2wZskinT0IOT9S6PM5PyE8,11256 +sqlalchemy/testing/suite/test_insert.py,sha256=QlMovNeDU-GB5UvTEumce3LLK94PAduKlWe2TqCcLF4,11501 +sqlalchemy/testing/suite/test_reflection.py,sha256=nJNt13Z62x2SSaJkxGZkPa78KApE5upWttW9mJHzpGA,59868 +sqlalchemy/testing/suite/test_results.py,sha256=wA4SjK46-1TCqqXcOw_a7_9ajMkF3aU4tuLOK9iVWyI,14409 +sqlalchemy/testing/suite/test_rowcount.py,sha256=0kswa4gunxRreCpRkFR7Yxff0k0o-2R8fugMmOGcANg,5042 +sqlalchemy/testing/suite/test_select.py,sha256=fFQg5DuGyNSTeBfW5hmSqiuAvPx0FUyCYKbETaCfeVQ,57247 +sqlalchemy/testing/suite/test_sequence.py,sha256=2KBcs0FtoL3gk37IN2PnRZSnQwt7RKkShAbYQHFTBcw,8713 +sqlalchemy/testing/suite/test_types.py,sha256=ur57ApD3PU_AslebV8f5MECRy68XuGqJFmBcsIwcRz4,49552 +sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=HhAM4_38vpwJFX2d9xh0S_YAIQJQ-79GmfO3ich2Tu4,6943 +sqlalchemy/testing/suite/test_update_delete.py,sha256=5moBXgVXSHmSIJI26CfxT6K51-4z8Ftg2uaVOjeDKBs,1685 +sqlalchemy/testing/util.py,sha256=mAbW7RfBqC3iRdj0HXy8wU8L7Z49gLVwZ3-DAOHFxDM,12961 +sqlalchemy/testing/warnings.py,sha256=5_UhjnFmjWnNDQnGm1YL3XgX6HzsPw_cgP0S0Kb7XCA,2352 +sqlalchemy/types.py,sha256=852TfWyZz9HATV9qyb0UcvqYNb8h8vsR03J_avMvIgw,3114 +sqlalchemy/util/__init__.py,sha256=-y60JqqdTX0SDsMTX6UUVBv3O75J72YfhonUzaMxleY,6548 +sqlalchemy/util/__pycache__/__init__.cpython-310.pyc,, +sqlalchemy/util/__pycache__/_collections.cpython-310.pyc,, +sqlalchemy/util/__pycache__/_compat_py3k.cpython-310.pyc,, +sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-310.pyc,, +sqlalchemy/util/__pycache__/_preloaded.cpython-310.pyc,, +sqlalchemy/util/__pycache__/compat.cpython-310.pyc,, +sqlalchemy/util/__pycache__/concurrency.cpython-310.pyc,, +sqlalchemy/util/__pycache__/deprecations.cpython-310.pyc,, +sqlalchemy/util/__pycache__/langhelpers.cpython-310.pyc,, +sqlalchemy/util/__pycache__/queue.cpython-310.pyc,, +sqlalchemy/util/__pycache__/topological.cpython-310.pyc,, +sqlalchemy/util/_collections.py,sha256=zO9bwIkL4UsFchxdXioG7_2vkpl9FoivCDNV3TVYqsk,30228 +sqlalchemy/util/_compat_py3k.py,sha256=KYniz_uePhjNtnFU4uCzdSm8xV07AMHaup9p1GbypzM,2262 +sqlalchemy/util/_concurrency_py3k.py,sha256=2ZjMjNTYx_KpOHTb51RoB3BfXfqHSIJHNGh15zCIVHo,6792 +sqlalchemy/util/_preloaded.py,sha256=sbQl4HD8GDVcf2aTh8_EuQKcFMZrJAd7K-9Wn4fze6I,2464 +sqlalchemy/util/compat.py,sha256=NHZdvRyb2regNCmYRAio_bFSD7sh4L3KFcy4cwKXe0k,18913 +sqlalchemy/util/concurrency.py,sha256=abTqffi0MZcq7pbhws78qV1CAt3v1L2sgXwtr8i5yU0,2351 +sqlalchemy/util/deprecations.py,sha256=N417GuIN1cBYOwUzRh1tndxEa0ew1tR7JryT31T2ngA,12191 +sqlalchemy/util/langhelpers.py,sha256=UlBjFpF5lmz4BfwGN7e_xYgzbO735dTNrlF_A6hFux0,58233 +sqlalchemy/util/queue.py,sha256=k4Dm1vMGCfRIE4aI7vQ_F0MeOYn5wUVfkn01awf6x70,9584 +sqlalchemy/util/topological.py,sha256=PhgKMik0lWCTJwavGcv_CksRKE9UuP0vXRHCMh4NXfA,2959 diff --git a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/REQUESTED b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/REQUESTED similarity index 100% rename from sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/REQUESTED rename to sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/REQUESTED diff --git a/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/WHEEL b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/WHEEL new file mode 100644 index 0000000..93f1ef4 --- /dev/null +++ b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: false +Tag: cp310-cp310-win_amd64 + diff --git a/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/top_level.txt new file mode 100644 index 0000000..39fb2be --- /dev/null +++ b/sbsheriff/Lib/site-packages/SQLAlchemy-1.4.41.dist-info/top_level.txt @@ -0,0 +1 @@ +sqlalchemy diff --git a/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/AUTHORS b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/AUTHORS new file mode 100644 index 0000000..42a5c22 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/AUTHORS @@ -0,0 +1,51 @@ +Original Authors +---------------- +* Armin Rigo +* Christian Tismer + +Contributors +------------ +* Al Stone +* Alexander Schmidt +* Alexey Borzenkov +* Andreas Schwab +* Armin Ronacher +* Bin Wang +* Bob Ippolito +* ChangBo Guo +* Christoph Gohlke +* Denis Bilenko +* Dirk Mueller +* Donovan Preston +* Fantix King +* Floris Bruynooghe +* Fredrik Fornwall +* Gerd Woetzel +* Giel van Schijndel +* Gökhan Karabulut +* Gustavo Niemeyer +* Guy Rozendorn +* Hye-Shik Chang +* Jared Kuolt +* Jason Madden +* Josh Snyder +* Kyle Ambroff +* Laszlo Boszormenyi +* Mao Han +* Marc Abramowitz +* Marc Schlaich +* Marcin Bachry +* Matt Madison +* Matt Turner +* Michael Ellerman +* Michael Matz +* Ralf Schmitt +* Robie Basak +* Ronny Pfannschmidt +* Samual M. Rushing +* Tony Bowles +* Tony Breeds +* Trevor Bowen +* Tulio Magno Quites Machado Filho +* Ulrich Weigand +* Victor Stinner diff --git a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/INSTALLER similarity index 100% rename from sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/top_level.txt rename to sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/INSTALLER diff --git a/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/LICENSE b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/LICENSE new file mode 100644 index 0000000..b73a4a1 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/LICENSE @@ -0,0 +1,30 @@ +The following files are derived from Stackless Python and are subject to the +same license as Stackless Python: + + src/greenlet/slp_platformselect.h + files in src/greenlet/platform/ directory + +See LICENSE.PSF and http://www.stackless.com/ for details. + +Unless otherwise noted, the files in greenlet have been released under the +following MIT license: + +Copyright (c) Armin Rigo, Christian Tismer and contributors + +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/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/LICENSE.PSF b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/LICENSE.PSF new file mode 100644 index 0000000..d3b509a --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/LICENSE.PSF @@ -0,0 +1,47 @@ +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011 Python Software Foundation; All Rights Reserved" are retained in Python +alone or in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. diff --git a/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/METADATA b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/METADATA new file mode 100644 index 0000000..23b5f72 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: greenlet +Version: 1.1.3 +Summary: Lightweight in-process concurrent programming +Home-page: https://greenlet.readthedocs.io/ +Author: Alexey Borzenkov +Author-email: snaury@gmail.com +Maintainer: Jason Madden +Maintainer-email: jason@nextthought.com +License: MIT License +Project-URL: Bug Tracker, https://github.com/python-greenlet/greenlet/issues +Project-URL: Source Code, https://github.com/python-greenlet/greenlet/ +Project-URL: Documentation, https://greenlet.readthedocs.io/ +Keywords: greenlet coroutine concurrency threads cooperative +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Programming Language :: C +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +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: Operating System :: OS Independent +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.* +Description-Content-Type: text/x-rst +License-File: LICENSE +License-File: LICENSE.PSF +License-File: AUTHORS +Provides-Extra: docs +Requires-Dist: Sphinx ; extra == 'docs' +Provides-Extra: test + +.. This file is included into docs/history.rst + +.. image:: https://github.com/python-greenlet/greenlet/workflows/tests/badge.svg + :target: https://github.com/python-greenlet/greenlet/actions + +Greenlets are lightweight coroutines for in-process concurrent +programming. + +The "greenlet" package is a spin-off of `Stackless`_, a version of +CPython that supports micro-threads called "tasklets". Tasklets run +pseudo-concurrently (typically in a single or a few OS-level threads) +and are synchronized with data exchanges on "channels". + +A "greenlet", on the other hand, is a still more primitive notion of +micro-thread with no implicit scheduling; coroutines, in other words. +This is useful when you want to control exactly when your code runs. +You can build custom scheduled micro-threads on top of greenlet; +however, it seems that greenlets are useful on their own as a way to +make advanced control flow structures. For example, we can recreate +generators; the difference with Python's own generators is that our +generators can call nested functions and the nested functions can +yield values too. (Additionally, you don't need a "yield" keyword. See +the example in `test_generator.py +`_). + +Greenlets are provided as a C extension module for the regular unmodified +interpreter. + +.. _`Stackless`: http://www.stackless.com + + +Who is using Greenlet? +====================== + +There are several libraries that use Greenlet as a more flexible +alternative to Python's built in coroutine support: + + - `Concurrence`_ + - `Eventlet`_ + - `Gevent`_ + +.. _Concurrence: http://opensource.hyves.org/concurrence/ +.. _Eventlet: http://eventlet.net/ +.. _Gevent: http://www.gevent.org/ + +Getting Greenlet +================ + +The easiest way to get Greenlet is to install it with pip:: + + pip install greenlet + + +Source code archives and binary distributions are vailable on the +python package index at https://pypi.org/project/greenlet + +The source code repository is hosted on github: +https://github.com/python-greenlet/greenlet + +Documentation is available on readthedocs.org: +https://greenlet.readthedocs.io diff --git a/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/RECORD b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/RECORD new file mode 100644 index 0000000..599a71d --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/RECORD @@ -0,0 +1,71 @@ +../../include/site/python3.10/greenlet/greenlet.h,sha256=muQGuDPNWzBVjWoObFXddpDP_DLeE2GtdnF41cyYgy0,4648 +greenlet-1.1.3.dist-info/AUTHORS,sha256=swW28t2knVRxRkaEQNZtO7MP9Sgnompb7B6cNgJM8Gk,849 +greenlet-1.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +greenlet-1.1.3.dist-info/LICENSE,sha256=dpgx1uXfrywggC-sz_H6-0wgJd2PYlPfpH_K1Z1NCXk,1434 +greenlet-1.1.3.dist-info/LICENSE.PSF,sha256=5f88I8EQ5JTNfXNsEP2W1GJFe6_soxCEDbZScpjH1Gs,2424 +greenlet-1.1.3.dist-info/METADATA,sha256=DQAWGnxur5YBtMAo1zxHoCE1xEBsLwFP-df-a0A7oWU,3930 +greenlet-1.1.3.dist-info/RECORD,, +greenlet-1.1.3.dist-info/WHEEL,sha256=W26pYN7HLsBT1jrDSL9udgf_mdNKJmYmL23sIP-FcgM,102 +greenlet-1.1.3.dist-info/top_level.txt,sha256=YSnRsCRoO61JGlP57o8iKL6rdLWDWuiyKD8ekpWUsDc,9 +greenlet/__init__.py,sha256=f2pBI8kauTC7tFFi8r-JUUPXuthYvspSRCNENiqAH8k,1323 +greenlet/__pycache__/__init__.cpython-310.pyc,, +greenlet/_greenlet.cp310-win_amd64.pyd,sha256=KlMu-ohRHk28Xr-eUdM0rS9bzknuJmnK8HAgDkI3atc,29184 +greenlet/greenlet.c,sha256=tTKIwaPu9MhiGwhtlSkWWbSTXPbddgY-Xoq7xUfvfpA,67295 +greenlet/greenlet.h,sha256=muQGuDPNWzBVjWoObFXddpDP_DLeE2GtdnF41cyYgy0,4648 +greenlet/platform/setup_switch_x64_masm.cmd,sha256=ZpClUJeU0ujEPSTWNSepP0W2f9XiYQKA8QKSoVou8EU,143 +greenlet/platform/switch_aarch64_gcc.h,sha256=TRH22e9TNRA_mys8hhLbNwz3efZk7BtKZhyhK7ucgyM,2385 +greenlet/platform/switch_alpha_unix.h,sha256=T6kOBiHy3hLmy1vrmFrxbnOnRu0EJkoG_yuWy7fykZ4,689 +greenlet/platform/switch_amd64_unix.h,sha256=KWB4PB2wcAaWvWbMzcq8tYBe02vEGPBCRMnHnfeI7gE,2610 +greenlet/platform/switch_arm32_gcc.h,sha256=wflI2cGZBfLzM_GGgYx3OrFeoOq7OTsJP53dKLsrxS0,2488 +greenlet/platform/switch_arm32_ios.h,sha256=yQZXCa0AZbyAIS9tKceyTCrRYlihpFBKDbiPCn_3im0,1901 +greenlet/platform/switch_csky_gcc.h,sha256=GHlaVXrzQuSkrDqgL7-Ji9YwZnprpFhjPznNyp0NnvU,1340 +greenlet/platform/switch_m68k_gcc.h,sha256=VSa6NpZhvyyvF-Q58CTIWSpEDo4FKygOyTz00whctlw,928 +greenlet/platform/switch_mips_unix.h,sha256=9ptMGEBXafee15RxOm5NrxiC2bEnwM9AkxJ7ktVatU8,1444 +greenlet/platform/switch_ppc64_aix.h,sha256=ADpifLPlr6pTdT76bt6ozcqPjHrfPsJ93lQfc1VNaug,3878 +greenlet/platform/switch_ppc64_linux.h,sha256=jqPKpTg09FzmCn59Kt6OJi2-40aoazFVJcf1YETLlwA,3833 +greenlet/platform/switch_ppc_aix.h,sha256=nClVVlsRlFAI-I3fmivSJyJK7Xzx3_8l3Wf8QNJ9FMU,2959 +greenlet/platform/switch_ppc_linux.h,sha256=J4eKMA73WbPYSaq0yAedzHB6J6ZKE8tIIzkqYxlaA2c,2777 +greenlet/platform/switch_ppc_macosx.h,sha256=bnL2MqIUm9--NHizb5NYijvSrqutvuJx4auYCdqXllM,2642 +greenlet/platform/switch_ppc_unix.h,sha256=5UW9c71NGJh6xksEbAOButBFH168QRyZ5O53yXdXGxg,2670 +greenlet/platform/switch_riscv_unix.h,sha256=c3v3GRDMooslDKQLM75IqokWivtelbAj3-XZK31vWlE,758 +greenlet/platform/switch_s390_unix.h,sha256=9oJkYnyUovPvXOAsVLXoj-Unl_Rr_DidkXYMaRXLS0w,2781 +greenlet/platform/switch_sparc_sun_gcc.h,sha256=0vHXNNCdz-1ioQsw-OtK0ridnBVIzErYWiK7bBu6OgM,2815 +greenlet/platform/switch_x32_unix.h,sha256=ie7Nxo6Cf_x4UVOSA_a3bJYPlRKZ1BvLWsclyQle_SY,1527 +greenlet/platform/switch_x64_masm.asm,sha256=nu6n2sWyXuXfpPx40d9YmLfHXUc1sHgeTvX1kUzuvEM,1841 +greenlet/platform/switch_x64_masm.obj,sha256=GNtTNxYdo7idFUYsQv-mrXWgyT5EJ93-9q90lN6svtQ,1078 +greenlet/platform/switch_x64_msvc.h,sha256=LIeasyKo_vHzspdMzMHbosRhrBfKI4BkQOh4qcTHyJw,1805 +greenlet/platform/switch_x86_msvc.h,sha256=hi0dgp-k14IhMCxwtJtcI_ciPnMGd37uMnMaHaeQVWg,2481 +greenlet/platform/switch_x86_unix.h,sha256=WvY2sNMFIEfoFVNVakl-osygJui3pSnlVj5jBrdaU08,3068 +greenlet/slp_platformselect.h,sha256=-J5Px9Yk7Ths4hQTecC3iadxfte1CYaFoeqfg1lUl-A,3095 +greenlet/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +greenlet/tests/__pycache__/__init__.cpython-310.pyc,, +greenlet/tests/__pycache__/test_contextvars.cpython-310.pyc,, +greenlet/tests/__pycache__/test_cpp.cpython-310.pyc,, +greenlet/tests/__pycache__/test_extension_interface.cpython-310.pyc,, +greenlet/tests/__pycache__/test_gc.cpython-310.pyc,, +greenlet/tests/__pycache__/test_generator.cpython-310.pyc,, +greenlet/tests/__pycache__/test_generator_nested.cpython-310.pyc,, +greenlet/tests/__pycache__/test_greenlet.cpython-310.pyc,, +greenlet/tests/__pycache__/test_leaks.cpython-310.pyc,, +greenlet/tests/__pycache__/test_stack_saved.cpython-310.pyc,, +greenlet/tests/__pycache__/test_throw.cpython-310.pyc,, +greenlet/tests/__pycache__/test_tracing.cpython-310.pyc,, +greenlet/tests/__pycache__/test_version.cpython-310.pyc,, +greenlet/tests/__pycache__/test_weakref.cpython-310.pyc,, +greenlet/tests/_test_extension.c,sha256=Tceb6kMFPSvAPW2LJ_zUlj--Wz_DtLzIPmgZcqkqAEU,5402 +greenlet/tests/_test_extension.cp310-win_amd64.pyd,sha256=Hgf87W9aVeV7knnsuNBbvNoQ5Rf87VfI9swFHXQj3cU,13312 +greenlet/tests/_test_extension_cpp.cp310-win_amd64.pyd,sha256=Y87bPUTHpjwH5D3rUrvcofnGlW3bV7bO2hzEde1bBXM,12800 +greenlet/tests/_test_extension_cpp.cpp,sha256=zKfz0FxBXicq-53rItZ_NP8M406OBtyQFdH5bv_pRmk,3212 +greenlet/tests/test_contextvars.py,sha256=d69XSuRrdU80xAPmzdObLjrjXnbTQChG0MgsvBF_nGM,9205 +greenlet/tests/test_cpp.py,sha256=SXMuqsHTYTxFPBrasdbx5Sgplc89wvYEuPZvwafD-3k,488 +greenlet/tests/test_extension_interface.py,sha256=1FhUkxL-NrxmQV_sxUdlt8tvIWpDcGi27JcdQ6VyvFc,2521 +greenlet/tests/test_gc.py,sha256=oATPCmEAagdf1dZBYfZ0aiDklovLo_pQt5HZNTygCzk,2892 +greenlet/tests/test_generator.py,sha256=_MLDA1kBtZQR-9a74AOZZQECQCIFljMa7vbucE0cOxw,1280 +greenlet/tests/test_generator_nested.py,sha256=pGYRpNn_WjdhY_5ZHHBuBw10wskG_7mjJjR8IqleY3M,3579 +greenlet/tests/test_greenlet.py,sha256=SVDi0e1RrJtJhiOFggmoWTZL1sFdxRpdALFRCie-n60,23427 +greenlet/tests/test_leaks.py,sha256=STvFoZsFsZ_E24kYFaIASGBx97TRgTIur6uJXnoevWc,6677 +greenlet/tests/test_stack_saved.py,sha256=SyIHZycTBfm1TxFsq1VLCAgVm02t5GSke8tT28qwi7c,450 +greenlet/tests/test_throw.py,sha256=OOWfgcEaymvGVJQ3d4xDGzC5IVH0rZAiazWuyZV9270,2755 +greenlet/tests/test_tracing.py,sha256=hZ6Cl5NMq9IaeH7NGqWYl8aQ0_5nFUSYuo6TeSXvrKw,7455 +greenlet/tests/test_version.py,sha256=lHDe3qcLvfsOHcFKFW8yrcl5wBvy6UIxaNkZZzNlpHE,1229 +greenlet/tests/test_weakref.py,sha256=gqAQunjVzbwF6qEUZijhv6UqhH4apWNIRHeoWLUo9tM,884 diff --git a/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/WHEEL b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/WHEEL new file mode 100644 index 0000000..93f1ef4 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: false +Tag: cp310-cp310-win_amd64 + diff --git a/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/top_level.txt new file mode 100644 index 0000000..46725be --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet-1.1.3.dist-info/top_level.txt @@ -0,0 +1 @@ +greenlet diff --git a/sbsheriff/Lib/site-packages/greenlet/__init__.py b/sbsheriff/Lib/site-packages/greenlet/__init__.py new file mode 100644 index 0000000..22db798 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/__init__.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +""" +The root of the greenlet package. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +__all__ = [ + '__version__', + '_C_API', + + 'GreenletExit', + 'error', + + 'getcurrent', + 'greenlet', + + 'gettrace', + 'settrace', +] + +# pylint:disable=no-name-in-module + +### +# Metadata +### +__version__ = '1.1.3' +from ._greenlet import _C_API # pylint:disable=no-name-in-module + +### +# Exceptions +### +from ._greenlet import GreenletExit +from ._greenlet import error + +### +# greenlets +### +from ._greenlet import getcurrent +from ._greenlet import greenlet + +### +# tracing +### +try: + from ._greenlet import gettrace + from ._greenlet import settrace +except ImportError: + # Tracing wasn't supported. + # XXX: The option to disable it was removed in 1.0, + # so this branch should be dead code. + pass + +### +# Constants +# These constants aren't documented and aren't recommended. +# In 1.0, USE_GC and USE_TRACING are always true, and USE_CONTEXT_VARS +# is the same as ``sys.version_info[:2] >= 3.7`` +### +from ._greenlet import GREENLET_USE_CONTEXT_VARS # pylint:disable=unused-import +from ._greenlet import GREENLET_USE_GC # pylint:disable=unused-import +from ._greenlet import GREENLET_USE_TRACING # pylint:disable=unused-import diff --git a/sbsheriff/Lib/site-packages/greenlet/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/greenlet/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62ea4a5a977056e1f728c72c23466c0b66381e13 GIT binary patch literal 846 zcmY+C&5qMB5XbE_ZPPUUh65)maiKyKt+*kCs7h2-T6Iy|g~f_wrH$LQNRw*fmfb!M zH=ctF&yXvpeFemUvAdO6N1pl3coP4|PFkzE1V{Mu>GDO9kl#A^e>fPt$C>>?6A?xt z8d)*jSj?iD3&;glFl-~+%%)^bqT+YTicyJ`qH^TK<&DD}tSLto@km$Lml6!VN_!^vrl~iB^J~$CG*#Vn)m6xA5F&|%>Tbj3*KjTR?j5#FdNgl@i!6>q-==3G^C{&J4UnoY^qw|c*pNyuy zKRNg3{Bq{=;l*U`U(NZa!E~k@e6TngV(QU@)Og`XNTvO$XmE!hYLE!T(zEj6!>%^Capc%ZJ=8rn3`{2=gH zvo?ROhHrw)3{N?jDUdh82eA(_mBMBLaves3XV(JcY87OQ6P?RNkVz$8-rsN*oP@pN wTqaU+-rwHl&f85I?PBpxpLO;ejZM9RM?LCTb_ad&I4$%|%-Xi~*Yh<01Ia(p-~a#s literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/_greenlet.cp310-win_amd64.pyd b/sbsheriff/Lib/site-packages/greenlet/_greenlet.cp310-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..1e8e8b4f58d8c08a66f6b0fa39c145884ee4ae2b GIT binary patch literal 29184 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. + + - the thread state dict is used to save and restore ts_current, + using the dictionary key 'ts_curkey'. +*/ + +extern PyTypeObject PyGreenlet_Type; + +#if PY_VERSION_HEX >= 0x030700A3 +# define GREENLET_PY37 1 +#else +# define GREENLET_PY37 0 +#endif + +#if PY_VERSION_HEX >= 0x30A00B1 +/* +Python 3.10 beta 1 changed tstate->use_tracing to a nested cframe member. +See https://github.com/python/cpython/pull/25276 +We have to save and restore this as well. +*/ +#define TSTATE_USE_TRACING(tstate) (tstate->cframe->use_tracing) +#define GREENLET_USE_CFRAME 1 +#else +#define TSTATE_USE_TRACING(tstate) (tstate->use_tracing) +#define GREENLET_USE_CFRAME 0 +#endif + +#ifndef Py_SET_REFCNT +/* Py_REFCNT and Py_SIZE macros are converted to functions +https://bugs.python.org/issue39573 */ +# define Py_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) +#endif + +#ifndef _Py_DEC_REFTOTAL +/* _Py_DEC_REFTOTAL macro has been removed from Python 3.9 by: + https://github.com/python/cpython/commit/49932fec62c616ec88da52642339d83ae719e924 +*/ +# ifdef Py_REF_DEBUG +# define _Py_DEC_REFTOTAL _Py_RefTotal-- +# else +# define _Py_DEC_REFTOTAL +# endif +#endif + +/* Weak reference to the switching-to greenlet during the slp switch */ +static PyGreenlet* volatile ts_target = NULL; +/* Strong reference to the switching from greenlet after the switch */ +static PyGreenlet* volatile ts_origin = NULL; +/* Strong reference to the current greenlet in this thread state */ +static PyGreenlet* volatile ts_current = NULL; +/* NULL if error, otherwise args tuple to pass around during slp switch */ +static PyObject* volatile ts_passaround_args = NULL; +static PyObject* volatile ts_passaround_kwargs = NULL; + +/* Used internally in ``g_switchstack()`` */ +#if GREENLET_USE_CFRAME +static int volatile ts__g_switchstack_use_tracing = 0; +#endif + +/***********************************************************/ +/* Thread-aware routines, switching global variables when needed */ + +#define STATE_OK \ + (ts_current->run_info == PyThreadState_GET()->dict || \ + !green_updatecurrent()) + +static PyObject* ts_curkey; +static PyObject* ts_delkey; +static PyObject* ts_tracekey; +static PyObject* ts_event_switch; +static PyObject* ts_event_throw; +static PyObject* PyExc_GreenletError; +static PyObject* PyExc_GreenletExit; +static PyObject* ts_empty_tuple; +static PyObject* ts_empty_dict; + +#define GREENLET_GC_FLAGS Py_TPFLAGS_HAVE_GC +#define GREENLET_tp_alloc PyType_GenericAlloc +#define GREENLET_tp_free PyObject_GC_Del +#define GREENLET_tp_traverse green_traverse +#define GREENLET_tp_clear green_clear +#define GREENLET_tp_is_gc green_is_gc + +static void +green_clear_exc(PyGreenlet* g) +{ +#if GREENLET_PY37 + g->exc_info = NULL; + g->exc_state.exc_value = NULL; +#if !GREENLET_PY311 + g->exc_state.exc_type = NULL; + g->exc_state.exc_traceback = NULL; +#endif + g->exc_state.previous_item = NULL; +#else + g->exc_type = NULL; + g->exc_value = NULL; + g->exc_traceback = NULL; +#endif +} + +static PyGreenlet* +green_create_main(void) +{ + PyGreenlet* gmain; + PyObject* dict = PyThreadState_GetDict(); + if (dict == NULL) { + if (!PyErr_Occurred()) { + PyErr_NoMemory(); + } + return NULL; + } + + /* create the main greenlet for this thread */ + gmain = (PyGreenlet*)PyType_GenericAlloc(&PyGreenlet_Type, 0); + if (gmain == NULL) { + return NULL; + } + gmain->stack_start = (char*)1; + gmain->stack_stop = (char*)-1; + /* GetDict() returns a borrowed reference. Make it strong. */ + gmain->run_info = dict; + Py_INCREF(dict); + return gmain; +} + +static int +green_updatecurrent(void) +{ + PyObject *exc, *val, *tb; + PyThreadState* tstate; + PyGreenlet* current; + PyGreenlet* previous; + PyObject* deleteme; + +green_updatecurrent_restart: + /* save current exception */ + PyErr_Fetch(&exc, &val, &tb); + + /* get ts_current from the active tstate */ + tstate = PyThreadState_GET(); + if (tstate->dict && + (current = (PyGreenlet*)PyDict_GetItem(tstate->dict, ts_curkey))) { + /* found -- remove it, to avoid keeping a ref */ + Py_INCREF(current); + PyDict_DelItem(tstate->dict, ts_curkey); + } + else { + /* first time we see this tstate */ + current = green_create_main(); + if (current == NULL) { + Py_XDECREF(exc); + Py_XDECREF(val); + Py_XDECREF(tb); + return -1; + } + } + assert(current->run_info == tstate->dict); + +green_updatecurrent_retry: + /* update ts_current as soon as possible, in case of nested switches */ + Py_INCREF(current); + previous = ts_current; + ts_current = current; + + /* save ts_current as the current greenlet of its own thread */ + if (PyDict_SetItem(previous->run_info, ts_curkey, (PyObject*)previous)) { + Py_DECREF(previous); + Py_DECREF(current); + Py_XDECREF(exc); + Py_XDECREF(val); + Py_XDECREF(tb); + return -1; + } + Py_DECREF(previous); + + /* green_dealloc() cannot delete greenlets from other threads, so + it stores them in the thread dict; delete them now. */ + deleteme = PyDict_GetItem(tstate->dict, ts_delkey); + if (deleteme != NULL) { + /* The only reference to these greenlets should be in this list, so + clearing the list should let them be deleted again, triggering + calls to green_dealloc() in the correct thread. This may run + arbitrary Python code? + */ + PyList_SetSlice(deleteme, 0, INT_MAX, NULL); + } + + if (ts_current != current) { + /* some Python code executed above and there was a thread switch, + * so ts_current points to some other thread again. We need to + * delete ts_curkey (it's likely there) and retry. */ + PyDict_DelItem(tstate->dict, ts_curkey); + goto green_updatecurrent_retry; + } + + /* release an extra reference */ + Py_DECREF(current); + /* restore current exception */ + PyErr_Restore(exc, val, tb); + + /* thread switch could happen during PyErr_Restore, in that + case there's nothing to do except restart from scratch. */ + if (ts_current->run_info != tstate->dict) { + goto green_updatecurrent_restart; + } + return 0; +} + +static PyObject* +green_statedict(PyGreenlet* g) +{ + while (!PyGreenlet_STARTED(g)) { + g = g->parent; + if (g == NULL) { + /* garbage collected greenlet in chain */ + return NULL; + } + } + return g->run_info; +} + +/***********************************************************/ + +/* Some functions must not be inlined: + * slp_restore_state, when inlined into slp_switch might cause + it to restore stack over its own local variables + * slp_save_state, when inlined would add its own local + variables to the saved stack, wasting space + * slp_switch, cannot be inlined for obvious reasons + * g_initialstub, when inlined would receive a pointer into its + own stack frame, leading to incomplete stack save/restore +*/ + +#if defined(__GNUC__) && \ + (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define GREENLET_NOINLINE_SUPPORTED +# define GREENLET_NOINLINE(name) __attribute__((noinline)) name +#elif defined(_MSC_VER) && (_MSC_VER >= 1300) +# define GREENLET_NOINLINE_SUPPORTED +# define GREENLET_NOINLINE(name) __declspec(noinline) name +#endif + +#ifdef GREENLET_NOINLINE_SUPPORTED +/* add forward declarations */ +static void GREENLET_NOINLINE(slp_restore_state)(void); +static int GREENLET_NOINLINE(slp_save_state)(char*); +# if !(defined(MS_WIN64) && defined(_M_X64)) +static int GREENLET_NOINLINE(slp_switch)(void); +# endif +static int GREENLET_NOINLINE(g_initialstub)(void*); +# define GREENLET_NOINLINE_INIT() \ + do { \ + } while (0) +#else +/* force compiler to call functions via pointers */ +static void (*slp_restore_state)(void); +static int (*slp_save_state)(char*); +static int (*slp_switch)(void); +static int (*g_initialstub)(void*); +# define GREENLET_NOINLINE(name) cannot_inline_##name +# define GREENLET_NOINLINE_INIT() \ + do { \ + slp_restore_state = GREENLET_NOINLINE(slp_restore_state); \ + slp_save_state = GREENLET_NOINLINE(slp_save_state); \ + slp_switch = GREENLET_NOINLINE(slp_switch); \ + g_initialstub = GREENLET_NOINLINE(g_initialstub); \ + } while (0) +#endif + +/* + * the following macros are spliced into the OS/compiler + * specific code, in order to simplify maintenance. + */ + +#define SLP_SAVE_STATE(stackref, stsizediff) \ + stackref += STACK_MAGIC; \ + if (slp_save_state((char*)stackref)) \ + return -1; \ + if (!PyGreenlet_ACTIVE(ts_target)) \ + return 1; \ + stsizediff = ts_target->stack_start - (char*)stackref + +#define SLP_RESTORE_STATE() slp_restore_state() + +#define SLP_EVAL +#define slp_switch GREENLET_NOINLINE(slp_switch) +#include "slp_platformselect.h" +#undef slp_switch + +#ifndef STACK_MAGIC +# error \ + "greenlet needs to be ported to this platform, or taught how to detect your compiler properly." +#endif /* !STACK_MAGIC */ + +#ifdef EXTERNAL_ASM +/* CCP addition: Make these functions, to be called from assembler. + * The token include file for the given platform should enable the + * EXTERNAL_ASM define so that this is included. + */ + +intptr_t +slp_save_state_asm(intptr_t* ref) +{ + intptr_t diff; + SLP_SAVE_STATE(ref, diff); + return diff; +} + +void +slp_restore_state_asm(void) +{ + SLP_RESTORE_STATE(); +} + +extern int +slp_switch(void); + +#endif + +/***********************************************************/ + +static int +g_save(PyGreenlet* g, char* stop) +{ + /* Save more of g's stack into the heap -- at least up to 'stop' + + g->stack_stop |________| + | | + | __ stop . . . . . + | | ==> . . + |________| _______ + | | | | + | | | | + g->stack_start | | |_______| g->stack_copy + + */ + intptr_t sz1 = g->stack_saved; + intptr_t sz2 = stop - g->stack_start; + assert(g->stack_start != NULL); + if (sz2 > sz1) { + char* c = (char*)PyMem_Realloc(g->stack_copy, sz2); + if (!c) { + PyErr_NoMemory(); + return -1; + } + memcpy(c + sz1, g->stack_start + sz1, sz2 - sz1); + g->stack_copy = c; + g->stack_saved = sz2; + } + return 0; +} + +static void GREENLET_NOINLINE(slp_restore_state)(void) +{ + PyGreenlet* g = ts_target; + PyGreenlet* owner = ts_current; + +#ifdef SLP_BEFORE_RESTORE_STATE + SLP_BEFORE_RESTORE_STATE(); +#endif + + /* Restore the heap copy back into the C stack */ + if (g->stack_saved != 0) { + memcpy(g->stack_start, g->stack_copy, g->stack_saved); + PyMem_Free(g->stack_copy); + g->stack_copy = NULL; + g->stack_saved = 0; + } + if (owner->stack_start == NULL) { + owner = owner->stack_prev; /* greenlet is dying, skip it */ + } + while (owner && owner->stack_stop <= g->stack_stop) { + owner = owner->stack_prev; /* find greenlet with more stack */ + } + g->stack_prev = owner; +} + +static int GREENLET_NOINLINE(slp_save_state)(char* stackref) +{ + /* must free all the C stack up to target_stop */ + char* target_stop = ts_target->stack_stop; + PyGreenlet* owner = ts_current; + assert(owner->stack_saved == 0); + if (owner->stack_start == NULL) { + owner = owner->stack_prev; /* not saved if dying */ + } + else { + owner->stack_start = stackref; + } + +#ifdef SLP_BEFORE_SAVE_STATE + SLP_BEFORE_SAVE_STATE(); +#endif + + while (owner->stack_stop < target_stop) { + /* ts_current is entierely within the area to free */ + if (g_save(owner, owner->stack_stop)) { + return -1; /* XXX */ + } + owner = owner->stack_prev; + } + if (owner != ts_target) { + if (g_save(owner, target_stop)) { + return -1; /* XXX */ + } + } + return 0; +} + +/** + Perform a stack switch according to some global variables + that must be set before calling this function. Those variables + are: + + - ts_current: current greenlet (holds a reference) + - ts_target: greenlet to switch to (weak reference) + - ts_passaround_args: NULL if PyErr_Occurred(), + else a tuple of args sent to ts_target (holds a reference) + - ts_passaround_kwargs: switch kwargs (holds a reference) + + Because the stack switch happens in this function, this function can't use + its own stack (local) variables, set before the switch, and then accessed after the + switch. Global variables beginning with ``ts__g_switchstack`` are used + internally instead. + + On return results are passed via global variables as well: + + - ts_origin: originating greenlet (holds a reference) + - ts_current: current greenlet (holds a reference) + - ts_passaround_args: NULL if PyErr_Occurred(), + else a tuple of args sent to ts_current (holds a reference) + - ts_passaround_kwargs: switch kwargs (holds a reference) + + It is very important that stack switch is 'atomic', i.e. no + calls into other Python code allowed (except very few that + are safe), because global variables are very fragile. +*/ +static int +g_switchstack(void) +{ + int err; + { /* save state */ + PyGreenlet* current = ts_current; + PyThreadState* tstate = PyThreadState_GET(); +#if GREENLET_PY311 + current->recursion_depth = (tstate->recursion_limit + - tstate->recursion_remaining); +#else + current->recursion_depth = tstate->recursion_depth; + current->top_frame = tstate->frame; +#endif +#if GREENLET_PY37 + current->context = tstate->context; +#endif +#if GREENLET_PY37 + current->exc_info = tstate->exc_info; + current->exc_state = tstate->exc_state; +#else + current->exc_type = tstate->exc_type; + current->exc_value = tstate->exc_value; + current->exc_traceback = tstate->exc_traceback; +#endif +#if GREENLET_USE_CFRAME + /* + IMPORTANT: ``cframe`` is a pointer into the STACK. + Thus, because the call to ``slp_switch()`` + changes the contents of the stack, you cannot read from + ``ts_current->cframe`` after that call and necessarily + get the same values you get from reading it here. Anything + you need to restore from now to then must be saved + in a global variable (because we can't use stack variables + here either). + */ + current->cframe = tstate->cframe; + ts__g_switchstack_use_tracing = tstate->cframe->use_tracing; +#if GREENLET_PY311 + current->current_frame = tstate->cframe->current_frame; + current->datastack_chunk = tstate->datastack_chunk; + current->datastack_top = tstate->datastack_top; + current->datastack_limit = tstate->datastack_limit; + PyFrameObject *frame = PyThreadState_GetFrame(tstate); + Py_XDECREF(frame); /* PyThreadState_GetFrame gives us a new reference. */ + current->top_frame = frame; +#endif +#endif + } + + err = slp_switch(); + + if (err < 0) { /* error */ + PyGreenlet* current = ts_current; + current->top_frame = NULL; +#if GREENLET_PY37 + green_clear_exc(current); +#else + current->exc_type = NULL; + current->exc_value = NULL; + current->exc_traceback = NULL; +#endif + + assert(ts_origin == NULL); + ts_target = NULL; + } + else { + PyGreenlet* target = ts_target; + PyGreenlet* origin = ts_current; + PyThreadState* tstate = PyThreadState_GET(); + +#if GREENLET_PY37 + tstate->context = target->context; + target->context = NULL; + /* Incrementing this value invalidates the contextvars cache, + which would otherwise remain valid across switches */ + tstate->context_ver++; +#endif + +#if GREENLET_PY37 + tstate->exc_state = target->exc_state; + tstate->exc_info = + target->exc_info ? target->exc_info : &tstate->exc_state; +#else + tstate->exc_type = target->exc_type; + tstate->exc_value = target->exc_value; + tstate->exc_traceback = target->exc_traceback; +#endif + green_clear_exc(target); + +#if GREENLET_USE_CFRAME + tstate->cframe = target->cframe; + /* + If we were tracing, we need to keep tracing. + There should never be the possibility of hitting the + root_cframe here. See note above about why we can't + just copy this from ``origin->cframe->use_tracing``. + */ + tstate->cframe->use_tracing = ts__g_switchstack_use_tracing; +#endif +#if GREENLET_PY311 + tstate->recursion_remaining = (tstate->recursion_limit + - target->recursion_depth); + tstate->cframe->current_frame = target->current_frame; + tstate->datastack_chunk = target->datastack_chunk; + tstate->datastack_top = target->datastack_top; + tstate->datastack_limit = target->datastack_limit; +#else + tstate->recursion_depth = target->recursion_depth; + tstate->frame = target->top_frame; +#endif + target->top_frame = NULL; + assert(ts_origin == NULL); + Py_INCREF(target); + ts_current = target; + ts_origin = origin; + ts_target = NULL; + } + return err; +} + +static int +g_calltrace(PyObject* tracefunc, PyObject* event, PyGreenlet* origin, + PyGreenlet* target) +{ + PyObject* retval; + PyObject *exc_type, *exc_val, *exc_tb; + PyThreadState* tstate; + PyErr_Fetch(&exc_type, &exc_val, &exc_tb); + tstate = PyThreadState_GET(); + tstate->tracing++; + TSTATE_USE_TRACING(tstate) = 0; + retval = PyObject_CallFunction(tracefunc, "O(OO)", event, origin, target); + tstate->tracing--; + TSTATE_USE_TRACING(tstate) = + (tstate->tracing <= 0 && + ((tstate->c_tracefunc != NULL) || (tstate->c_profilefunc != NULL))); + if (retval == NULL) { + /* In case of exceptions trace function is removed */ + if (PyDict_GetItem(tstate->dict, ts_tracekey)) { + PyDict_DelItem(tstate->dict, ts_tracekey); + } + Py_XDECREF(exc_type); + Py_XDECREF(exc_val); + Py_XDECREF(exc_tb); + return -1; + } + else { + Py_DECREF(retval); + } + PyErr_Restore(exc_type, exc_val, exc_tb); + return 0; +} + +static PyObject* +g_switch(PyGreenlet* target, PyObject* args, PyObject* kwargs) +{ + /* _consumes_ a reference to the args tuple and kwargs dict, + and return a new tuple reference */ + int err = 0; + PyObject* run_info; + + /* check ts_current */ + if (!STATE_OK) { + Py_XDECREF(args); + Py_XDECREF(kwargs); + return NULL; + } + run_info = green_statedict(target); + if (run_info == NULL || run_info != ts_current->run_info) { + Py_XDECREF(args); + Py_XDECREF(kwargs); + PyErr_SetString(PyExc_GreenletError, + run_info ? + "cannot switch to a different thread" : + "cannot switch to a garbage collected greenlet"); + return NULL; + } + + ts_passaround_args = args; + ts_passaround_kwargs = kwargs; + + /* find the real target by ignoring dead greenlets, + and if necessary starting a greenlet. */ + while (target) { + if (PyGreenlet_ACTIVE(target)) { + ts_target = target; + err = g_switchstack(); + break; + } + if (!PyGreenlet_STARTED(target)) { + void* dummymarker; + ts_target = target; + err = g_initialstub(&dummymarker); + if (err == 1) { + continue; /* retry the switch */ + } + break; + } + target = target->parent; + } + + /* For a very short time, immediately after the 'atomic' + g_switchstack() call, global variables are in a known state. + We need to save everything we need, before it is destroyed + by calls into arbitrary Python code. */ + args = ts_passaround_args; + ts_passaround_args = NULL; + kwargs = ts_passaround_kwargs; + ts_passaround_kwargs = NULL; + if (err < 0) { + /* Turn switch errors into switch throws */ + assert(ts_origin == NULL); + Py_CLEAR(kwargs); + Py_CLEAR(args); + } + else { + PyGreenlet* origin; + PyGreenlet* current; + PyObject* tracefunc; + origin = ts_origin; + ts_origin = NULL; + current = ts_current; + if ((tracefunc = PyDict_GetItem(current->run_info, ts_tracekey)) != NULL) { + Py_INCREF(tracefunc); + if (g_calltrace(tracefunc, + args ? ts_event_switch : ts_event_throw, + origin, + current) < 0) { + /* Turn trace errors into switch throws */ + Py_CLEAR(kwargs); + Py_CLEAR(args); + } + Py_DECREF(tracefunc); + } + + Py_DECREF(origin); + } + + /* We need to figure out what values to pass to the target greenlet + based on the arguments that have been passed to greenlet.switch(). If + switch() was just passed an arg tuple, then we'll just return that. + If only keyword arguments were passed, then we'll pass the keyword + argument dict. Otherwise, we'll create a tuple of (args, kwargs) and + return both. */ + if (kwargs == NULL) { + return args; + } + else if (PyDict_Size(kwargs) == 0) { + Py_DECREF(kwargs); + return args; + } + else if (PySequence_Length(args) == 0) { + Py_DECREF(args); + return kwargs; + } + else { + PyObject* tuple = PyTuple_New(2); + if (tuple == NULL) { + Py_DECREF(args); + Py_DECREF(kwargs); + return NULL; + } + PyTuple_SET_ITEM(tuple, 0, args); + PyTuple_SET_ITEM(tuple, 1, kwargs); + return tuple; + } +} + +static PyObject* +g_handle_exit(PyObject* result) +{ + if (result == NULL && PyErr_ExceptionMatches(PyExc_GreenletExit)) { + /* catch and ignore GreenletExit */ + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + if (val == NULL) { + Py_INCREF(Py_None); + val = Py_None; + } + result = val; + Py_DECREF(exc); + Py_XDECREF(tb); + } + if (result != NULL) { + /* package the result into a 1-tuple */ + PyObject* r = result; + result = PyTuple_New(1); + if (result) { + PyTuple_SET_ITEM(result, 0, r); + } + else { + Py_DECREF(r); + } + } + return result; +} + +static int GREENLET_NOINLINE(g_initialstub)(void* mark) +{ + int err; + PyObject *o, *run; + PyObject *exc, *val, *tb; + PyObject* run_info; + PyGreenlet* self = ts_target; + PyObject* args = ts_passaround_args; + PyObject* kwargs = ts_passaround_kwargs; +#if GREENLET_USE_CFRAME + /* + See green_new(). This is a stack-allocated variable used + while *self* is in PyObject_Call(). + We want to defer copying the state info until we're sure + we need it and are in a stable place to do so. + */ + _PyCFrame trace_info; +#endif + /* save exception in case getattr clears it */ + PyErr_Fetch(&exc, &val, &tb); + /* self.run is the object to call in the new greenlet */ + run = PyObject_GetAttrString((PyObject*)self, "run"); + if (run == NULL) { + Py_XDECREF(exc); + Py_XDECREF(val); + Py_XDECREF(tb); + return -1; + } + /* restore saved exception */ + PyErr_Restore(exc, val, tb); + + /* recheck the state in case getattr caused thread switches */ + if (!STATE_OK) { + Py_DECREF(run); + return -1; + } + + /* recheck run_info in case greenlet reparented anywhere above */ + run_info = green_statedict(self); + if (run_info == NULL || run_info != ts_current->run_info) { + Py_DECREF(run); + PyErr_SetString(PyExc_GreenletError, + run_info ? + "cannot switch to a different thread" : + "cannot switch to a garbage collected greenlet"); + return -1; + } + + /* by the time we got here another start could happen elsewhere, + * that means it should now be a regular switch + */ + if (PyGreenlet_STARTED(self)) { + Py_DECREF(run); + ts_passaround_args = args; + ts_passaround_kwargs = kwargs; + return 1; + } + +#if GREENLET_USE_CFRAME + /* OK, we need it, we're about to switch greenlets, save the state. */ + trace_info = *PyThreadState_GET()->cframe; + /* Make the target greenlet refer to the stack value. */ + self->cframe = &trace_info; + /* + And restore the link to the previous frame so this one gets + unliked appropriately. + */ + self->cframe->previous = &PyThreadState_GET()->root_cframe; +#endif + /* start the greenlet */ + self->stack_start = NULL; + self->stack_stop = (char*)mark; + if (ts_current->stack_start == NULL) { + /* ts_current is dying */ + self->stack_prev = ts_current->stack_prev; + } + else { + self->stack_prev = ts_current; + } + self->top_frame = NULL; + green_clear_exc(self); +#if GREENLET_PY311 + self->recursion_depth = (PyThreadState_GET()->recursion_limit + - PyThreadState_GET()->recursion_remaining); +#else + self->recursion_depth = PyThreadState_GET()->recursion_depth; +#endif + + /* restore arguments in case they are clobbered */ + ts_target = self; + ts_passaround_args = args; + ts_passaround_kwargs = kwargs; + + /* perform the initial switch */ + err = g_switchstack(); + + /* returns twice! + The 1st time with ``err == 1``: we are in the new greenlet + The 2nd time with ``err <= 0``: back in the caller's greenlet + */ + if (err == 1) { + /* in the new greenlet */ + PyGreenlet* origin; + PyObject* tracefunc; + PyObject* result; + PyGreenlet* parent; + self->stack_start = (char*)1; /* running */ + + /* grab origin while we still can */ + origin = ts_origin; + ts_origin = NULL; + + /* now use run_info to store the statedict */ + o = self->run_info; + self->run_info = green_statedict(self->parent); + Py_INCREF(self->run_info); + Py_XDECREF(o); + + if ((tracefunc = PyDict_GetItem(self->run_info, ts_tracekey)) != NULL) { + Py_INCREF(tracefunc); + if (g_calltrace(tracefunc, + args ? ts_event_switch : ts_event_throw, + origin, + self) < 0) { + /* Turn trace errors into switch throws */ + Py_CLEAR(kwargs); + Py_CLEAR(args); + } + Py_DECREF(tracefunc); + } + + Py_DECREF(origin); + + if (args == NULL) { + /* pending exception */ + result = NULL; + } + else { + /* call g.run(*args, **kwargs) */ + result = PyObject_Call(run, args, kwargs); + Py_DECREF(args); + Py_XDECREF(kwargs); + } + Py_DECREF(run); + result = g_handle_exit(result); + + /* jump back to parent */ + self->stack_start = NULL; /* dead */ + for (parent = self->parent; parent != NULL; parent = parent->parent) { + result = g_switch(parent, result, NULL); + /* Return here means switch to parent failed, + * in which case we throw *current* exception + * to the next parent in chain. + */ + assert(result == NULL); + } + /* We ran out of parents, cannot continue */ + PyErr_WriteUnraisable((PyObject*)self); + Py_FatalError("greenlets cannot continue"); + } + /* back in the parent */ + if (err < 0) { + /* start failed badly, restore greenlet state */ + self->stack_start = NULL; + self->stack_stop = NULL; + self->stack_prev = NULL; + } + return err; +} + +/***********************************************************/ + +static PyObject* +green_new(PyTypeObject* type, PyObject* args, PyObject* kwds) +{ + PyObject* o = + PyBaseObject_Type.tp_new(type, ts_empty_tuple, ts_empty_dict); + if (o != NULL) { + if (!STATE_OK) { + Py_DECREF(o); + return NULL; + } + Py_INCREF(ts_current); + ((PyGreenlet*)o)->parent = ts_current; +#if GREENLET_USE_CFRAME + /* + The PyThreadState->cframe pointer usually points to memory on the + stack, alloceted in a call into PyEval_EvalFrameDefault. + + Initially, before any evaluation begins, it points to the initial + PyThreadState object's ``root_cframe`` object, which is statically + allocated for the lifetime of the thread. + + A greenlet can last for longer than a call to + PyEval_EvalFrameDefault, so we can't set its ``cframe`` pointer to + be the current ``PyThreadState->cframe``; nor could we use one from + the greenlet parent for the same reason. Yet a further no: we can't + allocate one scoped to the greenlet and then destroy it when the + greenlet is deallocated, because inside the interpreter the CFrame + objects form a linked list, and that too can result in accessing + memory beyond its dynamic lifetime (if the greenlet doesn't actually + finish before it dies, its entry could still be in the list). + + Using the ``root_cframe`` is problematic, though, because its + members are never modified by the interpreter and are set to 0, + meaning that its ``use_tracing`` flag is never updated. We don't + want to modify that value in the ``root_cframe`` ourself: it + *shouldn't* matter much because we should probably never get back to + the point where that's the only cframe on the stack; even if it did + matter, the major consequence of an incorrect value for + ``use_tracing`` is that if its true the interpreter does some extra + work --- however, it's just good code hygiene. + + Our solution: before a greenlet runs, after its initial creation, + it uses the ``root_cframe`` just to have something to put there. + However, once the greenlet is actually switched to for the first + time, ``g_initialstub`` (which doesn't actually "return" while the + greenlet is running) stores a new _PyCFrame on its local stack, and + copies the appropriate values from the currently running CFrame; + this is then made the _PyCFrame for the newly-minted greenlet. + ``g_initialstub`` then proceeds to call ``glet.run()``, which + results in ``PyEval_...`` adding the _PyCFrame to the list. Switches + continue as normal. Finally, when the greenlet finishes, the call to + ``glet.run()`` returns and the _PyCFrame is taken out of the linked + list and the stack value is now unused and free to expire. + */ + ((PyGreenlet*)o)->cframe = &PyThreadState_GET()->root_cframe; +#endif + } + return o; +} + +static int +green_setrun(PyGreenlet* self, PyObject* nrun, void* c); +static int +green_setparent(PyGreenlet* self, PyObject* nparent, void* c); + +static int +green_init(PyGreenlet* self, PyObject* args, PyObject* kwargs) +{ + PyObject* run = NULL; + PyObject* nparent = NULL; + static char* kwlist[] = {"run", "parent", 0}; + if (!PyArg_ParseTupleAndKeywords( + args, kwargs, "|OO:green", kwlist, &run, &nparent)) { + return -1; + } + + if (run != NULL) { + if (green_setrun(self, run, NULL)) { + return -1; + } + } + if (nparent != NULL && nparent != Py_None) { + return green_setparent(self, nparent, NULL); + } + return 0; +} + +static int +kill_greenlet(PyGreenlet* self) +{ + /* Cannot raise an exception to kill the greenlet if + it is not running in the same thread! */ + if (self->run_info == PyThreadState_GET()->dict) { + /* The dying greenlet cannot be a parent of ts_current + because the 'parent' field chain would hold a + reference */ + PyObject* result; + PyGreenlet* oldparent; + PyGreenlet* tmp; + if (!STATE_OK) { + return -1; + } + oldparent = self->parent; + self->parent = ts_current; + Py_INCREF(self->parent); + /* Send the greenlet a GreenletExit exception. */ + PyErr_SetNone(PyExc_GreenletExit); + result = g_switch(self, NULL, NULL); + tmp = self->parent; + self->parent = oldparent; + Py_XDECREF(tmp); + if (result == NULL) { + return -1; + } + Py_DECREF(result); + return 0; + } + else { + /* Not the same thread! Temporarily save the greenlet + into its thread's ts_delkey list. */ + PyObject* lst; + lst = PyDict_GetItem(self->run_info, ts_delkey); + if (lst == NULL) { + lst = PyList_New(0); + if (lst == NULL + || PyDict_SetItem(self->run_info, ts_delkey, lst) < 0) { + return -1; + } + /* PyDict_SetItem now holds a strong reference. PyList_New also + returned a fresh reference. We need to DECREF it now and let + the dictionary keep sole ownership. Frow now on, we're working + with a borrowed reference that will go away when the thread + dies. */ + Py_DECREF(lst); + } + if (PyList_Append(lst, (PyObject*)self) < 0) { + return -1; + } + if (!STATE_OK) { /* to force ts_delkey to be reconsidered */ + return -1; + } + return 0; + } +} + +static int +green_traverse(PyGreenlet* self, visitproc visit, void* arg) +{ + /* We must only visit referenced objects, i.e. only objects + Py_INCREF'ed by this greenlet (directly or indirectly): + - stack_prev is not visited: holds previous stack pointer, but it's not + referenced + - frames are not visited: alive greenlets are not garbage collected + anyway */ + Py_VISIT((PyObject*)self->parent); + Py_VISIT(self->run_info); +#if GREENLET_PY37 + Py_VISIT(self->context); +#endif +#if GREENLET_PY37 + Py_VISIT(self->exc_state.exc_value); +#if !GREENLET_PY311 + Py_VISIT(self->exc_state.exc_type); + Py_VISIT(self->exc_state.exc_traceback); +#endif +#else + Py_VISIT(self->exc_type); + Py_VISIT(self->exc_value); + Py_VISIT(self->exc_traceback); +#endif + Py_VISIT(self->dict); + return 0; +} + +static int +green_is_gc(PyGreenlet* self) +{ + /* Main greenlet can be garbage collected since it can only + become unreachable if the underlying thread exited. + Active greenlet cannot be garbage collected, however. */ + if (PyGreenlet_MAIN(self) || !PyGreenlet_ACTIVE(self)) { + return 1; + } + return 0; +} + +static int +green_clear(PyGreenlet* self) +{ + /* Greenlet is only cleared if it is about to be collected. + Since active greenlets are not garbage collectable, we can + be sure that, even if they are deallocated during clear, + nothing they reference is in unreachable or finalizers, + so even if it switches we are relatively safe. */ + Py_CLEAR(self->parent); + Py_CLEAR(self->run_info); +#if GREENLET_PY37 + Py_CLEAR(self->context); +#endif +#if GREENLET_PY37 + Py_CLEAR(self->exc_state.exc_value); +#if !GREENLET_PY311 + Py_CLEAR(self->exc_state.exc_type); + Py_CLEAR(self->exc_state.exc_traceback); +#endif +#else + Py_CLEAR(self->exc_type); + Py_CLEAR(self->exc_value); + Py_CLEAR(self->exc_traceback); +#endif + Py_CLEAR(self->dict); + return 0; +} + +static void +green_dealloc(PyGreenlet* self) +{ + PyObject *error_type, *error_value, *error_traceback; + Py_ssize_t refcnt; + + PyObject_GC_UnTrack(self); + + if (PyGreenlet_ACTIVE(self) && self->run_info != NULL && + !PyGreenlet_MAIN(self)) { + /* Hacks hacks hacks copied from instance_dealloc() */ + /* Temporarily resurrect the greenlet. */ + assert(Py_REFCNT(self) == 0); + Py_SET_REFCNT(self, 1); + /* Save the current exception, if any. */ + PyErr_Fetch(&error_type, &error_value, &error_traceback); + if (kill_greenlet(self) < 0) { + PyErr_WriteUnraisable((PyObject*)self); + /* XXX what else should we do? */ + } + /* Check for no resurrection must be done while we keep + * our internal reference, otherwise PyFile_WriteObject + * causes recursion if using Py_INCREF/Py_DECREF + */ + if (Py_REFCNT(self) == 1 && PyGreenlet_ACTIVE(self)) { + /* Not resurrected, but still not dead! + XXX what else should we do? we complain. */ + PyObject* f = PySys_GetObject("stderr"); + Py_INCREF(self); /* leak! */ + if (f != NULL) { + PyFile_WriteString("GreenletExit did not kill ", f); + PyFile_WriteObject((PyObject*)self, f, 0); + PyFile_WriteString("\n", f); + } + } + /* Restore the saved exception. */ + PyErr_Restore(error_type, error_value, error_traceback); + /* Undo the temporary resurrection; can't use DECREF here, + * it would cause a recursive call. + */ + assert(Py_REFCNT(self) > 0); + + refcnt = Py_REFCNT(self) - 1; + Py_SET_REFCNT(self, refcnt); + if (refcnt != 0) { + /* Resurrected! */ + _Py_NewReference((PyObject*)self); + Py_SET_REFCNT(self, refcnt); + /* Better to use tp_finalizer slot (PEP 442) + * and call ``PyObject_CallFinalizerFromDealloc``, + * but that's only supported in Python 3.4+; see + * Modules/_io/iobase.c for an example. + * + * The following approach is copied from iobase.c in CPython 2.7. + * (along with much of this function in general). Here's their + * comment: + * + * When called from a heap type's dealloc, the type will be + * decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */ + if (PyType_HasFeature(Py_TYPE(self), Py_TPFLAGS_HEAPTYPE)) { + Py_INCREF(Py_TYPE(self)); + } + + PyObject_GC_Track((PyObject*)self); + + _Py_DEC_REFTOTAL; +#ifdef COUNT_ALLOCS + --Py_TYPE(self)->tp_frees; + --Py_TYPE(self)->tp_allocs; +#endif /* COUNT_ALLOCS */ + return; + } + } + if (self->weakreflist != NULL) { + PyObject_ClearWeakRefs((PyObject*)self); + } + Py_CLEAR(self->parent); + Py_CLEAR(self->run_info); +#if GREENLET_PY37 + Py_CLEAR(self->context); +#endif +#if GREENLET_PY37 + Py_CLEAR(self->exc_state.exc_value); +#if !GREENLET_PY311 + Py_CLEAR(self->exc_state.exc_type); + Py_CLEAR(self->exc_state.exc_traceback); +#endif +#else + Py_CLEAR(self->exc_type); + Py_CLEAR(self->exc_value); + Py_CLEAR(self->exc_traceback); +#endif + Py_CLEAR(self->dict); + Py_TYPE(self)->tp_free((PyObject*)self); +} + +static PyObject* +single_result(PyObject* results) +{ + if (results != NULL && PyTuple_Check(results) && + PyTuple_GET_SIZE(results) == 1) { + PyObject* result = PyTuple_GET_ITEM(results, 0); + Py_INCREF(result); + Py_DECREF(results); + return result; + } + else { + return results; + } +} + +static PyObject* +throw_greenlet(PyGreenlet* self, PyObject* typ, PyObject* val, PyObject* tb) +{ + /* Note: _consumes_ a reference to typ, val, tb */ + PyObject* result = NULL; + PyErr_Restore(typ, val, tb); + if (PyGreenlet_STARTED(self) && !PyGreenlet_ACTIVE(self)) { + /* dead greenlet: turn GreenletExit into a regular return */ + result = g_handle_exit(result); + } + return single_result(g_switch(self, result, NULL)); +} + +PyDoc_STRVAR( + green_switch_doc, + "switch(*args, **kwargs)\n" + "\n" + "Switch execution to this greenlet.\n" + "\n" + "If this greenlet has never been run, then this greenlet\n" + "will be switched to using the body of ``self.run(*args, **kwargs)``.\n" + "\n" + "If the greenlet is active (has been run, but was switch()'ed\n" + "out before leaving its run function), then this greenlet will\n" + "be resumed and the return value to its switch call will be\n" + "None if no arguments are given, the given argument if one\n" + "argument is given, or the args tuple and keyword args dict if\n" + "multiple arguments are given.\n" + "\n" + "If the greenlet is dead, or is the current greenlet then this\n" + "function will simply return the arguments using the same rules as\n" + "above.\n"); + +static PyObject* +green_switch(PyGreenlet* self, PyObject* args, PyObject* kwargs) +{ + Py_INCREF(args); + Py_XINCREF(kwargs); + return single_result(g_switch(self, args, kwargs)); +} + +PyDoc_STRVAR( + green_throw_doc, + "Switches execution to this greenlet, but immediately raises the\n" + "given exception in this greenlet. If no argument is provided, the " + "exception\n" + "defaults to `greenlet.GreenletExit`. The normal exception\n" + "propagation rules apply, as described for `switch`. Note that calling " + "this\n" + "method is almost equivalent to the following::\n" + "\n" + " def raiser():\n" + " raise typ, val, tb\n" + " g_raiser = greenlet(raiser, parent=g)\n" + " g_raiser.switch()\n" + "\n" + "except that this trick does not work for the\n" + "`greenlet.GreenletExit` exception, which would not propagate\n" + "from ``g_raiser`` to ``g``.\n"); + +static PyObject* +green_throw(PyGreenlet* self, PyObject* args) +{ + PyObject* typ = PyExc_GreenletExit; + PyObject* val = NULL; + PyObject* tb = NULL; + + if (!PyArg_ParseTuple(args, "|OOO:throw", &typ, &val, &tb)) { + return NULL; + } + + /* First, check the traceback argument, replacing None, with NULL */ + if (tb == Py_None) { + tb = NULL; + } + else if (tb != NULL && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "throw() third argument must be a traceback object"); + return NULL; + } + + Py_INCREF(typ); + Py_XINCREF(val); + Py_XINCREF(tb); + + if (PyExceptionClass_Check(typ)) { + PyErr_NormalizeException(&typ, &val, &tb); + } + else if (PyExceptionInstance_Check(typ)) { + /* Raising an instance. The value should be a dummy. */ + if (val && val != Py_None) { + PyErr_SetString( + PyExc_TypeError, + "instance exception may not have a separate value"); + goto failed_throw; + } + else { + /* Normalize to raise , */ + Py_XDECREF(val); + val = typ; + typ = PyExceptionInstance_Class(typ); + Py_INCREF(typ); + } + } + else { + /* Not something you can raise. throw() fails. */ + PyErr_Format(PyExc_TypeError, + "exceptions must be classes, or instances, not %s", + Py_TYPE(typ)->tp_name); + goto failed_throw; + } + + return throw_greenlet(self, typ, val, tb); + +failed_throw: + /* Didn't use our arguments, so restore their original refcounts */ + Py_DECREF(typ); + Py_XDECREF(val); + Py_XDECREF(tb); + return NULL; +} + +static int +green_bool(PyGreenlet* self) +{ + return PyGreenlet_ACTIVE(self); +} + +static PyObject* +green_getdict(PyGreenlet* self, void* c) +{ + if (self->dict == NULL) { + self->dict = PyDict_New(); + if (self->dict == NULL) { + return NULL; + } + } + Py_INCREF(self->dict); + return self->dict; +} + +static int +green_setdict(PyGreenlet* self, PyObject* val, void* c) +{ + PyObject* tmp; + + if (val == NULL) { + PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted"); + return -1; + } + if (!PyDict_Check(val)) { + PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary"); + return -1; + } + tmp = self->dict; + Py_INCREF(val); + self->dict = val; + Py_XDECREF(tmp); + return 0; +} + +static int +_green_not_dead(PyGreenlet* self) +{ + return PyGreenlet_ACTIVE(self) || !PyGreenlet_STARTED(self); +} + + +static PyObject* +green_getdead(PyGreenlet* self, void* c) +{ + if (_green_not_dead(self)) { + Py_RETURN_FALSE; + } + else { + Py_RETURN_TRUE; + } +} + +static PyObject* +green_get_stack_saved(PyGreenlet* self, void* c) +{ + return PyLong_FromSsize_t(self->stack_saved); +} + +static PyObject* +green_getrun(PyGreenlet* self, void* c) +{ + if (PyGreenlet_STARTED(self) || self->run_info == NULL) { + PyErr_SetString(PyExc_AttributeError, "run"); + return NULL; + } + Py_INCREF(self->run_info); + return self->run_info; +} + +static int +green_setrun(PyGreenlet* self, PyObject* nrun, void* c) +{ + PyObject* o; + if (PyGreenlet_STARTED(self)) { + PyErr_SetString(PyExc_AttributeError, + "run cannot be set " + "after the start of the greenlet"); + return -1; + } + o = self->run_info; + self->run_info = nrun; + Py_XINCREF(nrun); + Py_XDECREF(o); + return 0; +} + +static PyObject* +green_getparent(PyGreenlet* self, void* c) +{ + PyObject* result = self->parent ? (PyObject*)self->parent : Py_None; + Py_INCREF(result); + return result; +} + +static int +green_setparent(PyGreenlet* self, PyObject* nparent, void* c) +{ + PyGreenlet* p; + PyObject* run_info = NULL; + if (nparent == NULL) { + PyErr_SetString(PyExc_AttributeError, "can't delete attribute"); + return -1; + } + if (!PyGreenlet_Check(nparent)) { + PyErr_SetString(PyExc_TypeError, "parent must be a greenlet"); + return -1; + } + for (p = (PyGreenlet*)nparent; p; p = p->parent) { + if (p == self) { + PyErr_SetString(PyExc_ValueError, "cyclic parent chain"); + return -1; + } + run_info = PyGreenlet_ACTIVE(p) ? p->run_info : NULL; + } + if (run_info == NULL) { + PyErr_SetString(PyExc_ValueError, + "parent must not be garbage collected"); + return -1; + } + if (PyGreenlet_STARTED(self) && self->run_info != run_info) { + PyErr_SetString(PyExc_ValueError, + "parent cannot be on a different thread"); + return -1; + } + p = self->parent; + self->parent = (PyGreenlet*)nparent; + Py_INCREF(nparent); + Py_XDECREF(p); + return 0; +} + +#ifdef Py_CONTEXT_H +# define GREENLET_NO_CONTEXTVARS_REASON "This build of greenlet" +#else +# define GREENLET_NO_CONTEXTVARS_REASON "This Python interpreter" +#endif + +static PyObject* +green_getcontext(PyGreenlet* self, void* c) +{ +#if GREENLET_PY37 + PyThreadState* tstate = PyThreadState_GET(); + PyObject* result; + + if (!STATE_OK) { + return NULL; + } + if (PyGreenlet_ACTIVE(self) && self->top_frame == NULL) { + /* Currently running greenlet: context is stored in the thread state, + not the greenlet object. */ + if (self == ts_current) { + result = tstate->context; + } + else { + PyErr_SetString(PyExc_ValueError, + "cannot get context of a " + "greenlet that is running in a different thread"); + return NULL; + } + } + else { + /* Greenlet is not running: just return context. */ + result = self->context; + } + if (result == NULL) { + result = Py_None; + } + Py_INCREF(result); + return result; +#else + PyErr_SetString(PyExc_AttributeError, + GREENLET_NO_CONTEXTVARS_REASON + " does not support context variables"); + return NULL; +#endif +} + +static int +green_setcontext(PyGreenlet* self, PyObject* nctx, void* c) +{ +#if GREENLET_PY37 + PyThreadState* tstate; + PyObject* octx = NULL; + if (!STATE_OK) { + return -1; + } + if (nctx == NULL) { + PyErr_SetString(PyExc_AttributeError, "can't delete attribute"); + return -1; + } + if (nctx == Py_None) { + /* "Empty context" is stored as NULL, not None. */ + nctx = NULL; + } + else if (!PyContext_CheckExact(nctx)) { + PyErr_SetString(PyExc_TypeError, + "greenlet context must be a " + "contextvars.Context or None"); + return -1; + } + tstate = PyThreadState_GET(); + if (PyGreenlet_ACTIVE(self) && self->top_frame == NULL) { + /* Currently running greenlet: context is stored in the thread state, + not the greenlet object. */ + if (self == ts_current) { + octx = tstate->context; + tstate->context = nctx; + tstate->context_ver++; + Py_XINCREF(nctx); + } + else { + PyErr_SetString(PyExc_ValueError, + "cannot set context of a " + "greenlet that is running in a different thread"); + return -1; + } + } + else { + /* Greenlet is not running: just set context. */ + octx = self->context; + self->context = nctx; + Py_XINCREF(nctx); + } + Py_XDECREF(octx); + return 0; +#else + PyErr_SetString(PyExc_AttributeError, + GREENLET_NO_CONTEXTVARS_REASON + " does not support context variables"); + return -1; +#endif +} + +#undef GREENLET_NO_CONTEXTVARS_REASON + +static PyObject* +green_getframe(PyGreenlet* self, void* c) +{ + PyObject* result = self->top_frame ? (PyObject*)self->top_frame : Py_None; + Py_INCREF(result); + return result; +} + +static PyObject* +green_getstate(PyGreenlet* self) +{ + PyErr_Format(PyExc_TypeError, + "cannot serialize '%s' object", + Py_TYPE(self)->tp_name); + return NULL; +} + +static PyObject* +green_repr(PyGreenlet* self) +{ + /* + Return a string like + + + The handling of greenlets across threads is not super good. + We mostly use the internal definitions of these terms, but they + generally should make sense to users as well. + */ + PyObject* result; + int never_started = !PyGreenlet_STARTED(self) && !PyGreenlet_ACTIVE(self); + + if (!STATE_OK) { + return NULL; + } + +#if PY_MAJOR_VERSION >= 3 +# define GNative_FromFormat PyUnicode_FromFormat +#else +# define GNative_FromFormat PyString_FromFormat +#endif + + if (_green_not_dead(self)) { + /* XXX: The otid= is almost useless becasue you can't correlate it to + any thread identifier exposed to Python. We could use + PyThreadState_GET()->thread_id, but we'd need to save that in the + greenlet, or save the whole PyThreadState object itself. + + As it stands, its only useful for identifying greenlets from the same thread. + */ + result = GNative_FromFormat( + "<%s object at %p (otid=%p)%s%s%s%s>", + Py_TYPE(self)->tp_name, + self, + self->run_info, + ts_current == self + ? " current" + : (PyGreenlet_STARTED(self) ? " suspended" : ""), + PyGreenlet_ACTIVE(self) ? " active" : "", + never_started ? " pending" : " started", + PyGreenlet_MAIN(self) ? " main" : "" + ); + } + else { + /* main greenlets never really appear dead. */ + result = GNative_FromFormat( + "<%s object at %p (otid=%p) dead>", + Py_TYPE(self)->tp_name, + self, + self->run_info + ); + } +#undef GNative_FromFormat + + return result; +} + +/***************************************************************************** + * C interface + * + * These are exported using the CObject API + */ + +static PyGreenlet* +PyGreenlet_GetCurrent(void) +{ + if (!STATE_OK) { + return NULL; + } + Py_INCREF(ts_current); + return ts_current; +} + +static int +PyGreenlet_SetParent(PyGreenlet* g, PyGreenlet* nparent) +{ + if (!PyGreenlet_Check(g)) { + PyErr_SetString(PyExc_TypeError, "parent must be a greenlet"); + return -1; + } + + return green_setparent((PyGreenlet*)g, (PyObject*)nparent, NULL); +} + +static PyGreenlet* +PyGreenlet_New(PyObject* run, PyGreenlet* parent) +{ + /* XXX: Why doesn't this call green_new()? There's some duplicate + code. */ + PyGreenlet* g = NULL; + g = (PyGreenlet*)PyType_GenericAlloc(&PyGreenlet_Type, 0); + if (g == NULL) { + return NULL; + } + + if (run != NULL) { + Py_INCREF(run); + g->run_info = run; + } + + if (parent != NULL) { + if (PyGreenlet_SetParent(g, parent)) { + Py_DECREF(g); + return NULL; + } + } + else { + if ((g->parent = PyGreenlet_GetCurrent()) == NULL) { + Py_DECREF(g); + return NULL; + } + } +#if GREENLET_USE_CFRAME + g->cframe = &PyThreadState_GET()->root_cframe; +#endif + return g; +} + +static PyObject* +PyGreenlet_Switch(PyGreenlet* g, PyObject* args, PyObject* kwargs) +{ + PyGreenlet* self = (PyGreenlet*)g; + + if (!PyGreenlet_Check(self)) { + PyErr_BadArgument(); + return NULL; + } + + if (args == NULL) { + args = Py_BuildValue("()"); + } + else { + Py_INCREF(args); + } + + if (kwargs != NULL && PyDict_Check(kwargs)) { + Py_INCREF(kwargs); + } + else { + kwargs = NULL; + } + + return single_result(g_switch(self, args, kwargs)); +} + +static PyObject* +PyGreenlet_Throw(PyGreenlet* self, PyObject* typ, PyObject* val, PyObject* tb) +{ + if (!PyGreenlet_Check(self)) { + PyErr_BadArgument(); + return NULL; + } + Py_INCREF(typ); + Py_XINCREF(val); + Py_XINCREF(tb); + return throw_greenlet(self, typ, val, tb); +} + +/** End C API ****************************************************************/ + +static PyMethodDef green_methods[] = { + {"switch", + (PyCFunction)green_switch, + METH_VARARGS | METH_KEYWORDS, + green_switch_doc}, + {"throw", (PyCFunction)green_throw, METH_VARARGS, green_throw_doc}, + {"__getstate__", (PyCFunction)green_getstate, METH_NOARGS, NULL}, + {NULL, NULL} /* sentinel */ +}; + +static PyGetSetDef green_getsets[] = { + {"__dict__", (getter)green_getdict, (setter)green_setdict, /*XXX*/ NULL}, + {"run", (getter)green_getrun, (setter)green_setrun, /*XXX*/ NULL}, + {"parent", (getter)green_getparent, (setter)green_setparent, /*XXX*/ NULL}, + {"gr_frame", (getter)green_getframe, NULL, /*XXX*/ NULL}, + {"gr_context", + (getter)green_getcontext, + (setter)green_setcontext, + /*XXX*/ NULL}, + {"dead", (getter)green_getdead, NULL, /*XXX*/ NULL}, + {"_stack_saved", (getter)green_get_stack_saved, NULL, /*XXX*/ NULL}, + {NULL}}; + +static PyNumberMethods green_as_number = { + NULL, /* nb_add */ + NULL, /* nb_subtract */ + NULL, /* nb_multiply */ +#if PY_MAJOR_VERSION < 3 + NULL, /* nb_divide */ +#endif + NULL, /* nb_remainder */ + NULL, /* nb_divmod */ + NULL, /* nb_power */ + NULL, /* nb_negative */ + NULL, /* nb_positive */ + NULL, /* nb_absolute */ + (inquiry)green_bool, /* nb_bool */ +}; + +PyTypeObject PyGreenlet_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "greenlet.greenlet", /* tp_name */ + sizeof(PyGreenlet), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)green_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc)green_repr, /* tp_repr */ + &green_as_number, /* tp_as _number*/ + 0, /* tp_as _sequence*/ + 0, /* tp_as _mapping*/ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | + GREENLET_GC_FLAGS, /* tp_flags */ + "greenlet(run=None, parent=None) -> greenlet\n\n" + "Creates a new greenlet object (without running it).\n\n" + " - *run* -- The callable to invoke.\n" + " - *parent* -- The parent greenlet. The default is the current " + "greenlet.", /* tp_doc */ + (traverseproc)GREENLET_tp_traverse, /* tp_traverse */ + (inquiry)GREENLET_tp_clear, /* tp_clear */ + 0, /* tp_richcompare */ + offsetof(PyGreenlet, weakreflist), /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + green_methods, /* tp_methods */ + 0, /* tp_members */ + green_getsets, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + offsetof(PyGreenlet, dict), /* tp_dictoffset */ + (initproc)green_init, /* tp_init */ + GREENLET_tp_alloc, /* tp_alloc */ + green_new, /* tp_new */ + GREENLET_tp_free, /* tp_free */ + (inquiry)GREENLET_tp_is_gc, /* tp_is_gc */ +}; + +PyDoc_STRVAR(mod_getcurrent_doc, + "getcurrent() -> greenlet\n" + "\n" + "Returns the current greenlet (i.e. the one which called this " + "function).\n"); + +static PyObject* +mod_getcurrent(PyObject* self) +{ + if (!STATE_OK) { + return NULL; + } + Py_INCREF(ts_current); + return (PyObject*)ts_current; +} + +PyDoc_STRVAR(mod_settrace_doc, + "settrace(callback) -> object\n" + "\n" + "Sets a new tracing function and returns the previous one.\n"); +static PyObject* +mod_settrace(PyObject* self, PyObject* args) +{ + int err; + PyObject* previous; + PyObject* tracefunc; + PyGreenlet* current; + if (!PyArg_ParseTuple(args, "O", &tracefunc)) { + return NULL; + } + if (!STATE_OK) { + return NULL; + } + current = ts_current; + previous = PyDict_GetItem(current->run_info, ts_tracekey); + if (previous == NULL) { + previous = Py_None; + } + Py_INCREF(previous); + if (tracefunc == Py_None) { + err = previous != Py_None ? + PyDict_DelItem(current->run_info, ts_tracekey) : + 0; + } + else { + err = PyDict_SetItem(current->run_info, ts_tracekey, tracefunc); + } + if (err < 0) { + Py_CLEAR(previous); + } + return previous; +} + +PyDoc_STRVAR(mod_gettrace_doc, + "gettrace() -> object\n" + "\n" + "Returns the currently set tracing function, or None.\n"); + +static PyObject* +mod_gettrace(PyObject* self) +{ + PyObject* tracefunc; + if (!STATE_OK) { + return NULL; + } + tracefunc = PyDict_GetItem(ts_current->run_info, ts_tracekey); + if (tracefunc == NULL) { + tracefunc = Py_None; + } + Py_INCREF(tracefunc); + return tracefunc; +} + +static PyMethodDef GreenMethods[] = { + {"getcurrent", + (PyCFunction)mod_getcurrent, + METH_NOARGS, + mod_getcurrent_doc}, + {"settrace", (PyCFunction)mod_settrace, METH_VARARGS, mod_settrace_doc}, + {"gettrace", (PyCFunction)mod_gettrace, METH_NOARGS, mod_gettrace_doc}, + {NULL, NULL} /* Sentinel */ +}; + +static char* copy_on_greentype[] = { + "getcurrent", "error", "GreenletExit", "settrace", "gettrace", NULL}; + +#if PY_MAJOR_VERSION >= 3 +# define INITERROR return NULL + +static struct PyModuleDef greenlet_module_def = { + PyModuleDef_HEAD_INIT, + "greenlet._greenlet", + NULL, + -1, + GreenMethods, +}; + +PyMODINIT_FUNC +PyInit__greenlet(void) +#else +# define INITERROR return + +PyMODINIT_FUNC +init_greenlet(void) +#endif +{ + PyObject* m = NULL; + char** p = NULL; + PyObject* c_api_object; + static void* _PyGreenlet_API[PyGreenlet_API_pointers]; + + GREENLET_NOINLINE_INIT(); + +#if PY_MAJOR_VERSION >= 3 + m = PyModule_Create(&greenlet_module_def); +#else + m = Py_InitModule("greenlet._greenlet", GreenMethods); +#endif + if (m == NULL) { + INITERROR; + } + +#if PY_MAJOR_VERSION >= 3 +# define Greenlet_Intern PyUnicode_InternFromString +#else +# define Greenlet_Intern PyString_InternFromString +#endif + ts_curkey = Greenlet_Intern("__greenlet_ts_curkey"); + ts_delkey = Greenlet_Intern("__greenlet_ts_delkey"); + ts_tracekey = Greenlet_Intern("__greenlet_ts_tracekey"); + ts_event_switch = Greenlet_Intern("switch"); + ts_event_throw = Greenlet_Intern("throw"); +#undef Greenlet_Intern + + if (ts_curkey == NULL || ts_delkey == NULL) { + INITERROR; + } + if (PyType_Ready(&PyGreenlet_Type) < 0) { + INITERROR; + } + PyExc_GreenletError = PyErr_NewException("greenlet.error", NULL, NULL); + if (PyExc_GreenletError == NULL) { + INITERROR; + } + PyExc_GreenletExit = + PyErr_NewException("greenlet.GreenletExit", PyExc_BaseException, NULL); + if (PyExc_GreenletExit == NULL) { + INITERROR; + } + + ts_empty_tuple = PyTuple_New(0); + if (ts_empty_tuple == NULL) { + INITERROR; + } + + ts_empty_dict = PyDict_New(); + if (ts_empty_dict == NULL) { + INITERROR; + } + + ts_current = green_create_main(); + if (ts_current == NULL) { + INITERROR; + } + + Py_INCREF(&PyGreenlet_Type); + PyModule_AddObject(m, "greenlet", (PyObject*)&PyGreenlet_Type); + Py_INCREF(PyExc_GreenletError); + PyModule_AddObject(m, "error", PyExc_GreenletError); + Py_INCREF(PyExc_GreenletExit); + PyModule_AddObject(m, "GreenletExit", PyExc_GreenletExit); + + PyModule_AddObject(m, "GREENLET_USE_GC", PyBool_FromLong(1)); + PyModule_AddObject(m, "GREENLET_USE_TRACING", PyBool_FromLong(1)); + PyModule_AddObject( + m, "GREENLET_USE_CONTEXT_VARS", PyBool_FromLong(GREENLET_PY37)); + + /* also publish module-level data as attributes of the greentype. */ + /* XXX: Why? */ + for (p = copy_on_greentype; *p; p++) { + PyObject* o = PyObject_GetAttrString(m, *p); + if (!o) { + continue; + } + PyDict_SetItemString(PyGreenlet_Type.tp_dict, *p, o); + Py_DECREF(o); + } + + /* + * Expose C API + */ + + /* types */ + _PyGreenlet_API[PyGreenlet_Type_NUM] = (void*)&PyGreenlet_Type; + + /* exceptions */ + _PyGreenlet_API[PyExc_GreenletError_NUM] = (void*)PyExc_GreenletError; + _PyGreenlet_API[PyExc_GreenletExit_NUM] = (void*)PyExc_GreenletExit; + + /* methods */ + _PyGreenlet_API[PyGreenlet_New_NUM] = (void*)PyGreenlet_New; + _PyGreenlet_API[PyGreenlet_GetCurrent_NUM] = (void*)PyGreenlet_GetCurrent; + _PyGreenlet_API[PyGreenlet_Throw_NUM] = (void*)PyGreenlet_Throw; + _PyGreenlet_API[PyGreenlet_Switch_NUM] = (void*)PyGreenlet_Switch; + _PyGreenlet_API[PyGreenlet_SetParent_NUM] = (void*)PyGreenlet_SetParent; + + /* XXX: Note that our module name is ``greenlet._greenlet``, but for + backwards compatibility with existing C code, we need the _C_API to + be directly in greenlet. + */ + c_api_object = + PyCapsule_New((void*)_PyGreenlet_API, "greenlet._C_API", NULL); + if (c_api_object != NULL) { + PyModule_AddObject(m, "_C_API", c_api_object); + } + +#if PY_MAJOR_VERSION >= 3 + return m; +#endif +} + +#ifdef __clang__ +# pragma clang diagnostic pop +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/greenlet.h b/sbsheriff/Lib/site-packages/greenlet/greenlet.h new file mode 100644 index 0000000..c788b2f --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/greenlet.h @@ -0,0 +1,161 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is deprecated and undocumented. It does not change. */ +#define GREENLET_VERSION "1.0.0" + +#if PY_VERSION_HEX >= 0x30B00A6 +# define GREENLET_PY311 1 + /* _PyInterpreterFrame moved to the internal C API in Python 3.11 */ +# include +#else +# define GREENLET_PY311 0 +# define _PyCFrame CFrame +#endif + +typedef struct _greenlet { + PyObject_HEAD + char* stack_start; + char* stack_stop; + char* stack_copy; + intptr_t stack_saved; + struct _greenlet* stack_prev; + struct _greenlet* parent; + PyObject* run_info; + struct _frame* top_frame; + int recursion_depth; +#if GREENLET_PY311 + _PyInterpreterFrame *current_frame; + _PyStackChunk *datastack_chunk; + PyObject **datastack_top; + PyObject **datastack_limit; +#endif + PyObject* weakreflist; +#if PY_VERSION_HEX >= 0x030700A3 + _PyErr_StackItem* exc_info; + _PyErr_StackItem exc_state; +#else + PyObject* exc_type; + PyObject* exc_value; + PyObject* exc_traceback; +#endif + PyObject* dict; +#if PY_VERSION_HEX >= 0x030700A3 + PyObject* context; +#endif +#if PY_VERSION_HEX >= 0x30A00B1 + _PyCFrame* cframe; +#endif +} PyGreenlet; + +#define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type) +#define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*)-1) +#define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL) +#define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL) +#define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent) + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 8 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void** _PyGreenlet_API = NULL; + +# define PyGreenlet_Type \ + (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) + +# define PyExc_GreenletError \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) + +# define PyExc_GreenletExit \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +# define PyGreenlet_New \ + (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +# define PyGreenlet_GetCurrent \ + (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +# define PyGreenlet_Throw \ + (*(PyObject * (*)(PyGreenlet * self, \ + PyObject * typ, \ + PyObject * val, \ + PyObject * tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +# define PyGreenlet_Switch \ + (*(PyObject * \ + (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +# define PyGreenlet_SetParent \ + (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* Macro that imports greenlet and initializes C API */ +/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we + keep the older definition to be sure older code that might have a copy of + the header still works. */ +# define PyGreenlet_Import() \ + { \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ + } + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/setup_switch_x64_masm.cmd b/sbsheriff/Lib/site-packages/greenlet/platform/setup_switch_x64_masm.cmd new file mode 100644 index 0000000..038ced2 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/setup_switch_x64_masm.cmd @@ -0,0 +1,2 @@ +call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" amd64 +ml64 /nologo /c /Fo switch_x64_masm.obj switch_x64_masm.asm diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_aarch64_gcc.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_aarch64_gcc.h new file mode 100644 index 0000000..0b9d556 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_aarch64_gcc.h @@ -0,0 +1,69 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 07-Sep-16 Add clang support using x register naming. Fredrik Fornwall + * 13-Apr-13 Add support for strange GCC caller-save decisions + * 08-Apr-13 File creation. Michael Matz + * + * NOTES + * + * Simply save all callee saved registers + * + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL +#define STACK_MAGIC 0 +#define REGS_TO_SAVE "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", \ + "x27", "x28", "x30" /* aka lr */, \ + "v8", "v9", "v10", "v11", \ + "v12", "v13", "v14", "v15" + +static int +slp_switch(void) +{ + int err; + void *fp; + register long *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("str x29, %0" : "=m"(fp) : : ); + __asm__ ("mov %0, sp" : "=r" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "add sp,sp,%0\n" + "add x29,x29,%0\n" + : + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + /* SLP_SAVE_STATE macro contains some return statements + (of -1 and 1). It falls through only when + the return value of slp_save_state() is zero, which + is placed in x0. + In that case we (slp_switch) also want to return zero + (also in x0 of course). + Now, some GCC versions (seen with 4.8) think it's a + good idea to save/restore x0 around the call to + slp_restore_state(), instead of simply zeroing it + at the return below. But slp_restore_state + writes random values to the stack slot used for this + save/restore (from when it once was saved above in + SLP_SAVE_STATE, when it was still uninitialized), so + "restoring" that precious zero actually makes us + return random values. There are some ways to make + GCC not use that zero value in the normal return path + (e.g. making err volatile, but that costs a little + stack space), and the simplest is to call a function + that returns an unknown value (which happens to be zero), + so the saved/restored value is unused. */ + __asm__ volatile ("mov %0, #0" : "=r" (err)); + } + __asm__ volatile ("ldr x29, %0" : : "m" (fp) :); + __asm__ volatile ("" : : : REGS_TO_SAVE); + return err; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_alpha_unix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_alpha_unix.h new file mode 100644 index 0000000..216619f --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_alpha_unix.h @@ -0,0 +1,30 @@ +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "$9", "$10", "$11", "$12", "$13", "$14", "$15", \ + "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", "$f8", "$f9" + +static int +slp_switch(void) +{ + register int ret; + register long *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("mov $30, %0" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "addq $30, %0, $30\n\t" + : /* no outputs */ + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("mov $31, %0" : "=r" (ret) : ); + return ret; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_amd64_unix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_amd64_unix.h new file mode 100644 index 0000000..16b99b7 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_amd64_unix.h @@ -0,0 +1,84 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 3-May-13 Ralf Schmitt + * Add support for strange GCC caller-save decisions + * (ported from switch_aarch64_gcc.h) + * 18-Aug-11 Alexey Borzenkov + * Correctly save rbp, csr and cw + * 01-Apr-04 Hye-Shik Chang + * Ported from i386 to amd64. + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for spark + * 31-Avr-02 Armin Rigo + * Added ebx, esi and edi register-saves. + * 01-Mar-02 Samual M. Rushing + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +/* #define STACK_MAGIC 3 */ +/* the above works fine with gcc 2.96, but 2.95.3 wants this */ +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "r12", "r13", "r14", "r15" + +static int +slp_switch(void) +{ + int err; + void* rbp; + void* rbx; + unsigned int csr; + unsigned short cw; + register long *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("fstcw %0" : "=m" (cw)); + __asm__ volatile ("stmxcsr %0" : "=m" (csr)); + __asm__ volatile ("movq %%rbp, %0" : "=m" (rbp)); + __asm__ volatile ("movq %%rbx, %0" : "=m" (rbx)); + __asm__ ("movq %%rsp, %0" : "=g" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "addq %0, %%rsp\n" + "addq %0, %%rbp\n" + : + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + __asm__ volatile ("xorq %%rax, %%rax" : "=a" (err)); + } + __asm__ volatile ("movq %0, %%rbx" : : "m" (rbx)); + __asm__ volatile ("movq %0, %%rbp" : : "m" (rbp)); + __asm__ volatile ("ldmxcsr %0" : : "m" (csr)); + __asm__ volatile ("fldcw %0" : : "m" (cw)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h new file mode 100644 index 0000000..035d6b9 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h @@ -0,0 +1,79 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 14-Aug-06 File creation. Ported from Arm Thumb. Sylvain Baro + * 3-Sep-06 Commented out saving of r1-r3 (r4 already commented out) as I + * read that these do not need to be saved. Also added notes and + * errors related to the frame pointer. Richard Tew. + * + * NOTES + * + * It is not possible to detect if fp is used or not, so the supplied + * switch function needs to support it, so that you can remove it if + * it does not apply to you. + * + * POSSIBLE ERRORS + * + * "fp cannot be used in asm here" + * + * - Try commenting out "fp" in REGS_TO_SAVE. + * + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL +#define STACK_MAGIC 0 +#define REG_SP "sp" +#define REG_SPSP "sp,sp" +#ifdef __thumb__ +#define REG_FP "r7" +#define REG_FPFP "r7,r7" +#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r8", "r9", "r10", "r11", "lr" +#else +#define REG_FP "fp" +#define REG_FPFP "fp,fp" +#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr" +#endif +#if defined(__SOFTFP__) +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL +#elif defined(__VFP_FP__) +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "d8", "d9", "d10", "d11", \ + "d12", "d13", "d14", "d15" +#elif defined(__MAVERICK__) +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "mvf4", "mvf5", "mvf6", "mvf7", \ + "mvf8", "mvf9", "mvf10", "mvf11", \ + "mvf12", "mvf13", "mvf14", "mvf15" +#else +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "f4", "f5", "f6", "f7" +#endif + +static int +#ifdef __GNUC__ +__attribute__((optimize("no-omit-frame-pointer"))) +#endif +slp_switch(void) +{ + void *fp; + register int *stackref, stsizediff; + int result; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("mov r0," REG_FP "\n\tstr r0,%0" : "=m" (fp) : : "r0"); + __asm__ ("mov %0," REG_SP : "=r" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "add " REG_SPSP ",%0\n" + "add " REG_FPFP ",%0\n" + : + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("ldr r0,%1\n\tmov " REG_FP ",r0\n\tmov %0, #0" : "=r" (result) : "m" (fp) : "r0"); + __asm__ volatile ("" : : : REGS_TO_SAVE); + return result; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_arm32_ios.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_arm32_ios.h new file mode 100644 index 0000000..e993707 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_arm32_ios.h @@ -0,0 +1,67 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 31-May-15 iOS support. Ported from arm32. Proton + * + * NOTES + * + * It is not possible to detect if fp is used or not, so the supplied + * switch function needs to support it, so that you can remove it if + * it does not apply to you. + * + * POSSIBLE ERRORS + * + * "fp cannot be used in asm here" + * + * - Try commenting out "fp" in REGS_TO_SAVE. + * + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 +#define REG_SP "sp" +#define REG_SPSP "sp,sp" +#define REG_FP "r7" +#define REG_FPFP "r7,r7" +#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r8", "r10", "r11", "lr" +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "d8", "d9", "d10", "d11", \ + "d12", "d13", "d14", "d15" + +static int +#ifdef __GNUC__ +__attribute__((optimize("no-omit-frame-pointer"))) +#endif +slp_switch(void) +{ + void *fp; + register int *stackref, stsizediff, result; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("str " REG_FP ",%0" : "=m" (fp)); + __asm__ ("mov %0," REG_SP : "=r" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "add " REG_SPSP ",%0\n" + "add " REG_FPFP ",%0\n" + : + : "r" (stsizediff) + : REGS_TO_SAVE /* Clobber registers, force compiler to + * recalculate address of void *fp from REG_SP or REG_FP */ + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ( + "ldr " REG_FP ", %1\n\t" + "mov %0, #0" + : "=r" (result) + : "m" (fp) + : REGS_TO_SAVE /* Force compiler to restore saved registers after this */ + ); + return result; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_csky_gcc.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_csky_gcc.h new file mode 100644 index 0000000..7486b94 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_csky_gcc.h @@ -0,0 +1,48 @@ +#ifdef SLP_EVAL +#define STACK_MAGIC 0 +#define REG_FP "r8" +#ifdef __CSKYABIV2__ +#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r7", "r9", "r10", "r11", "r15",\ + "r16", "r17", "r18", "r19", "r20", "r21", "r22",\ + "r23", "r24", "r25" + +#if defined (__CSKY_HARD_FLOAT__) || (__CSKY_VDSP__) +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "vr8", "vr9", "vr10", "vr11", "vr12",\ + "vr13", "vr14", "vr15" +#else +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL +#endif +#else +#define REGS_TO_SAVE "r9", "r10", "r11", "r12", "r13", "r15" +#endif + + +static int +#ifdef __GNUC__ +__attribute__((optimize("no-omit-frame-pointer"))) +#endif +slp_switch(void) +{ + register int *stackref, stsizediff; + int result; + + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("mov %0, sp" : "=r" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "addu sp,%0\n" + "addu "REG_FP",%0\n" + : + : "r" (stsizediff) + ); + + SLP_RESTORE_STATE(); + } + __asm__ volatile ("movi %0, 0" : "=r" (result)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + + return result; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h new file mode 100644 index 0000000..da761c2 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h @@ -0,0 +1,38 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 2014-01-06 Andreas Schwab + * File created. + */ + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \ + "%a2", "%a3", "%a4" + +static int +slp_switch(void) +{ + int err; + int *stackref, stsizediff; + void *fp, *a5; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("move.l %%fp, %0" : "=m"(fp)); + __asm__ volatile ("move.l %%a5, %0" : "=m"(a5)); + __asm__ ("move.l %%sp, %0" : "=r"(stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ("add.l %0, %%sp; add.l %0, %%fp" : : "r"(stsizediff)); + SLP_RESTORE_STATE(); + __asm__ volatile ("clr.l %0" : "=g" (err)); + } + __asm__ volatile ("move.l %0, %%a5" : : "m"(a5)); + __asm__ volatile ("move.l %0, %%fp" : : "m"(fp)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + return err; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_mips_unix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_mips_unix.h new file mode 100644 index 0000000..1916b26 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_mips_unix.h @@ -0,0 +1,64 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 20-Sep-14 Matt Madison + * Re-code the saving of the gp register for MIPS64. + * 05-Jan-08 Thiemo Seufer + * Ported from ppc. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "$16", "$17", "$18", "$19", "$20", "$21", "$22", \ + "$23", "$30" +static int +slp_switch(void) +{ + register int err; + register int *stackref, stsizediff; +#ifdef __mips64 + uint64_t gpsave; +#endif + __asm__ __volatile__ ("" : : : REGS_TO_SAVE); +#ifdef __mips64 + __asm__ __volatile__ ("sd $28,%0" : "=m" (gpsave) : : ); +#endif + __asm__ ("move %0, $29" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ __volatile__ ( +#ifdef __mips64 + "daddu $29, %0\n" +#else + "addu $29, %0\n" +#endif + : /* no outputs */ + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } +#ifdef __mips64 + __asm__ __volatile__ ("ld $28,%0" : : "m" (gpsave) : ); +#endif + __asm__ __volatile__ ("" : : : REGS_TO_SAVE); + __asm__ __volatile__ ("move %0, $0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h new file mode 100644 index 0000000..e07b8de --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h @@ -0,0 +1,103 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 16-Oct-20 Jesse Gorzinski + * Copied from Linux PPC64 implementation + * 04-Sep-18 Alexey Borzenkov + * Workaround a gcc bug using manual save/restore of r30 + * 21-Mar-18 Tulio Magno Quites Machado Filho + * Added r30 to the list of saved registers in order to fully comply with + * both ppc64 ELFv1 ABI and the ppc64le ELFv2 ABI, that classify this + * register as a nonvolatile register used for local variables. + * 21-Mar-18 Laszlo Boszormenyi + * Save r2 (TOC pointer) manually. + * 10-Dec-13 Ulrich Weigand + * Support ELFv2 ABI. Save float/vector registers. + * 09-Mar-12 Michael Ellerman + * 64-bit implementation, copied from 32-bit. + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + * 31-Jul-12 Trevor Bowen + * Changed memory constraints to register only. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 6 + +#if defined(__ALTIVEC__) +#define ALTIVEC_REGS \ + "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", \ + "v28", "v29", "v30", "v31", +#else +#define ALTIVEC_REGS +#endif + +#define REGS_TO_SAVE "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "r31", \ + "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", \ + "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", \ + "fr30", "fr31", \ + ALTIVEC_REGS \ + "cr2", "cr3", "cr4" + +static int +slp_switch(void) +{ + register int err; + register long *stackref, stsizediff; + void * toc; + void * r30; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("std 2, %0" : "=m" (toc)); + __asm__ volatile ("std 30, %0" : "=m" (r30)); + __asm__ ("mr %0, 1" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + : /* no outputs */ + : "r" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("ld 30, %0" : : "m" (r30)); + __asm__ volatile ("ld 2, %0" : : "m" (toc)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h new file mode 100644 index 0000000..88e6847 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h @@ -0,0 +1,105 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 04-Sep-18 Alexey Borzenkov + * Workaround a gcc bug using manual save/restore of r30 + * 21-Mar-18 Tulio Magno Quites Machado Filho + * Added r30 to the list of saved registers in order to fully comply with + * both ppc64 ELFv1 ABI and the ppc64le ELFv2 ABI, that classify this + * register as a nonvolatile register used for local variables. + * 21-Mar-18 Laszlo Boszormenyi + * Save r2 (TOC pointer) manually. + * 10-Dec-13 Ulrich Weigand + * Support ELFv2 ABI. Save float/vector registers. + * 09-Mar-12 Michael Ellerman + * 64-bit implementation, copied from 32-bit. + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + * 31-Jul-12 Trevor Bowen + * Changed memory constraints to register only. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#if _CALL_ELF == 2 +#define STACK_MAGIC 4 +#else +#define STACK_MAGIC 6 +#endif + +#if defined(__ALTIVEC__) +#define ALTIVEC_REGS \ + "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", \ + "v28", "v29", "v30", "v31", +#else +#define ALTIVEC_REGS +#endif + +#define REGS_TO_SAVE "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "r31", \ + "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", \ + "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", \ + "fr30", "fr31", \ + ALTIVEC_REGS \ + "cr2", "cr3", "cr4" + +static int +slp_switch(void) +{ + register int err; + register long *stackref, stsizediff; + void * toc; + void * r30; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("std 2, %0" : "=m" (toc)); + __asm__ volatile ("std 30, %0" : "=m" (r30)); + __asm__ ("mr %0, 1" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + : /* no outputs */ + : "r" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("ld 30, %0" : : "m" (r30)); + __asm__ volatile ("ld 2, %0" : : "m" (toc)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_aix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_aix.h new file mode 100644 index 0000000..c7d476f --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_aix.h @@ -0,0 +1,87 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 07-Mar-11 Floris Bruynooghe + * Do not add stsizediff to general purpose + * register (GPR) 30 as this is a non-volatile and + * unused by the PowerOpen Environment, therefore + * this was modifying a user register instead of the + * frame pointer (which does not seem to exist). + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 3 + +/* !!!!WARNING!!!! need to add "r31" in the next line if this header file + * is meant to be compiled non-dynamically! + */ +#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "cr2", "cr3", "cr4" +static int +slp_switch(void) +{ + register int err; + register int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("mr %0, 1" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + : /* no outputs */ + : "r" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_linux.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_linux.h new file mode 100644 index 0000000..0a71255 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_linux.h @@ -0,0 +1,84 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + * 31-Jul-12 Trevor Bowen + * Changed memory constraints to register only. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 3 + +/* !!!!WARNING!!!! need to add "r31" in the next line if this header file + * is meant to be compiled non-dynamically! + */ +#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "cr2", "cr3", "cr4" +static int +slp_switch(void) +{ + register int err; + register int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("mr %0, 1" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + "add 30, 30, 11\n" + : /* no outputs */ + : "r" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h new file mode 100644 index 0000000..56e573f --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h @@ -0,0 +1,82 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 3 + +/* !!!!WARNING!!!! need to add "r31" in the next line if this header file + * is meant to be compiled non-dynamically! + */ +#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "cr2", "cr3", "cr4" + +static int +slp_switch(void) +{ + register int err; + register int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("; asm block 2\n\tmr %0, r1" : "=g" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "; asm block 3\n" + "\tmr r11, %0\n" + "\tadd r1, r1, r11\n" + "\tadd r30, r30, r11\n" + : /* no outputs */ + : "g" (stsizediff) + : "r11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_unix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_unix.h new file mode 100644 index 0000000..2b3d307 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_ppc_unix.h @@ -0,0 +1,82 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 3 + +/* !!!!WARNING!!!! need to add "r31" in the next line if this header file + * is meant to be compiled non-dynamically! + */ +#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "cr2", "cr3", "cr4" +static int +slp_switch(void) +{ + register int err; + register int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("mr %0, 1" : "=g" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + "add 30, 30, 11\n" + : /* no outputs */ + : "g" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_riscv_unix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_riscv_unix.h new file mode 100644 index 0000000..5b5ea98 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_riscv_unix.h @@ -0,0 +1,32 @@ +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "s0", "s1", "s2", "s3", "s4", "s5", \ + "s6", "s7", "s8", "s9", "s10", "s11", "fs0", "fs1", \ + "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", \ + "fs10", "fs11" + +static int +slp_switch(void) +{ + register int ret; + register long *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("mv %0, sp" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "add sp, sp, %0\n\t" + : /* no outputs */ + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("mv %0, zero" : "=r" (ret) : ); + return ret; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_s390_unix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_s390_unix.h new file mode 100644 index 0000000..6641854 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_s390_unix.h @@ -0,0 +1,87 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 25-Jan-12 Alexey Borzenkov + * Fixed Linux/S390 port to work correctly with + * different optimization options both on 31-bit + * and 64-bit. Thanks to Stefan Raabe for lots + * of testing. + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 06-Oct-02 Gustavo Niemeyer + * Ported to Linux/S390. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#ifdef __s390x__ +#define STACK_MAGIC 20 /* 20 * 8 = 160 bytes of function call area */ +#else +#define STACK_MAGIC 24 /* 24 * 4 = 96 bytes of function call area */ +#endif + +/* Technically, r11-r13 also need saving, but function prolog starts + with stm(g) and since there are so many saved registers already + it won't be optimized, resulting in all r6-r15 being saved */ +#define REGS_TO_SAVE "r6", "r7", "r8", "r9", "r10", "r14", \ + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15" + +static int +slp_switch(void) +{ + register int ret; + register long *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); +#ifdef __s390x__ + __asm__ volatile ("lgr %0, 15" : "=r" (stackref) : ); +#else + __asm__ volatile ("lr %0, 15" : "=r" (stackref) : ); +#endif + { + SLP_SAVE_STATE(stackref, stsizediff); +/* N.B. + r11 may be used as the frame pointer, and in that case it cannot be + clobbered and needs offsetting just like the stack pointer (but in cases + where frame pointer isn't used we might clobber it accidentally). What's + scary is that r11 is 2nd (and even 1st when GOT is used) callee saved + register that gcc would chose for surviving function calls. However, + since r6-r10 are clobbered above, their cost for reuse is reduced, so + gcc IRA will chose them over r11 (not seeing r11 is implicitly saved), + making it relatively safe to offset in all cases. :) */ + __asm__ volatile ( +#ifdef __s390x__ + "agr 15, %0\n\t" + "agr 11, %0" +#else + "ar 15, %0\n\t" + "ar 11, %0" +#endif + : /* no outputs */ + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("lhi %0, 0" : "=r" (ret) : ); + return ret; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h new file mode 100644 index 0000000..652b57f --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h @@ -0,0 +1,92 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 16-May-15 Alexey Borzenkov + * Move stack spilling code inside save/restore functions + * 30-Aug-13 Floris Bruynooghe + Clean the register windows again before returning. + This does not clobber the PIC register as it leaves + the current window intact and is required for multi- + threaded code to work correctly. + * 08-Mar-11 Floris Bruynooghe + * No need to set return value register explicitly + * before the stack and framepointer are adjusted + * as none of the other registers are influenced by + * this. Also don't needlessly clean the windows + * ('ta %0" :: "i" (ST_CLEAN_WINDOWS)') as that + * clobbers the gcc PIC register (%l7). + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * added support for SunOS sparc with gcc + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + + +#define STACK_MAGIC 0 + + +#if defined(__sparcv9) +#define SLP_FLUSHW __asm__ volatile ("flushw") +#else +#define SLP_FLUSHW __asm__ volatile ("ta 3") /* ST_FLUSH_WINDOWS */ +#endif + +/* On sparc we need to spill register windows inside save/restore functions */ +#define SLP_BEFORE_SAVE_STATE() SLP_FLUSHW +#define SLP_BEFORE_RESTORE_STATE() SLP_FLUSHW + + +static int +slp_switch(void) +{ + register int err; + register int *stackref, stsizediff; + + /* Put current stack pointer into stackref. + * Register spilling is done in save/restore. + */ + __asm__ volatile ("mov %%sp, %0" : "=r" (stackref)); + + { + /* Thou shalt put SLP_SAVE_STATE into a local block */ + /* Copy the current stack onto the heap */ + SLP_SAVE_STATE(stackref, stsizediff); + + /* Increment stack and frame pointer by stsizediff */ + __asm__ volatile ( + "add %0, %%sp, %%sp\n\t" + "add %0, %%fp, %%fp" + : : "r" (stsizediff)); + + /* Copy new stack from it's save store on the heap */ + SLP_RESTORE_STATE(); + + __asm__ volatile ("mov %1, %0" : "=r" (err) : "i" (0)); + return err; + } +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_x32_unix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x32_unix.h new file mode 100644 index 0000000..cb14ec1 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x32_unix.h @@ -0,0 +1,63 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 17-Aug-12 Fantix King + * Ported from amd64. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "r12", "r13", "r14", "r15" + + +static int +slp_switch(void) +{ + void* ebp; + void* ebx; + unsigned int csr; + unsigned short cw; + register int err; + register int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("fstcw %0" : "=m" (cw)); + __asm__ volatile ("stmxcsr %0" : "=m" (csr)); + __asm__ volatile ("movl %%ebp, %0" : "=m" (ebp)); + __asm__ volatile ("movl %%ebx, %0" : "=m" (ebx)); + __asm__ ("movl %%esp, %0" : "=g" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "addl %0, %%esp\n" + "addl %0, %%ebp\n" + : + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("movl %0, %%ebx" : : "m" (ebx)); + __asm__ volatile ("movl %0, %%ebp" : : "m" (ebp)); + __asm__ volatile ("ldmxcsr %0" : : "m" (csr)); + __asm__ volatile ("fldcw %0" : : "m" (cw)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("xorl %%eax, %%eax" : "=a" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_masm.asm b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_masm.asm new file mode 100644 index 0000000..f5c72a2 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_masm.asm @@ -0,0 +1,111 @@ +; +; stack switching code for MASM on x641 +; Kristjan Valur Jonsson, sept 2005 +; + + +;prototypes for our calls +slp_save_state_asm PROTO +slp_restore_state_asm PROTO + + +pushxmm MACRO reg + sub rsp, 16 + .allocstack 16 + movaps [rsp], reg ; faster than movups, but we must be aligned + ; .savexmm128 reg, offset (don't know what offset is, no documentation) +ENDM +popxmm MACRO reg + movaps reg, [rsp] ; faster than movups, but we must be aligned + add rsp, 16 +ENDM + +pushreg MACRO reg + push reg + .pushreg reg +ENDM +popreg MACRO reg + pop reg +ENDM + + +.code +slp_switch PROC FRAME + ;realign stack to 16 bytes after return address push, makes the following faster + sub rsp,8 + .allocstack 8 + + pushxmm xmm15 + pushxmm xmm14 + pushxmm xmm13 + pushxmm xmm12 + pushxmm xmm11 + pushxmm xmm10 + pushxmm xmm9 + pushxmm xmm8 + pushxmm xmm7 + pushxmm xmm6 + + pushreg r15 + pushreg r14 + pushreg r13 + pushreg r12 + + pushreg rbp + pushreg rbx + pushreg rdi + pushreg rsi + + sub rsp, 10h ;allocate the singlefunction argument (must be multiple of 16) + .allocstack 10h +.endprolog + + lea rcx, [rsp+10h] ;load stack base that we are saving + call slp_save_state_asm ;pass stackpointer, return offset in eax + cmp rax, 1 + je EXIT1 + cmp rax, -1 + je EXIT2 + ;actual stack switch: + add rsp, rax + call slp_restore_state_asm + xor rax, rax ;return 0 + +EXIT: + + add rsp, 10h + popreg rsi + popreg rdi + popreg rbx + popreg rbp + + popreg r12 + popreg r13 + popreg r14 + popreg r15 + + popxmm xmm6 + popxmm xmm7 + popxmm xmm8 + popxmm xmm9 + popxmm xmm10 + popxmm xmm11 + popxmm xmm12 + popxmm xmm13 + popxmm xmm14 + popxmm xmm15 + + add rsp, 8 + ret + +EXIT1: + mov rax, 1 + jmp EXIT + +EXIT2: + sar rax, 1 + jmp EXIT + +slp_switch ENDP + +END \ No newline at end of file diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_masm.obj b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_masm.obj new file mode 100644 index 0000000000000000000000000000000000000000..64e3e6b898ec765d4e37075f7b1635ad24c9efa2 GIT binary patch literal 1078 zcmZ{j&ubG=5XWb`DJB@*%~BA=L%=;Gk}d_~52VO$4J4q2U~MY6&1RFl{E&?scGnt@ zn(9GNy!ihFEO@PV4?T&H9`x2*oO!!jlNJZwd!P4xlX&_;U$Bg3z>p zje>}2kp+MsxE|w5hOUr>YC~(=fz6fwPdZd5+Hlb^P3{;ZO@Yuv96GG&+Gx?QfclNd zhy2KN&~>fNnlHQRR;U1cMyQ?hlQ$~k<0KBbB<0uD2#PTjVo+na7Q;#m=@=3m;xJOa zs2V#)&Db`cY;WzTF9)11;SjkVQWE!?bPTC%x3h3^F2;aBns5!i%m4&-*h69;~AUpZR%rDpm!zuXY+kc zFCz-n*^4&c)5~}y3e?r-Evy*n*(lp9r%ti58Y#l5&)rDjx5EbRd}nC+_8znRzz&#& XZ_Fi+`GM=5Rl{n4%KxAK>jC@)Nz=zi literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_msvc.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_msvc.h new file mode 100644 index 0000000..601ea56 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x64_msvc.h @@ -0,0 +1,60 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 26-Sep-02 Christian Tismer + * again as a result of virtualized stack access, + * the compiler used less registers. Needed to + * explicit mention registers in order to get them saved. + * Thanks to Jeff Senn for pointing this out and help. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 01-Mar-02 Christian Tismer + * Initial final version after lots of iterations for i386. + */ + +/* Avoid alloca redefined warning on mingw64 */ +#ifndef alloca +#define alloca _alloca +#endif + +#define STACK_REFPLUS 1 +#define STACK_MAGIC 0 + +/* Use the generic support for an external assembly language slp_switch function. */ +#define EXTERNAL_ASM + +#ifdef SLP_EVAL +/* This always uses the external masm assembly file. */ +#endif + +/* + * further self-processing support + */ + +/* we have IsBadReadPtr available, so we can peek at objects */ +/* +#define STACKLESS_SPY + +#ifdef IMPLEMENT_STACKLESSMODULE +#include "Windows.h" +#define CANNOT_READ_MEM(p, bytes) IsBadReadPtr(p, bytes) + +static int IS_ON_STACK(void*p) +{ + int stackref; + intptr_t stackbase = ((intptr_t)&stackref) & 0xfffff000; + return (intptr_t)p >= stackbase && (intptr_t)p < stackbase + 0x00100000; +} + +#endif +*/ \ No newline at end of file diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_x86_msvc.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x86_msvc.h new file mode 100644 index 0000000..010a22c --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x86_msvc.h @@ -0,0 +1,88 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 26-Sep-02 Christian Tismer + * again as a result of virtualized stack access, + * the compiler used less registers. Needed to + * explicit mention registers in order to get them saved. + * Thanks to Jeff Senn for pointing this out and help. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 01-Mar-02 Christian Tismer + * Initial final version after lots of iterations for i386. + */ + +#define alloca _alloca + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 + +/* Some magic to quell warnings and keep slp_switch() from crashing when built + with VC90. Disable global optimizations, and the warning: frame pointer + register 'ebp' modified by inline assembly code */ +#pragma optimize("g", off) +#pragma warning(disable:4731) + +static int +slp_switch(void) +{ + void* seh; + register int *stackref, stsizediff; + __asm mov eax, fs:[0] + __asm mov [seh], eax + __asm mov stackref, esp; + /* modify EBX, ESI and EDI in order to get them preserved */ + __asm mov ebx, ebx; + __asm xchg esi, edi; + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm { + mov eax, stsizediff + add esp, eax + add ebp, eax + } + SLP_RESTORE_STATE(); + } + __asm mov eax, [seh] + __asm mov fs:[0], eax + return 0; +} + +/* re-enable ebp warning and global optimizations. */ +#pragma optimize("g", on) +#pragma warning(default:4731) + +#endif + +/* + * further self-processing support + */ + +/* we have IsBadReadPtr available, so we can peek at objects */ +#define STACKLESS_SPY + +#ifdef IMPLEMENT_STACKLESSMODULE +#include "Windows.h" +#define CANNOT_READ_MEM(p, bytes) IsBadReadPtr(p, bytes) + +static int IS_ON_STACK(void*p) +{ + int stackref; + int stackbase = ((int)&stackref) & 0xfffff000; + return (int)p >= stackbase && (int)p < stackbase + 0x00100000; +} + +#endif diff --git a/sbsheriff/Lib/site-packages/greenlet/platform/switch_x86_unix.h b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x86_unix.h new file mode 100644 index 0000000..3a95186 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/platform/switch_x86_unix.h @@ -0,0 +1,105 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 3-May-13 Ralf Schmitt + * Add support for strange GCC caller-save decisions + * (ported from switch_aarch64_gcc.h) + * 19-Aug-11 Alexey Borzenkov + * Correctly save ebp, ebx and cw + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'ebx' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for spark + * 31-Avr-02 Armin Rigo + * Added ebx, esi and edi register-saves. + * 01-Mar-02 Samual M. Rushing + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +/* #define STACK_MAGIC 3 */ +/* the above works fine with gcc 2.96, but 2.95.3 wants this */ +#define STACK_MAGIC 0 + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +# define ATTR_NOCLONE __attribute__((noclone)) +#else +# define ATTR_NOCLONE +#endif + +static int +slp_switch(void) +{ + int err; +#ifdef _WIN32 + void *seh; +#endif + void *ebp, *ebx; + unsigned short cw; + register int *stackref, stsizediff; + __asm__ volatile ("" : : : "esi", "edi"); + __asm__ volatile ("fstcw %0" : "=m" (cw)); + __asm__ volatile ("movl %%ebp, %0" : "=m" (ebp)); + __asm__ volatile ("movl %%ebx, %0" : "=m" (ebx)); +#ifdef _WIN32 + __asm__ volatile ( + "movl %%fs:0x0, %%eax\n" + "movl %%eax, %0\n" + : "=m" (seh) + : + : "eax"); +#endif + __asm__ ("movl %%esp, %0" : "=g" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "addl %0, %%esp\n" + "addl %0, %%ebp\n" + : + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + __asm__ volatile ("xorl %%eax, %%eax" : "=a" (err)); + } +#ifdef _WIN32 + __asm__ volatile ( + "movl %0, %%eax\n" + "movl %%eax, %%fs:0x0\n" + : + : "m" (seh) + : "eax"); +#endif + __asm__ volatile ("movl %0, %%ebx" : : "m" (ebx)); + __asm__ volatile ("movl %0, %%ebp" : : "m" (ebp)); + __asm__ volatile ("fldcw %0" : : "m" (cw)); + __asm__ volatile ("" : : : "esi", "edi"); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/sbsheriff/Lib/site-packages/greenlet/slp_platformselect.h b/sbsheriff/Lib/site-packages/greenlet/slp_platformselect.h new file mode 100644 index 0000000..b5e8eb6 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/slp_platformselect.h @@ -0,0 +1,58 @@ +/* + * Platform Selection for Stackless Python + */ + +#if defined(MS_WIN32) && !defined(MS_WIN64) && defined(_M_IX86) && defined(_MSC_VER) +#include "platform/switch_x86_msvc.h" /* MS Visual Studio on X86 */ +#elif defined(MS_WIN64) && defined(_M_X64) && defined(_MSC_VER) || defined(__MINGW64__) +#include "platform/switch_x64_msvc.h" /* MS Visual Studio on X64 */ +#elif defined(__GNUC__) && defined(__amd64__) && defined(__ILP32__) +#include "platform/switch_x32_unix.h" /* gcc on amd64 with x32 ABI */ +#elif defined(__GNUC__) && defined(__amd64__) +#include "platform/switch_amd64_unix.h" /* gcc on amd64 */ +#elif defined(__GNUC__) && defined(__i386__) +#include "platform/switch_x86_unix.h" /* gcc on X86 */ +#elif defined(__GNUC__) && defined(__powerpc64__) && (defined(__linux__) || defined(__FreeBSD__)) +#include "platform/switch_ppc64_linux.h" /* gcc on PowerPC 64-bit */ +#elif defined(__GNUC__) && defined(__PPC__) && (defined(__linux__) || defined(__FreeBSD__)) +#include "platform/switch_ppc_linux.h" /* gcc on PowerPC */ +#elif defined(__GNUC__) && defined(__ppc__) && defined(__APPLE__) +#include "platform/switch_ppc_macosx.h" /* Apple MacOS X on PowerPC */ +#elif defined(__GNUC__) && defined(__powerpc64__) && defined(_AIX) +#include "platform/switch_ppc64_aix.h" /* gcc on AIX/PowerPC 64-bit */ +#elif defined(__GNUC__) && defined(_ARCH_PPC) && defined(_AIX) +#include "platform/switch_ppc_aix.h" /* gcc on AIX/PowerPC */ +#elif defined(__GNUC__) && defined(sparc) +#include "platform/switch_sparc_sun_gcc.h" /* SunOS sparc with gcc */ +#elif defined(__SUNPRO_C) && defined(sparc) && defined(sun) +#include "platform/switch_sparc_sun_gcc.h" /* SunStudio on amd64 */ +#elif defined(__SUNPRO_C) && defined(__amd64__) && defined(sun) +#include "platform/switch_amd64_unix.h" /* SunStudio on amd64 */ +#elif defined(__SUNPRO_C) && defined(__i386__) && defined(sun) +#include "platform/switch_x86_unix.h" /* SunStudio on x86 */ +#elif defined(__GNUC__) && defined(__s390__) && defined(__linux__) +#include "platform/switch_s390_unix.h" /* Linux/S390 */ +#elif defined(__GNUC__) && defined(__s390x__) && defined(__linux__) +#include "platform/switch_s390_unix.h" /* Linux/S390 zSeries (64-bit) */ +#elif defined(__GNUC__) && defined(__arm__) +#ifdef __APPLE__ +#include +#endif +#if TARGET_OS_IPHONE +#include "platform/switch_arm32_ios.h" /* iPhone OS on arm32 */ +#else +#include "platform/switch_arm32_gcc.h" /* gcc using arm32 */ +#endif +#elif defined(__GNUC__) && defined(__mips__) && defined(__linux__) +#include "platform/switch_mips_unix.h" /* Linux/MIPS */ +#elif defined(__GNUC__) && defined(__aarch64__) +#include "platform/switch_aarch64_gcc.h" /* Aarch64 ABI */ +#elif defined(__GNUC__) && defined(__mc68000__) +#include "platform/switch_m68k_gcc.h" /* gcc on m68k */ +#elif defined(__GNUC__) && defined(__csky__) +#include "platform/switch_csky_gcc.h" /* gcc on csky */ +#elif defined(__GNUC__) && defined(__riscv) +#include "platform/switch_riscv_unix.h" /* gcc on RISC-V */ +#elif defined(__GNUC__) && defined(__alpha__) +#include "platform/switch_alpha_unix.h" /* gcc on DEC Alpha */ +#endif diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py b/sbsheriff/Lib/site-packages/greenlet/tests/__init__.py similarity index 100% rename from sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py rename to sbsheriff/Lib/site-packages/greenlet/tests/__init__.py diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..167a8fc8e8e65478f4027f8cd997a9b76bb35eae GIT binary patch literal 187 zcmd1j<>g`kg2cn}$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o11**(xTqIJKxa zCb*<1vm(YNwJfH%B)=#(sVFl&F(oy=I3u+vGc7HqI0?q`$xMnV&MZmQEl5nxPE1cN yj!7>{P0hK31;;)b{S|Jhr>1 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_extension_interface.cpython-310.pyc b/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_extension_interface.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b78eee7065031864c83b8be44c05c952f7a3636c GIT binary patch literal 3530 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 Qzz)WRNhiq2ysW_g17jG7e*gdg literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_generator.cpython-310.pyc b/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_generator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..993137d2eb0ba817bd075ac6bfa3418013c1ade8 GIT binary patch literal 2245 zcmaJ?-EJF26rR~#uh))~1_)6rS{hI*x*$>{?od@lq*Vk$Mk0WOWwhFO#_lH0+L;;m z$8v7!N|YO}cz^_PljqB7DIbz9@@`-T|#w zM3vU7lI@phM=1C%iFY}j2lP!AmCnO|maKT7F7oOAatTuv) zz0$;9D8oisRLDZrhMht$r{mMhrvdbSO^;qBG2$bZu#rcS^zX7WUXMK+q^hHBaPUOv z*tda}-L|6eFcp$GV=AK8Ut;^S=66~u-P|=Qd)j;;A2+q>slz>$by6V{{Ya{;-EQi= z>FBF$ucnfZ-<>-VU+2T>#2s2#@C07rah|};Xll=?i+N$>75%_$q)L)2FyhcGAa-jDcCZJ} z1!BWa_$gUSD6=R2DI@GmEsuzMCV0*Z#3h9zmV7s@fl@LzHteUxTR+K6>ycgFHNE~9 zWG^*YFQ3H3hDz!|*Ss1Qayyq#DOGR6Z4_3OM?Apo%_XeZQ;#F$Hct;_lGtjJ9QMSZ zi*YSUjs|JBSW!@;Y7om1Z;`M8RLog-;X`H=_zj|JoQPQDMFHJ@RB_k!dEuJY zmPTTyo#kt=Jb;fPbrlKj}Ib@ZK zgLi0aQDej;b(3aPFhD>=1akMOIC%q8M*(d6fF5^nji~2#UBU$FZ($oen_`-ES3(uo zm7QrP`WD@3A)p8*x}gi`_cZ9RpXWkKG@;%)rk-QC@W=cC`*G!%h$R9yE+6|Z*@-vu zL7k)Zqg7PtOZt~|m?-_m*Vw67^rkqhFPMefFpWCUw@8o~=2R{nb5cn;gi3ID4AsGW zgDa^t??@Y_{l3hFBMDKA=ay&4gQg$RED!1((*7yTpuB3tuPP7z8Qxip$tL>tT*sbe z{~VDyM={1#1qL~B?nW_|07ZQWfpj@>4ruBl5=0p!QoRT9J_);&YWmrjhv*Ho>Y6iL zwEV#G{lf3t*zHKPvgj9nq3(Yd@EY}m8prMZd(|7>_+LD)q3&JSm^JKK@7bUQEKV3( z;|gEmaw8hh4-EbkEdX(Gv3Cd?5xBLT5;kmqon{-|E1Khd1aH#XYJAm?u0@sg=szH} ByvzUq literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_generator_nested.cpython-310.pyc b/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_generator_nested.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c7c2c101ee280fe76f56ba53eed292dede26292 GIT binary patch literal 5334 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 C1KmFW literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-310.pyc b/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0c0dc2ce1a4bf4b6c8cfeccfe7b26b005b2149e GIT binary patch literal 26794 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 UP>&ClKBND}7o2CYV%uB)ANu@MDF6Tf literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_leaks.cpython-310.pyc b/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_leaks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..357cba94ddd315ba70dfa12010867f84bed52b4e GIT binary patch literal 5041 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 Vnl|Ieodx(Ve3! zbdwnNQwnT**nWfknBUQVq1Qe2F9cY(bEr7J#NFCWhCY!r$#ZzVb73++Um)=K&zI`Y zq4fuL#vcxy2k`2<009YTM5@`BRw?vZ#9FM%C<&Z^KOsk#B( zBIW!GSWhZtnu?~9GLEFFCnhKPyG76-;}yGRQO9Hwb2$mv#XMWUtYPOwt!u?aQm+TIynO(jwvON zNW8#_p-0y!!QXKFF*wE+Ilw-{dDuH~Dk)3$Q{M2ysLZT+(&A=2HepMyE0riq)EJ=9 zls4v3?g9X#MfeGtqwHnT>6Aw1SVlg)dgN=pd@oAsex&a&H`FCqbmCf9$;4fP2~wH$ zpW1$ux|TVG+n?~1YZ)~Zib-iRb(GZ8niNJtiZD$h2rBXdlq%56v~zu?La(OkDQxii zR0aH)PSf@81P6S;W>D--QjFeoPVpvmCMbU2QhfW2V(^;*(0Y^fh~ZswOao`1snR6% zk4a1|{h)M4f7z{AK3<@#l-EN)QE0)kYpJm`q>et)sgQ?tFN_-rbd7>IcAomt6d9JN z_h7lc29P<%&^h=^a1Xb0Ynlz%W!gE^JFr^4g|LW#;hTZ=Jz*J#b??Hsz5xJy7m)7- zbVP=&A~Jts7&w z`N;+|+HT0(c&I9@1SeSr8?%YE4jRTKMYOE1L+4dX_~V%p}-Z?37G_*9MntDMT<9R=h`d{ zCrHY{LL|w-T}t4mS>^ea{7f3u5+-`owz0yA9y<#^Af}6X)%}h2AR_wAI9L2zFD6Dr4Foo}Wc z!C+bSnu*k&NxTH^17Yk(UUr`tOBpK{$|8D-JuKFZ(NV2!SmiX|P)V!QSXH;+?@Tqc z%7l`u4`IY!85Zb&S8cUS6~?0a2;pOdGC+AQ3pms>EoNc1>4zGM+b1{&!%rWJ0{t5tsk`;w;Fm2j|%`ix@ zfMO4mYStf(L3+LOMvPU;`BZpb?6;)nr3KGxB|$sFcG2^&@@M}j%;)L@gxd(q2%`cp zN_KPb2i_z!W<`OiWkI}MoL4vwhPnx#s%XcdK{JdJTvcpCf6a#r2hN*o&W#< literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_tracing.cpython-310.pyc b/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_tracing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39d3901039e50813a477ee9c668708c33eee030b GIT binary patch literal 8930 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 Sh|SnD&ffhqkNJBJI{yc+2Iv?7 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_version.cpython-310.pyc b/sbsheriff/Lib/site-packages/greenlet/tests/__pycache__/test_version.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7ea9580b245550ec315ce02d442710d813abee7 GIT binary patch literal 1531 zcmZ`(&5q+l5bkcb9Z!2 ztrPmfIU_yq4a6ipYWL!y&ePJ!D47+xGGOWyD#=VVF0+wI^6YekpKf0aUY^3z2OuN~ zsURT}RIt|sfM9rT+uus1!TTGjjUG|>aC0?4!NN~q>0d#tJr{KDRa7{)birPd>^)8l zxp_#*!l7ioW9X6zZk!7CyJSUwf}9KI2j_}jL1~6h-HMIbAz5(aEgKbI(O)_Xw{n;M ziY#|lWZ}I8+Bn>|5HIsTA^P(xpc3!zU{z$KF@g^NDZM&lj&fc`nr0g?8nvMz5|za>Y5gcd z*C?{CinEEde3~bj_2QzCnXsKNw3Z5I=DAY2vW_;Y*RULYL)WN83d_%>l9ncxm4(7l zu}{2ReY?@$uUVdb?^5dGpIGF^C}a&n}Vz|7dC-HynMVZBt&$ zQE4!f^3duQIW);~C1YV-_%nWf{<*KZ-#tz3&Py0y27YJ){%G@x|9O*`}+^?zh{9gg~gyL-<3{{NDE z3MUH;Ar1@-VKa(mxhU&_Y)27RvEET1LijBZI9UpjC_GbJurw+@^t!h6b}-hsG^K*L y3ePv?pm-kz(x>jD2tb5BGJO)mjAD#;WwHL_HLfRk?&%H)93!9kFh)K*Wd8t}Zjfgc5ZzhZsR?N*pF#+MKpe<{@Fj6Ts6r|T4yXrOgk(js9PcJIb(65Wr4Xg3 zB2oTDbL{WnU--(2GdE7m?8f<^2m~ADt#|Eto_RaZy~V{U!;yTsni`L>ue6vQJ}w^P zUq3()OhC>eH$wz=%_DASFY=x-!G-sc2~T=&{CzJ91gx{V{|#f=T1q%OI4&OJU*ABG zjQEfX1pmk)Pk6$|*%yJR;2ekrWD1MgYng1llJyeLw4v7`94-M;(&}3Eb0kV+lg= zVesJp5~>Hq!noGL!-5OmNsEQFm*+Ay#mPjYxaR5Gog}Y&g|B7aRyE27dcWp(`j`kI zrAQD$%@5%W46gh+$+>oPLXX?=CbCc)V*BwCH6j@A&>uHqK+QRAL`5A_uc$?w)Di({ zrA`qn6P!k<;T0YvcnonzP@K(-VU2aWdfnn!W=Q69)4p#MdyYp32mB z5C+R61LZs+6K^)7Q_23EqT+L0#RQA&1AQRyc%D>6kLO)A8yuG53Lo4(E+ZN#NBfk*Pd(!pQVgCO<)=cCv^L?H z6P-U>wSbRYrN^i*2lxNsK*8J!YHAb4^8GJ2cWgmj+erEPSrC$ZUBR@V2JD z^kE6AL5Q+c(a_jo*Z!K_TD?+)aokO|WgHjPINt7wot&;~aZILlchosb;XJ`*f~h9< zicUk3-AEi~ShQ?-q88X)w379XbrG2=3U|7hp<1GF193IMj|9d4ju=0mE~yndCQa=U K5= 3 +# define INITERROR return NULL + +static struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, + TEST_MODULE_NAME, + NULL, + 0, + test_methods, + NULL, + NULL, + NULL, + NULL}; + +PyMODINIT_FUNC +PyInit__test_extension(void) +#else +# define INITERROR return +PyMODINIT_FUNC +init_test_extension(void) +#endif +{ + PyObject* module = NULL; + +#if PY_MAJOR_VERSION >= 3 + module = PyModule_Create(&moduledef); +#else + module = Py_InitModule(TEST_MODULE_NAME, test_methods); +#endif + + if (module == NULL) { + INITERROR; + } + + PyGreenlet_Import(); + +#if PY_MAJOR_VERSION >= 3 + return module; +#endif +} diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/_test_extension.cp310-win_amd64.pyd b/sbsheriff/Lib/site-packages/greenlet/tests/_test_extension.cp310-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..91eca2005e54f27bbcc4487ad9926ddfe48f6dbd GIT binary patch literal 13312 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 Bs?z`f literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/_test_extension_cpp.cp310-win_amd64.pyd b/sbsheriff/Lib/site-packages/greenlet/tests/_test_extension_cpp.cp310-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..472abec2f37e38a8e1c55321e87f636561e458c5 GIT binary patch literal 12800 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 0) { + return p_test_exception_switch_recurse(depth, left - 1); + } + + PyObject* result = NULL; + PyGreenlet* self = PyGreenlet_GetCurrent(); + if (self == NULL) + return NULL; + + try { + PyGreenlet_Switch(self->parent, NULL, NULL); + p_test_exception_throw(depth); + PyErr_SetString(PyExc_RuntimeError, + "throwing C++ exception didn't work"); + } + catch (exception_t& e) { + if (e.depth != depth) + PyErr_SetString(PyExc_AssertionError, "depth mismatch"); + else + result = PyLong_FromLong(depth); + } + catch (...) { + PyErr_SetString(PyExc_RuntimeError, "unexpected C++ exception"); + } + + Py_DECREF(self); + return result; +} + +/* test_exception_switch(int depth) + * - recurses depth times + * - switches to parent inside try/catch block + * - throws an exception that (expected to be caught in the same function) + * - verifies depth matches (exceptions shouldn't be caught in other greenlets) + */ +static PyObject* +test_exception_switch(PyObject* self, PyObject* args) +{ + int depth; + if (!PyArg_ParseTuple(args, "i", &depth)) + return NULL; + return p_test_exception_switch_recurse(depth, depth); +} + +static PyMethodDef test_methods[] = { + {"test_exception_switch", + (PyCFunction)&test_exception_switch, + METH_VARARGS, + "Switches to parent twice, to test exception handling and greenlet " + "switching."}, + {NULL, NULL, 0, NULL}}; + +#if PY_MAJOR_VERSION >= 3 +# define INITERROR return NULL + +static struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, + "greenlet.tests._test_extension_cpp", + NULL, + 0, + test_methods, + NULL, + NULL, + NULL, + NULL}; + +PyMODINIT_FUNC +PyInit__test_extension_cpp(void) +#else +# define INITERROR return +PyMODINIT_FUNC +init_test_extension_cpp(void) +#endif +{ + PyObject* module = NULL; + +#if PY_MAJOR_VERSION >= 3 + module = PyModule_Create(&moduledef); +#else + module = Py_InitModule("greenlet.tests._test_extension_cpp", test_methods); +#endif + + if (module == NULL) { + INITERROR; + } + + PyGreenlet_Import(); + if (_PyGreenlet_API == NULL) { + INITERROR; + } + + p_test_exception_throw = test_exception_throw; + p_test_exception_switch_recurse = test_exception_switch_recurse; + +#if PY_MAJOR_VERSION >= 3 + return module; +#endif +} diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_contextvars.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_contextvars.py new file mode 100644 index 0000000..49b7c0d --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_contextvars.py @@ -0,0 +1,266 @@ +import unittest +import gc +import sys + +from functools import partial + +from greenlet import greenlet +from greenlet import getcurrent + + +try: + from contextvars import Context + from contextvars import ContextVar + from contextvars import copy_context +except ImportError: + Context = ContextVar = copy_context = None + +# We don't support testing if greenlet's built-in context var support is disabled. +@unittest.skipUnless(Context is not None, "ContextVar not supported") +class ContextVarsTests(unittest.TestCase): + def _new_ctx_run(self, *args, **kwargs): + return copy_context().run(*args, **kwargs) + + def _increment(self, greenlet_id, ctx_var, callback, counts, expect): + if expect is None: + self.assertIsNone(ctx_var.get()) + else: + self.assertEqual(ctx_var.get(), expect) + ctx_var.set(greenlet_id) + for _ in range(2): + counts[ctx_var.get()] += 1 + callback() + + def _test_context(self, propagate_by): + id_var = ContextVar("id", default=None) + id_var.set(0) + + callback = getcurrent().switch + counts = dict((i, 0) for i in range(5)) + + lets = [ + greenlet(partial( + partial( + copy_context().run, + self._increment + ) if propagate_by == "run" else self._increment, + greenlet_id=i, + ctx_var=id_var, + callback=callback, + counts=counts, + expect=( + i - 1 if propagate_by == "share" else + 0 if propagate_by in ("set", "run") else None + ) + )) + for i in range(1, 5) + ] + + for let in lets: + if propagate_by == "set": + let.gr_context = copy_context() + elif propagate_by == "share": + let.gr_context = getcurrent().gr_context + + for i in range(2): + counts[id_var.get()] += 1 + for let in lets: + let.switch() + + if propagate_by == "run": + # Must leave each context.run() in reverse order of entry + for let in reversed(lets): + let.switch() + else: + # No context.run(), so fine to exit in any order. + for let in lets: + let.switch() + + for let in lets: + self.assertTrue(let.dead) + # When using run(), we leave the run() as the greenlet dies, + # and there's no context "underneath". When not using run(), + # gr_context still reflects the context the greenlet was + # running in. + self.assertEqual(let.gr_context is None, propagate_by == "run") + + if propagate_by == "share": + self.assertEqual(counts, {0: 1, 1: 1, 2: 1, 3: 1, 4: 6}) + else: + self.assertEqual(set(counts.values()), set([2])) + + def test_context_propagated_by_context_run(self): + self._new_ctx_run(self._test_context, "run") + + def test_context_propagated_by_setting_attribute(self): + self._new_ctx_run(self._test_context, "set") + + def test_context_not_propagated(self): + self._new_ctx_run(self._test_context, None) + + def test_context_shared(self): + self._new_ctx_run(self._test_context, "share") + + def test_break_ctxvars(self): + let1 = greenlet(copy_context().run) + let2 = greenlet(copy_context().run) + let1.switch(getcurrent().switch) + let2.switch(getcurrent().switch) + # Since let2 entered the current context and let1 exits its own, the + # interpreter emits: + # RuntimeError: cannot exit context: thread state references a different context object + let1.switch() + + def test_not_broken_if_using_attribute_instead_of_context_run(self): + let1 = greenlet(getcurrent().switch) + let2 = greenlet(getcurrent().switch) + let1.gr_context = copy_context() + let2.gr_context = copy_context() + let1.switch() + let2.switch() + let1.switch() + let2.switch() + + def test_context_assignment_while_running(self): + id_var = ContextVar("id", default=None) + + def target(): + self.assertIsNone(id_var.get()) + self.assertIsNone(gr.gr_context) + + # Context is created on first use + id_var.set(1) + self.assertIsInstance(gr.gr_context, Context) + self.assertEqual(id_var.get(), 1) + self.assertEqual(gr.gr_context[id_var], 1) + + # Clearing the context makes it get re-created as another + # empty context when next used + old_context = gr.gr_context + gr.gr_context = None # assign None while running + self.assertIsNone(id_var.get()) + self.assertIsNone(gr.gr_context) + id_var.set(2) + self.assertIsInstance(gr.gr_context, Context) + self.assertEqual(id_var.get(), 2) + self.assertEqual(gr.gr_context[id_var], 2) + + new_context = gr.gr_context + getcurrent().parent.switch((old_context, new_context)) + # parent switches us back to old_context + + self.assertEqual(id_var.get(), 1) + gr.gr_context = new_context # assign non-None while running + self.assertEqual(id_var.get(), 2) + + getcurrent().parent.switch() + # parent switches us back to no context + self.assertIsNone(id_var.get()) + self.assertIsNone(gr.gr_context) + gr.gr_context = old_context + self.assertEqual(id_var.get(), 1) + + getcurrent().parent.switch() + # parent switches us back to no context + self.assertIsNone(id_var.get()) + self.assertIsNone(gr.gr_context) + + gr = greenlet(target) + + with self.assertRaisesRegex(AttributeError, "can't delete attr"): + del gr.gr_context + + self.assertIsNone(gr.gr_context) + old_context, new_context = gr.switch() + self.assertIs(new_context, gr.gr_context) + self.assertEqual(old_context[id_var], 1) + self.assertEqual(new_context[id_var], 2) + self.assertEqual(new_context.run(id_var.get), 2) + gr.gr_context = old_context # assign non-None while suspended + gr.switch() + self.assertIs(gr.gr_context, new_context) + gr.gr_context = None # assign None while suspended + gr.switch() + self.assertIs(gr.gr_context, old_context) + gr.gr_context = None + gr.switch() + self.assertIsNone(gr.gr_context) + + # Make sure there are no reference leaks + gr = None + gc.collect() + self.assertEqual(sys.getrefcount(old_context), 2) + self.assertEqual(sys.getrefcount(new_context), 2) + + def test_context_assignment_different_thread(self): + import threading + + ctx = Context() + var = ContextVar("var", default=None) + is_running = threading.Event() + should_suspend = threading.Event() + did_suspend = threading.Event() + should_exit = threading.Event() + holder = [] + + def greenlet_in_thread_fn(): + var.set(1) + is_running.set() + should_suspend.wait() + var.set(2) + getcurrent().parent.switch() + holder.append(var.get()) + + def thread_fn(): + gr = greenlet(greenlet_in_thread_fn) + gr.gr_context = ctx + holder.append(gr) + gr.switch() + did_suspend.set() + should_exit.wait() + gr.switch() + + thread = threading.Thread(target=thread_fn, daemon=True) + thread.start() + is_running.wait() + gr = holder[0] + + # Can't access or modify context if the greenlet is running + # in a different thread + with self.assertRaisesRegex(ValueError, "running in a different"): + getattr(gr, 'gr_context') + with self.assertRaisesRegex(ValueError, "running in a different"): + gr.gr_context = None + + should_suspend.set() + did_suspend.wait() + + # OK to access and modify context if greenlet is suspended + self.assertIs(gr.gr_context, ctx) + self.assertEqual(gr.gr_context[var], 2) + gr.gr_context = None + + should_exit.set() + thread.join() + + self.assertEqual(holder, [gr, None]) + + # Context can still be accessed/modified when greenlet is dead: + self.assertIsNone(gr.gr_context) + gr.gr_context = ctx + self.assertIs(gr.gr_context, ctx) + +@unittest.skipIf(Context is not None, "ContextVar supported") +class NoContextVarsTests(unittest.TestCase): + def test_contextvars_errors(self): + let1 = greenlet(getcurrent().switch) + self.assertFalse(hasattr(let1, 'gr_context')) + with self.assertRaises(AttributeError): + getattr(let1, 'gr_context') + with self.assertRaises(AttributeError): + let1.gr_context = None + let1.switch() + with self.assertRaises(AttributeError): + getattr(let1, 'gr_context') + with self.assertRaises(AttributeError): + let1.gr_context = None diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_cpp.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_cpp.py new file mode 100644 index 0000000..741ea10 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_cpp.py @@ -0,0 +1,18 @@ +from __future__ import print_function +from __future__ import absolute_import + +import unittest + +import greenlet +from . import _test_extension_cpp + + +class CPPTests(unittest.TestCase): + def test_exception_switch(self): + greenlets = [] + for i in range(4): + g = greenlet.greenlet(_test_extension_cpp.test_exception_switch) + g.switch(i) + greenlets.append(g) + for i, g in enumerate(greenlets): + self.assertEqual(g.switch(), i) diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_extension_interface.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_extension_interface.py new file mode 100644 index 0000000..a92ea1f --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_extension_interface.py @@ -0,0 +1,77 @@ +from __future__ import print_function +from __future__ import absolute_import + +import sys +import unittest + +import greenlet +from . import _test_extension + + +class CAPITests(unittest.TestCase): + def test_switch(self): + self.assertEqual( + 50, _test_extension.test_switch(greenlet.greenlet(lambda: 50))) + + def test_switch_kwargs(self): + def foo(x, y): + return x * y + g = greenlet.greenlet(foo) + self.assertEqual(6, _test_extension.test_switch_kwargs(g, x=3, y=2)) + + def test_setparent(self): + def foo(): + def bar(): + greenlet.getcurrent().parent.switch() + + # This final switch should go back to the main greenlet, since + # the test_setparent() function in the C extension should have + # reparented this greenlet. + greenlet.getcurrent().parent.switch() + raise AssertionError("Should never have reached this code") + child = greenlet.greenlet(bar) + child.switch() + greenlet.getcurrent().parent.switch(child) + greenlet.getcurrent().parent.throw( + AssertionError("Should never reach this code")) + foo_child = greenlet.greenlet(foo).switch() + self.assertEqual(None, _test_extension.test_setparent(foo_child)) + + def test_getcurrent(self): + _test_extension.test_getcurrent() + + def test_new_greenlet(self): + self.assertEqual(-15, _test_extension.test_new_greenlet(lambda: -15)) + + def test_raise_greenlet_dead(self): + self.assertRaises( + greenlet.GreenletExit, _test_extension.test_raise_dead_greenlet) + + def test_raise_greenlet_error(self): + self.assertRaises( + greenlet.error, _test_extension.test_raise_greenlet_error) + + def test_throw(self): + seen = [] + + def foo(): + try: + greenlet.getcurrent().parent.switch() + except ValueError: + seen.append(sys.exc_info()[1]) + except greenlet.GreenletExit: + raise AssertionError + g = greenlet.greenlet(foo) + g.switch() + _test_extension.test_throw(g) + self.assertEqual(len(seen), 1) + self.assertTrue( + isinstance(seen[0], ValueError), + "ValueError was not raised in foo()") + self.assertEqual( + str(seen[0]), + 'take that sucka!', + "message doesn't match") + +if __name__ == '__main__': + unittest.main() diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_gc.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_gc.py new file mode 100644 index 0000000..a2a41ca --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_gc.py @@ -0,0 +1,77 @@ +import gc +import sys +import unittest +import weakref + +import greenlet + + +class GCTests(unittest.TestCase): + def test_dead_circular_ref(self): + o = weakref.ref(greenlet.greenlet(greenlet.getcurrent).switch()) + gc.collect() + self.assertTrue(o() is None) + self.assertFalse(gc.garbage, gc.garbage) + + if greenlet.GREENLET_USE_GC: + # These only work with greenlet gc support + + def test_circular_greenlet(self): + class circular_greenlet(greenlet.greenlet): + pass + o = circular_greenlet() + o.self = o + o = weakref.ref(o) + gc.collect() + self.assertTrue(o() is None) + self.assertFalse(gc.garbage, gc.garbage) + + def test_inactive_ref(self): + class inactive_greenlet(greenlet.greenlet): + def __init__(self): + greenlet.greenlet.__init__(self, run=self.run) + + def run(self): + pass + o = inactive_greenlet() + o = weakref.ref(o) + gc.collect() + self.assertTrue(o() is None) + self.assertFalse(gc.garbage, gc.garbage) + + def test_finalizer_crash(self): + # This test is designed to crash when active greenlets + # are made garbage collectable, until the underlying + # problem is resolved. How does it work: + # - order of object creation is important + # - array is created first, so it is moved to unreachable first + # - we create a cycle between a greenlet and this array + # - we create an object that participates in gc, is only + # referenced by a greenlet, and would corrupt gc lists + # on destruction, the easiest is to use an object with + # a finalizer + # - because array is the first object in unreachable it is + # cleared first, which causes all references to greenlet + # to disappear and causes greenlet to be destroyed, but since + # it is still live it causes a switch during gc, which causes + # an object with finalizer to be destroyed, which causes stack + # corruption and then a crash + class object_with_finalizer(object): + def __del__(self): + pass + array = [] + parent = greenlet.getcurrent() + def greenlet_body(): + greenlet.getcurrent().object = object_with_finalizer() + try: + parent.switch() + finally: + del greenlet.getcurrent().object + g = greenlet.greenlet(greenlet_body) + g.array = array + array.append(g) + g.switch() + del array + del g + greenlet.getcurrent() + gc.collect() diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_generator.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_generator.py new file mode 100644 index 0000000..62f9f26 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_generator.py @@ -0,0 +1,59 @@ +import unittest +from greenlet import greenlet + + +class genlet(greenlet): + + def __init__(self, *args, **kwds): + self.args = args + self.kwds = kwds + + def run(self): + fn, = self.fn + fn(*self.args, **self.kwds) + + def __iter__(self): + return self + + def __next__(self): + self.parent = greenlet.getcurrent() + result = self.switch() + if self: + return result + else: + raise StopIteration + + # Hack: Python < 2.6 compatibility + next = __next__ + + +def Yield(value): + g = greenlet.getcurrent() + while not isinstance(g, genlet): + if g is None: + raise RuntimeError('yield outside a genlet') + g = g.parent + g.parent.switch(value) + + +def generator(func): + class generator(genlet): + fn = (func,) + return generator + +# ____________________________________________________________ + + +class GeneratorTests(unittest.TestCase): + def test_generator(self): + seen = [] + + def g(n): + for i in range(n): + seen.append(i) + Yield(i) + g = generator(g) + for k in range(3): + for j in g(5): + seen.append(j) + self.assertEqual(seen, 3 * [0, 0, 1, 1, 2, 2, 3, 3, 4, 4]) diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_generator_nested.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_generator_nested.py new file mode 100644 index 0000000..6b4f023 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_generator_nested.py @@ -0,0 +1,165 @@ +import unittest +from greenlet import greenlet + + +class genlet(greenlet): + + def __init__(self, *args, **kwds): + self.args = args + self.kwds = kwds + self.child = None + + def run(self): + fn, = self.fn + fn(*self.args, **self.kwds) + + def __iter__(self): + return self + + def set_child(self, child): + self.child = child + + def __next__(self): + if self.child: + child = self.child + while child.child: + tmp = child + child = child.child + tmp.child = None + + result = child.switch() + else: + self.parent = greenlet.getcurrent() + result = self.switch() + + if self: + return result + else: + raise StopIteration + + # Hack: Python < 2.6 compatibility + next = __next__ + + +def Yield(value, level=1): + g = greenlet.getcurrent() + + while level != 0: + if not isinstance(g, genlet): + raise RuntimeError('yield outside a genlet') + if level > 1: + g.parent.set_child(g) + g = g.parent + level -= 1 + + g.switch(value) + + +def Genlet(func): + class Genlet(genlet): + fn = (func,) + return Genlet + +# ____________________________________________________________ + + +def g1(n, seen): + for i in range(n): + seen.append(i + 1) + yield i + + +def g2(n, seen): + for i in range(n): + seen.append(i + 1) + Yield(i) + +g2 = Genlet(g2) + + +def nested(i): + Yield(i) + + +def g3(n, seen): + for i in range(n): + seen.append(i + 1) + nested(i) +g3 = Genlet(g3) + + +def a(n): + if n == 0: + return + for ii in ax(n - 1): + Yield(ii) + Yield(n) +ax = Genlet(a) + + +def perms(l): + if len(l) > 1: + for e in l: + # No syntactical sugar for generator expressions + [Yield([e] + p) for p in perms([x for x in l if x != e])] + else: + Yield(l) +perms = Genlet(perms) + + +def gr1(n): + for ii in range(1, n): + Yield(ii) + Yield(ii * ii, 2) + +gr1 = Genlet(gr1) + + +def gr2(n, seen): + for ii in gr1(n): + seen.append(ii) + +gr2 = Genlet(gr2) + + +class NestedGeneratorTests(unittest.TestCase): + def test_layered_genlets(self): + seen = [] + for ii in gr2(5, seen): + seen.append(ii) + self.assertEqual(seen, [1, 1, 2, 4, 3, 9, 4, 16]) + + def test_permutations(self): + gen_perms = perms(list(range(4))) + permutations = list(gen_perms) + self.assertEqual(len(permutations), 4 * 3 * 2 * 1) + self.assertTrue([0, 1, 2, 3] in permutations) + self.assertTrue([3, 2, 1, 0] in permutations) + res = [] + for ii in zip(perms(list(range(4))), perms(list(range(3)))): + res.append(ii) + self.assertEqual( + res, + [([0, 1, 2, 3], [0, 1, 2]), ([0, 1, 3, 2], [0, 2, 1]), + ([0, 2, 1, 3], [1, 0, 2]), ([0, 2, 3, 1], [1, 2, 0]), + ([0, 3, 1, 2], [2, 0, 1]), ([0, 3, 2, 1], [2, 1, 0])]) + # XXX Test to make sure we are working as a generator expression + + def test_genlet_simple(self): + for g in [g1, g2, g3]: + seen = [] + for k in range(3): + for j in g(5, seen): + seen.append(j) + self.assertEqual(seen, 3 * [1, 0, 2, 1, 3, 2, 4, 3, 5, 4]) + + def test_genlet_bad(self): + try: + Yield(10) + except RuntimeError: + pass + + def test_nested_genlets(self): + seen = [] + for ii in ax(5): + seen.append(ii) diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_greenlet.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_greenlet.py new file mode 100644 index 0000000..5509a8b --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_greenlet.py @@ -0,0 +1,728 @@ +import gc +import sys +import time +import threading +import unittest +from abc import ABCMeta, abstractmethod + +from greenlet import greenlet + +# We manually manage locks in many tests +# pylint:disable=consider-using-with + +class SomeError(Exception): + pass + + +def fmain(seen): + try: + greenlet.getcurrent().parent.switch() + except: + seen.append(sys.exc_info()[0]) + raise + raise SomeError + + +def send_exception(g, exc): + # note: send_exception(g, exc) can be now done with g.throw(exc). + # the purpose of this test is to explicitely check the propagation rules. + def crasher(exc): + raise exc + g1 = greenlet(crasher, parent=g) + g1.switch(exc) + + +class TestGreenlet(unittest.TestCase): + def test_simple(self): + lst = [] + + def f(): + lst.append(1) + greenlet.getcurrent().parent.switch() + lst.append(3) + g = greenlet(f) + lst.append(0) + g.switch() + lst.append(2) + g.switch() + lst.append(4) + self.assertEqual(lst, list(range(5))) + + def test_parent_equals_None(self): + g = greenlet(parent=None) + self.assertIsNotNone(g) + self.assertIs(g.parent, greenlet.getcurrent()) + + def test_run_equals_None(self): + g = greenlet(run=None) + self.assertIsNotNone(g) + self.assertIsNone(g.run) + + def test_two_children(self): + lst = [] + + def f(): + lst.append(1) + greenlet.getcurrent().parent.switch() + lst.extend([1, 1]) + g = greenlet(f) + h = greenlet(f) + g.switch() + self.assertEqual(len(lst), 1) + h.switch() + self.assertEqual(len(lst), 2) + h.switch() + self.assertEqual(len(lst), 4) + self.assertEqual(h.dead, True) + g.switch() + self.assertEqual(len(lst), 6) + self.assertEqual(g.dead, True) + + def test_two_recursive_children(self): + lst = [] + + def f(): + lst.append(1) + greenlet.getcurrent().parent.switch() + + def g(): + lst.append(1) + g = greenlet(f) + g.switch() + lst.append(1) + g = greenlet(g) + g.switch() + self.assertEqual(len(lst), 3) + self.assertEqual(sys.getrefcount(g), 2) + + def test_threads(self): + success = [] + + def f(): + self.test_simple() + success.append(True) + ths = [threading.Thread(target=f) for i in range(10)] + for th in ths: + th.start() + for th in ths: + th.join() + self.assertEqual(len(success), len(ths)) + + def test_exception(self): + seen = [] + g1 = greenlet(fmain) + g2 = greenlet(fmain) + g1.switch(seen) + g2.switch(seen) + g2.parent = g1 + self.assertEqual(seen, []) + self.assertRaises(SomeError, g2.switch) + self.assertEqual(seen, [SomeError]) + g2.switch() + self.assertEqual(seen, [SomeError]) + + def test_send_exception(self): + seen = [] + g1 = greenlet(fmain) + g1.switch(seen) + self.assertRaises(KeyError, send_exception, g1, KeyError) + self.assertEqual(seen, [KeyError]) + + def test_dealloc(self): + seen = [] + g1 = greenlet(fmain) + g2 = greenlet(fmain) + g1.switch(seen) + g2.switch(seen) + self.assertEqual(seen, []) + del g1 + gc.collect() + self.assertEqual(seen, [greenlet.GreenletExit]) + del g2 + gc.collect() + self.assertEqual(seen, [greenlet.GreenletExit, greenlet.GreenletExit]) + + def test_dealloc_other_thread(self): + seen = [] + someref = [] + lock = threading.Lock() + lock.acquire() + lock2 = threading.Lock() + lock2.acquire() + + def f(): + g1 = greenlet(fmain) + g1.switch(seen) + someref.append(g1) + del g1 + gc.collect() + lock.release() + lock2.acquire() + greenlet() # trigger release + lock.release() + lock2.acquire() + t = threading.Thread(target=f) + t.start() + lock.acquire() + self.assertEqual(seen, []) + self.assertEqual(len(someref), 1) + del someref[:] + gc.collect() + # g1 is not released immediately because it's from another thread + self.assertEqual(seen, []) + lock2.release() + lock.acquire() + self.assertEqual(seen, [greenlet.GreenletExit]) + lock2.release() + t.join() + + def test_frame(self): + def f1(): + f = sys._getframe(0) # pylint:disable=protected-access + self.assertEqual(f.f_back, None) + greenlet.getcurrent().parent.switch(f) + return "meaning of life" + g = greenlet(f1) + frame = g.switch() + self.assertTrue(frame is g.gr_frame) + self.assertTrue(g) + + from_g = g.switch() + self.assertFalse(g) + self.assertEqual(from_g, 'meaning of life') + self.assertEqual(g.gr_frame, None) + + def test_thread_bug(self): + def runner(x): + g = greenlet(lambda: time.sleep(x)) + g.switch() + t1 = threading.Thread(target=runner, args=(0.2,)) + t2 = threading.Thread(target=runner, args=(0.3,)) + t1.start() + t2.start() + t1.join() + t2.join() + + def test_switch_kwargs(self): + def run(a, b): + self.assertEqual(a, 4) + self.assertEqual(b, 2) + return 42 + x = greenlet(run).switch(a=4, b=2) + self.assertEqual(x, 42) + + def test_switch_kwargs_to_parent(self): + def run(x): + greenlet.getcurrent().parent.switch(x=x) + greenlet.getcurrent().parent.switch(2, x=3) + return x, x ** 2 + g = greenlet(run) + self.assertEqual({'x': 3}, g.switch(3)) + self.assertEqual(((2,), {'x': 3}), g.switch()) + self.assertEqual((3, 9), g.switch()) + + def test_switch_to_another_thread(self): + data = {} + error = None + created_event = threading.Event() + done_event = threading.Event() + + def run(): + data['g'] = greenlet(lambda: None) + created_event.set() + done_event.wait() + thread = threading.Thread(target=run) + thread.start() + created_event.wait() + try: + data['g'].switch() + except greenlet.error: + error = sys.exc_info()[1] + self.assertIsNotNone(error, "greenlet.error was not raised!") + done_event.set() + thread.join() + + def test_exc_state(self): + def f(): + try: + raise ValueError('fun') + except: # pylint:disable=bare-except + exc_info = sys.exc_info() + greenlet(h).switch() + self.assertEqual(exc_info, sys.exc_info()) + + def h(): + self.assertEqual(sys.exc_info(), (None, None, None)) + + greenlet(f).switch() + + def test_instance_dict(self): + def f(): + greenlet.getcurrent().test = 42 + def deldict(g): + del g.__dict__ + def setdict(g, value): + g.__dict__ = value + g = greenlet(f) + self.assertEqual(g.__dict__, {}) + g.switch() + self.assertEqual(g.test, 42) + self.assertEqual(g.__dict__, {'test': 42}) + g.__dict__ = g.__dict__ + self.assertEqual(g.__dict__, {'test': 42}) + self.assertRaises(TypeError, deldict, g) + self.assertRaises(TypeError, setdict, g, 42) + + def test_threaded_reparent(self): + data = {} + created_event = threading.Event() + done_event = threading.Event() + + def run(): + data['g'] = greenlet(lambda: None) + created_event.set() + done_event.wait() + + def blank(): + greenlet.getcurrent().parent.switch() + + def setparent(g, value): + g.parent = value + + thread = threading.Thread(target=run) + thread.start() + created_event.wait() + g = greenlet(blank) + g.switch() + self.assertRaises(ValueError, setparent, g, data['g']) + done_event.set() + thread.join() + + def test_deepcopy(self): + import copy + self.assertRaises(TypeError, copy.copy, greenlet()) + self.assertRaises(TypeError, copy.deepcopy, greenlet()) + + def test_parent_restored_on_kill(self): + hub = greenlet(lambda: None) + main = greenlet.getcurrent() + result = [] + def worker(): + try: + # Wait to be killed + main.switch() + except greenlet.GreenletExit: + # Resurrect and switch to parent + result.append(greenlet.getcurrent().parent) + result.append(greenlet.getcurrent()) + hub.switch() + g = greenlet(worker, parent=hub) + g.switch() + del g + self.assertTrue(result) + self.assertEqual(result[0], main) + self.assertEqual(result[1].parent, hub) + + def test_parent_return_failure(self): + # No run causes AttributeError on switch + g1 = greenlet() + # Greenlet that implicitly switches to parent + g2 = greenlet(lambda: None, parent=g1) + # AttributeError should propagate to us, no fatal errors + self.assertRaises(AttributeError, g2.switch) + + def test_throw_exception_not_lost(self): + class mygreenlet(greenlet): + def __getattribute__(self, name): + try: + raise Exception() + except: # pylint:disable=bare-except + pass + return greenlet.__getattribute__(self, name) + g = mygreenlet(lambda: None) + self.assertRaises(SomeError, g.throw, SomeError()) + + def test_throw_doesnt_crash(self): + result = [] + def worker(): + greenlet.getcurrent().parent.switch() + def creator(): + g = greenlet(worker) + g.switch() + result.append(g) + t = threading.Thread(target=creator) + t.start() + t.join() + self.assertRaises(greenlet.error, result[0].throw, SomeError()) + + def test_recursive_startup(self): + class convoluted(greenlet): + def __init__(self): + greenlet.__init__(self) + self.count = 0 + def __getattribute__(self, name): + if name == 'run' and self.count == 0: + self.count = 1 + self.switch(43) + return greenlet.__getattribute__(self, name) + def run(self, value): + while True: + self.parent.switch(value) + g = convoluted() + self.assertEqual(g.switch(42), 43) + + def test_unexpected_reparenting(self): + another = [] + def worker(): + g = greenlet(lambda: None) + another.append(g) + g.switch() + t = threading.Thread(target=worker) + t.start() + t.join() + class convoluted(greenlet): + def __getattribute__(self, name): + if name == 'run': + self.parent = another[0] # pylint:disable=attribute-defined-outside-init + return greenlet.__getattribute__(self, name) + g = convoluted(lambda: None) + self.assertRaises(greenlet.error, g.switch) + + def test_threaded_updatecurrent(self): + # released when main thread should execute + lock1 = threading.Lock() + lock1.acquire() + # released when another thread should execute + lock2 = threading.Lock() + lock2.acquire() + class finalized(object): + def __del__(self): + # happens while in green_updatecurrent() in main greenlet + # should be very careful not to accidentally call it again + # at the same time we must make sure another thread executes + lock2.release() + lock1.acquire() + # now ts_current belongs to another thread + def deallocator(): + greenlet.getcurrent().parent.switch() + def fthread(): + lock2.acquire() + greenlet.getcurrent() + del g[0] + lock1.release() + lock2.acquire() + greenlet.getcurrent() + lock1.release() + main = greenlet.getcurrent() + g = [greenlet(deallocator)] + g[0].bomb = finalized() + g[0].switch() + t = threading.Thread(target=fthread) + t.start() + # let another thread grab ts_current and deallocate g[0] + lock2.release() + lock1.acquire() + # this is the corner stone + # getcurrent() will notice that ts_current belongs to another thread + # and start the update process, which would notice that g[0] should + # be deallocated, and that will execute an object's finalizer. Now, + # that object will let another thread run so it can grab ts_current + # again, which would likely crash the interpreter if there's no + # check for this case at the end of green_updatecurrent(). This test + # passes if getcurrent() returns correct result, but it's likely + # to randomly crash if it's not anyway. + self.assertEqual(greenlet.getcurrent(), main) + # wait for another thread to complete, just in case + t.join() + + def test_dealloc_switch_args_not_lost(self): + seen = [] + def worker(): + # wait for the value + value = greenlet.getcurrent().parent.switch() + # delete all references to ourself + del worker[0] + initiator.parent = greenlet.getcurrent().parent + # switch to main with the value, but because + # ts_current is the last reference to us we + # return immediately + try: + greenlet.getcurrent().parent.switch(value) + finally: + seen.append(greenlet.getcurrent()) + def initiator(): + return 42 # implicitly falls thru to parent + worker = [greenlet(worker)] + worker[0].switch() # prime worker + initiator = greenlet(initiator, worker[0]) + value = initiator.switch() + self.assertTrue(seen) + self.assertEqual(value, 42) + + + + def test_tuple_subclass(self): + if sys.version_info[0] > 2: + # There's no apply in Python 3.x + def _apply(func, a, k): + func(*a, **k) + else: + _apply = apply # pylint:disable=undefined-variable + + class mytuple(tuple): + def __len__(self): + greenlet.getcurrent().switch() + return tuple.__len__(self) + args = mytuple() + kwargs = dict(a=42) + def switchapply(): + _apply(greenlet.getcurrent().parent.switch, args, kwargs) + g = greenlet(switchapply) + self.assertEqual(g.switch(), kwargs) + + def test_abstract_subclasses(self): + AbstractSubclass = ABCMeta( + 'AbstractSubclass', + (greenlet,), + {'run': abstractmethod(lambda self: None)}) + + class BadSubclass(AbstractSubclass): + pass + + class GoodSubclass(AbstractSubclass): + def run(self): + pass + + GoodSubclass() # should not raise + self.assertRaises(TypeError, BadSubclass) + + def test_implicit_parent_with_threads(self): + if not gc.isenabled(): + return # cannot test with disabled gc + N = gc.get_threshold()[0] + if N < 50: + return # cannot test with such a small N + def attempt(): + lock1 = threading.Lock() + lock1.acquire() + lock2 = threading.Lock() + lock2.acquire() + recycled = [False] + def another_thread(): + lock1.acquire() # wait for gc + greenlet.getcurrent() # update ts_current + lock2.release() # release gc + t = threading.Thread(target=another_thread) + t.start() + class gc_callback(object): + def __del__(self): + lock1.release() + lock2.acquire() + recycled[0] = True + class garbage(object): + def __init__(self): + self.cycle = self + self.callback = gc_callback() + l = [] + x = range(N*2) + current = greenlet.getcurrent() + g = garbage() + for _ in x: + g = None # lose reference to garbage + if recycled[0]: + # gc callback called prematurely + t.join() + return False + last = greenlet() + if recycled[0]: + break # yes! gc called in green_new + l.append(last) # increase allocation counter + else: + # gc callback not called when expected + gc.collect() + if recycled[0]: + t.join() + return False + self.assertEqual(last.parent, current) + for g in l: + self.assertEqual(g.parent, current) + return True + for _ in range(5): + if attempt(): + break + + def test_issue_245_reference_counting_subclass_no_threads(self): + # https://github.com/python-greenlet/greenlet/issues/245 + # Before the fix, this crashed pretty reliably on + # Python 3.10, at least on macOS; but much less reliably on other + # interpreters (memory layout must have changed). + # The threaded test crashed more reliably on more interpreters. + from greenlet import getcurrent + from greenlet import GreenletExit + + class Greenlet(greenlet): + pass + + initial_refs = sys.getrefcount(Greenlet) + # This has to be an instance variable because + # Python 2 raises a SyntaxError if we delete a local + # variable referenced in an inner scope. + self.glets = [] # pylint:disable=attribute-defined-outside-init + + def greenlet_main(): + try: + getcurrent().parent.switch() + except GreenletExit: + self.glets.append(getcurrent()) + + # Before the + for _ in range(10): + Greenlet(greenlet_main).switch() + + del self.glets + self.assertEqual(sys.getrefcount(Greenlet), initial_refs) + + def test_issue_245_reference_counting_subclass_threads(self): + # https://github.com/python-greenlet/greenlet/issues/245 + from threading import Thread + from threading import Event + + from greenlet import getcurrent + + class MyGreenlet(greenlet): + pass + + glets = [] + ref_cleared = Event() + + def greenlet_main(): + getcurrent().parent.switch() + + def thread_main(greenlet_running_event): + mine = MyGreenlet(greenlet_main) + glets.append(mine) + # The greenlets being deleted must be active + mine.switch() + # Don't keep any reference to it in this thread + del mine + # Let main know we published our greenlet. + greenlet_running_event.set() + # Wait for main to let us know the references are + # gone and the greenlet objects no longer reachable + ref_cleared.wait() + # The creating thread must call getcurrent() (or a few other + # greenlet APIs) because that's when the thread-local list of dead + # greenlets gets cleared. + getcurrent() + + # We start with 3 references to the subclass: + # - This module + # - Its __mro__ + # - The __subclassess__ attribute of greenlet + # - (If we call gc.get_referents(), we find four entries, including + # some other tuple ``(greenlet)`` that I'm not sure about but must be part + # of the machinery.) + # + # On Python 3.10 it's often enough to just run 3 threads; on Python 2.7, + # more threads are needed, and the results are still + # non-deterministic. Presumably the memory layouts are different + initial_refs = sys.getrefcount(MyGreenlet) + thread_ready_events = [] + for _ in range( + initial_refs + 45 + ): + event = Event() + thread = Thread(target=thread_main, args=(event,)) + thread_ready_events.append(event) + thread.start() + + + for done_event in thread_ready_events: + done_event.wait() + + + del glets[:] + ref_cleared.set() + # Let any other thread run; it will crash the interpreter + # if not fixed (or silently corrupt memory and we possibly crash + # later). + time.sleep(1) + self.assertEqual(sys.getrefcount(MyGreenlet), initial_refs) + + +class TestRepr(unittest.TestCase): + + def assertEndsWith(self, got, suffix): + self.assertTrue(got.endswith(suffix), (got, suffix)) + + def test_main_while_running(self): + r = repr(greenlet.getcurrent()) + self.assertEndsWith(r, " current active started main>") + + def test_main_in_background(self): + main = greenlet.getcurrent() + def run(): + return repr(main) + + g = greenlet(run) + r = g.switch() + self.assertEndsWith(r, ' suspended active started main>') + + def test_initial(self): + r = repr(greenlet()) + self.assertEndsWith(r, ' pending>') + + def test_main_from_other_thread(self): + main = greenlet.getcurrent() + + class T(threading.Thread): + original_main = thread_main = None + main_glet = None + def run(self): + self.original_main = repr(main) + self.main_glet = greenlet.getcurrent() + self.thread_main = repr(self.main_glet) + + t = T() + t.start() + t.join(10) + + self.assertEndsWith(t.original_main, ' suspended active started main>') + self.assertEndsWith(t.thread_main, ' current active started main>') + + r = repr(t.main_glet) + # main greenlets, even from dead threads, never really appear dead + # TODO: Can we find a better way to differentiate that? + assert not t.main_glet.dead + self.assertEndsWith(r, ' suspended active started main>') + + def test_dead(self): + g = greenlet(lambda: None) + g.switch() + self.assertEndsWith(repr(g), ' dead>') + self.assertNotIn('suspended', repr(g)) + self.assertNotIn('started', repr(g)) + self.assertNotIn('active', repr(g)) + + def test_formatting_produces_native_str(self): + # https://github.com/python-greenlet/greenlet/issues/218 + # %s formatting on Python 2 was producing unicode, not str. + + g_dead = greenlet(lambda: None) + g_not_started = greenlet(lambda: None) + g_cur = greenlet.getcurrent() + + for g in g_dead, g_not_started, g_cur: + + self.assertIsInstance( + '%s' % (g,), + str + ) + self.assertIsInstance( + '%r' % (g,), + str, + ) + + +if __name__ == '__main__': + unittest.main() diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_leaks.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_leaks.py new file mode 100644 index 0000000..2b02bfd --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_leaks.py @@ -0,0 +1,178 @@ +import unittest +import sys +import gc + +import time +import weakref +import threading + +import greenlet + +class TestLeaks(unittest.TestCase): + + def test_arg_refs(self): + args = ('a', 'b', 'c') + refcount_before = sys.getrefcount(args) + # pylint:disable=unnecessary-lambda + g = greenlet.greenlet( + lambda *args: greenlet.getcurrent().parent.switch(*args)) + for _ in range(100): + g.switch(*args) + self.assertEqual(sys.getrefcount(args), refcount_before) + + def test_kwarg_refs(self): + kwargs = {} + # pylint:disable=unnecessary-lambda + g = greenlet.greenlet( + lambda **kwargs: greenlet.getcurrent().parent.switch(**kwargs)) + for _ in range(100): + g.switch(**kwargs) + self.assertEqual(sys.getrefcount(kwargs), 2) + + assert greenlet.GREENLET_USE_GC # Option to disable this was removed in 1.0 + + def recycle_threads(self): + # By introducing a thread that does sleep we allow other threads, + # that have triggered their __block condition, but did not have a + # chance to deallocate their thread state yet, to finally do so. + # The way it works is by requiring a GIL switch (different thread), + # which does a GIL release (sleep), which might do a GIL switch + # to finished threads and allow them to clean up. + def worker(): + time.sleep(0.001) + t = threading.Thread(target=worker) + t.start() + time.sleep(0.001) + t.join() + + def test_threaded_leak(self): + gg = [] + def worker(): + # only main greenlet present + gg.append(weakref.ref(greenlet.getcurrent())) + for _ in range(2): + t = threading.Thread(target=worker) + t.start() + t.join() + del t + greenlet.getcurrent() # update ts_current + self.recycle_threads() + greenlet.getcurrent() # update ts_current + gc.collect() + greenlet.getcurrent() # update ts_current + for g in gg: + self.assertIsNone(g()) + + def test_threaded_adv_leak(self): + gg = [] + def worker(): + # main and additional *finished* greenlets + ll = greenlet.getcurrent().ll = [] + def additional(): + ll.append(greenlet.getcurrent()) + for _ in range(2): + greenlet.greenlet(additional).switch() + gg.append(weakref.ref(greenlet.getcurrent())) + for _ in range(2): + t = threading.Thread(target=worker) + t.start() + t.join() + del t + greenlet.getcurrent() # update ts_current + self.recycle_threads() + greenlet.getcurrent() # update ts_current + gc.collect() + greenlet.getcurrent() # update ts_current + for g in gg: + self.assertIsNone(g()) + + def test_issue251_killing_cross_thread_leaks_list(self, manually_collect_background=True): + # See https://github.com/python-greenlet/greenlet/issues/251 + # Killing a greenlet (probably not the main one) + # in one thread from another thread would + # result in leaking a list (the ts_delkey list). + + # For the test to be valid, even empty lists have to be tracked by the + # GC + assert gc.is_tracked([]) + + def count_objects(kind=list): + # pylint:disable=unidiomatic-typecheck + # Collect the garbage. + for _ in range(3): + gc.collect() + gc.collect() + return sum( + 1 + for x in gc.get_objects() + if type(x) is kind + ) + + # XXX: The main greenlet of a dead thread is only released + # when one of the proper greenlet APIs is used from a different + # running thread. See #252 (https://github.com/python-greenlet/greenlet/issues/252) + greenlet.getcurrent() + greenlets_before = count_objects(greenlet.greenlet) + + background_glet_running = threading.Event() + background_glet_killed = threading.Event() + background_greenlets = [] + def background_greenlet(): + # Throw control back to the main greenlet. + greenlet.getcurrent().parent.switch() + + def background_thread(): + glet = greenlet.greenlet(background_greenlet) + background_greenlets.append(glet) + glet.switch() # Be sure it's active. + # Control is ours again. + del glet # Delete one reference from the thread it runs in. + background_glet_running.set() + background_glet_killed.wait() + # To trigger the background collection of the dead + # greenlet, thus clearing out the contents of the list, we + # need to run some APIs. See issue 252. + if manually_collect_background: + greenlet.getcurrent() + + + t = threading.Thread(target=background_thread) + t.start() + background_glet_running.wait() + + lists_before = count_objects() + + assert len(background_greenlets) == 1 + self.assertFalse(background_greenlets[0].dead) + # Delete the last reference to the background greenlet + # from a different thread. This puts it in the background thread's + # ts_delkey list. + del background_greenlets[:] + background_glet_killed.set() + + # Now wait for the background thread to die. + t.join(10) + del t + + # Free the background main greenlet by forcing greenlet to notice a difference. + greenlet.getcurrent() + greenlets_after = count_objects(greenlet.greenlet) + + lists_after = count_objects() + # On 2.7, we observe that lists_after is smaller than + # lists_before. No idea what lists got cleaned up. All the + # Python 3 versions match exactly. + self.assertLessEqual(lists_after, lists_before) + + self.assertEqual(greenlets_before, greenlets_after) + + @unittest.expectedFailure + def test_issue251_issue252_need_to_collect_in_background(self): + # This still fails because the leak of the list + # still exists when we don't call a greenlet API before exiting the + # thread. The proximate cause is that neither of the two greenlets + # from the background thread are actually being destroyed, even though + # the GC is in fact visiting both objects. + # It's not clear where that leak is? For some reason the thread-local dict + # holding it isn't being cleaned up. + self.test_issue251_killing_cross_thread_leaks_list(manually_collect_background=False) diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_stack_saved.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_stack_saved.py new file mode 100644 index 0000000..6c7353b --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_stack_saved.py @@ -0,0 +1,19 @@ +import greenlet +import unittest + + +class Test(unittest.TestCase): + + def test_stack_saved(self): + main = greenlet.getcurrent() + self.assertEqual(main._stack_saved, 0) + + def func(): + main.switch(main._stack_saved) + + g = greenlet.greenlet(func) + x = g.switch() + assert x > 0, x + assert g._stack_saved > 0, g._stack_saved + g.switch() + assert g._stack_saved == 0, g._stack_saved diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_throw.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_throw.py new file mode 100644 index 0000000..a2014a9 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_throw.py @@ -0,0 +1,100 @@ +import sys +import unittest + +from greenlet import greenlet + + +def switch(*args): + return greenlet.getcurrent().parent.switch(*args) + + +class ThrowTests(unittest.TestCase): + def test_class(self): + def f(): + try: + switch("ok") + except RuntimeError: + switch("ok") + return + switch("fail") + g = greenlet(f) + res = g.switch() + self.assertEqual(res, "ok") + res = g.throw(RuntimeError) + self.assertEqual(res, "ok") + + def test_val(self): + def f(): + try: + switch("ok") + except RuntimeError: + val = sys.exc_info()[1] + if str(val) == "ciao": + switch("ok") + return + switch("fail") + + g = greenlet(f) + res = g.switch() + self.assertEqual(res, "ok") + res = g.throw(RuntimeError("ciao")) + self.assertEqual(res, "ok") + + g = greenlet(f) + res = g.switch() + self.assertEqual(res, "ok") + res = g.throw(RuntimeError, "ciao") + self.assertEqual(res, "ok") + + def test_kill(self): + def f(): + switch("ok") + switch("fail") + g = greenlet(f) + res = g.switch() + self.assertEqual(res, "ok") + res = g.throw() + self.assertTrue(isinstance(res, greenlet.GreenletExit)) + self.assertTrue(g.dead) + res = g.throw() # immediately eaten by the already-dead greenlet + self.assertTrue(isinstance(res, greenlet.GreenletExit)) + + def test_throw_goes_to_original_parent(self): + main = greenlet.getcurrent() + + def f1(): + try: + main.switch("f1 ready to catch") + except IndexError: + return "caught" + else: + return "normal exit" + + def f2(): + main.switch("from f2") + + g1 = greenlet(f1) + g2 = greenlet(f2, parent=g1) + self.assertRaises(IndexError, g2.throw, IndexError) + self.assertTrue(g2.dead) + self.assertTrue(g1.dead) + + g1 = greenlet(f1) + g2 = greenlet(f2, parent=g1) + res = g1.switch() + self.assertEqual(res, "f1 ready to catch") + res = g2.throw(IndexError) + self.assertEqual(res, "caught") + self.assertTrue(g2.dead) + self.assertTrue(g1.dead) + + g1 = greenlet(f1) + g2 = greenlet(f2, parent=g1) + res = g1.switch() + self.assertEqual(res, "f1 ready to catch") + res = g2.switch() + self.assertEqual(res, "from f2") + res = g2.throw(IndexError) + self.assertEqual(res, "caught") + self.assertTrue(g2.dead) + self.assertTrue(g1.dead) diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_tracing.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_tracing.py new file mode 100644 index 0000000..2ab4d71 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_tracing.py @@ -0,0 +1,267 @@ +import sys +import unittest +import greenlet + +class SomeError(Exception): + pass + +class GreenletTracer(object): + oldtrace = None + + def __init__(self, error_on_trace=False): + self.actions = [] + self.error_on_trace = error_on_trace + + def __call__(self, *args): + self.actions.append(args) + if self.error_on_trace: + raise SomeError + + def __enter__(self): + self.oldtrace = greenlet.settrace(self) + return self.actions + + def __exit__(self, *args): + greenlet.settrace(self.oldtrace) + + +class TestGreenletTracing(unittest.TestCase): + """ + Tests of ``greenlet.settrace()`` + """ + + def test_greenlet_tracing(self): + main = greenlet.getcurrent() + def dummy(): + pass + def dummyexc(): + raise SomeError() + + with GreenletTracer() as actions: + g1 = greenlet.greenlet(dummy) + g1.switch() + g2 = greenlet.greenlet(dummyexc) + self.assertRaises(SomeError, g2.switch) + + self.assertEqual(actions, [ + ('switch', (main, g1)), + ('switch', (g1, main)), + ('switch', (main, g2)), + ('throw', (g2, main)), + ]) + + def test_exception_disables_tracing(self): + main = greenlet.getcurrent() + def dummy(): + main.switch() + g = greenlet.greenlet(dummy) + g.switch() + with GreenletTracer(error_on_trace=True) as actions: + self.assertRaises(SomeError, g.switch) + self.assertEqual(greenlet.gettrace(), None) + + self.assertEqual(actions, [ + ('switch', (main, g)), + ]) + + +class PythonTracer(object): + oldtrace = None + + def __init__(self): + self.actions = [] + + def __call__(self, frame, event, arg): + # Record the co_name so we have an idea what function we're in. + self.actions.append((event, frame.f_code.co_name)) + + def __enter__(self): + self.oldtrace = sys.setprofile(self) + return self.actions + + def __exit__(self, *args): + sys.setprofile(self.oldtrace) + +def tpt_callback(): + return 42 + +class TestPythonTracing(unittest.TestCase): + """ + Tests of the interaction of ``sys.settrace()`` + with greenlet facilities. + + NOTE: Most of this is probably CPython specific. + """ + + maxDiff = None + + def test_trace_events_trivial(self): + with PythonTracer() as actions: + tpt_callback() + # If we use the sys.settrace instead of setprofile, we get + # this: + + # self.assertEqual(actions, [ + # ('call', 'tpt_callback'), + # ('call', '__exit__'), + # ]) + + self.assertEqual(actions, [ + ('return', '__enter__'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) + + def _trace_switch(self, glet): + with PythonTracer() as actions: + glet.switch() + return actions + + def _check_trace_events_func_already_set(self, glet): + actions = self._trace_switch(glet) + self.assertEqual(actions, [ + ('return', '__enter__'), + ('c_call', '_trace_switch'), + ('call', 'run'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('return', 'run'), + ('c_return', '_trace_switch'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) + + def test_trace_events_into_greenlet_func_already_set(self): + def run(): + return tpt_callback() + + self._check_trace_events_func_already_set(greenlet.greenlet(run)) + + def test_trace_events_into_greenlet_subclass_already_set(self): + class X(greenlet.greenlet): + def run(self): + return tpt_callback() + self._check_trace_events_func_already_set(X()) + + def _check_trace_events_from_greenlet_sets_profiler(self, g, tracer): + g.switch() + tpt_callback() + tracer.__exit__() + self.assertEqual(tracer.actions, [ + ('return', '__enter__'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('return', 'run'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) + + + def test_trace_events_from_greenlet_func_sets_profiler(self): + tracer = PythonTracer() + def run(): + tracer.__enter__() + return tpt_callback() + + self._check_trace_events_from_greenlet_sets_profiler(greenlet.greenlet(run), + tracer) + + def test_trace_events_from_greenlet_subclass_sets_profiler(self): + tracer = PythonTracer() + class X(greenlet.greenlet): + def run(self): + tracer.__enter__() + return tpt_callback() + + self._check_trace_events_from_greenlet_sets_profiler(X(), tracer) + + + def test_trace_events_multiple_greenlets_switching(self): + tracer = PythonTracer() + + g1 = None + g2 = None + + def g1_run(): + tracer.__enter__() + tpt_callback() + g2.switch() + tpt_callback() + return 42 + + def g2_run(): + tpt_callback() + tracer.__exit__() + tpt_callback() + g1.switch() + + g1 = greenlet.greenlet(g1_run) + g2 = greenlet.greenlet(g2_run) + + x = g1.switch() + self.assertEqual(x, 42) + tpt_callback() # ensure not in the trace + self.assertEqual(tracer.actions, [ + ('return', '__enter__'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('c_call', 'g1_run'), + ('call', 'g2_run'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) + + def test_trace_events_multiple_greenlets_switching_siblings(self): + # Like the first version, but get both greenlets running first + # as "siblings" and then establish the tracing. + tracer = PythonTracer() + + g1 = None + g2 = None + + def g1_run(): + greenlet.getcurrent().parent.switch() + tracer.__enter__() + tpt_callback() + g2.switch() + tpt_callback() + return 42 + + def g2_run(): + greenlet.getcurrent().parent.switch() + + tpt_callback() + tracer.__exit__() + tpt_callback() + g1.switch() + + g1 = greenlet.greenlet(g1_run) + g2 = greenlet.greenlet(g2_run) + + # Start g1 + g1.switch() + # And it immediately returns control to us. + # Start g2 + g2.switch() + # Which also returns. Now kick of the real part of the + # test. + x = g1.switch() + self.assertEqual(x, 42) + + tpt_callback() # ensure not in the trace + self.assertEqual(tracer.actions, [ + ('return', '__enter__'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('c_call', 'g1_run'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_version.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_version.py new file mode 100644 index 0000000..0c9a497 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_version.py @@ -0,0 +1,39 @@ +#! /usr/bin/env python +from __future__ import absolute_import +from __future__ import print_function + +import sys +import os +import unittest + +import greenlet + +class VersionTests(unittest.TestCase): + def test_version(self): + def find_dominating_file(name): + if os.path.exists(name): + return name + + tried = [] + here = os.path.abspath(os.path.dirname(__file__)) + for i in range(10): + up = ['..'] * i + path = [here] + up + [name] + fname = os.path.join(*path) + fname = os.path.abspath(fname) + tried.append(fname) + if os.path.exists(fname): + return fname + raise AssertionError("Could not find file " + name + "; checked " + str(tried)) + + try: + setup_py = find_dominating_file('setup.py') + except AssertionError as e: + raise unittest.SkipTest("Unable to find setup.py; must be out of tree. " + str(e)) + + + invoke_setup = "%s %s --version" % (sys.executable, setup_py) + with os.popen(invoke_setup) as f: + sversion = f.read().strip() + + self.assertEqual(sversion, greenlet.__version__) diff --git a/sbsheriff/Lib/site-packages/greenlet/tests/test_weakref.py b/sbsheriff/Lib/site-packages/greenlet/tests/test_weakref.py new file mode 100644 index 0000000..6a2ff06 --- /dev/null +++ b/sbsheriff/Lib/site-packages/greenlet/tests/test_weakref.py @@ -0,0 +1,34 @@ +import gc +import greenlet +import weakref +import unittest + + +class WeakRefTests(unittest.TestCase): + def test_dead_weakref(self): + def _dead_greenlet(): + g = greenlet.greenlet(lambda: None) + g.switch() + return g + o = weakref.ref(_dead_greenlet()) + gc.collect() + self.assertEqual(o(), None) + + def test_inactive_weakref(self): + o = weakref.ref(greenlet.greenlet()) + gc.collect() + self.assertEqual(o(), None) + + def test_dealloc_weakref(self): + seen = [] + def worker(): + try: + greenlet.getcurrent().parent.switch() + finally: + seen.append(g()) + g = greenlet.greenlet(worker) + g.switch() + g2 = greenlet.greenlet(lambda: None, g) + g = weakref.ref(g2) + g2 = None + self.assertEqual(seen, [None]) diff --git a/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/INSTALLER b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/LICENSE.txt b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/LICENSE.txt similarity index 100% rename from sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/LICENSE.txt rename to sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/LICENSE.txt diff --git a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/METADATA b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/METADATA similarity index 98% rename from sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/METADATA rename to sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/METADATA index 4e68399..eec3585 100644 --- a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/METADATA +++ b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pip -Version: 22.0.4 +Version: 22.2.2 Summary: The PyPA recommended tool for installing Python packages. Home-page: https://pip.pypa.io/ Author: The pip developers @@ -9,7 +9,6 @@ License: MIT Project-URL: Documentation, https://pip.pypa.io Project-URL: Source, https://github.com/pypa/pip Project-URL: Changelog, https://pip.pypa.io/en/stable/news/ -Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License @@ -21,6 +20,7 @@ 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 :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.7 @@ -88,5 +88,3 @@ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md - - diff --git a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/RECORD b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/RECORD similarity index 59% rename from sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/RECORD rename to sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/RECORD index 0ee920a..e8f2145 100644 --- a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/RECORD +++ b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/RECORD @@ -1,18 +1,20 @@ -../../Scripts/pip.exe,sha256=FxUv7LmzN74ZZ_OH_Xt41-FQztRZ5O4RRK1cm1R6xw4,106379 -../../Scripts/pip3.10.exe,sha256=FxUv7LmzN74ZZ_OH_Xt41-FQztRZ5O4RRK1cm1R6xw4,106379 -../../Scripts/pip3.exe,sha256=FxUv7LmzN74ZZ_OH_Xt41-FQztRZ5O4RRK1cm1R6xw4,106379 -pip-22.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-22.0.4.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 -pip-22.0.4.dist-info/METADATA,sha256=bGtDzdgW1AF93Nx32ySc78yQHtHkOrRD146Dvsz85CM,4166 -pip-22.0.4.dist-info/RECORD,, -pip-22.0.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip-22.0.4.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -pip-22.0.4.dist-info/entry_points.txt,sha256=5ExSa1s54zSPNA_1epJn5SX06786S8k5YHwskMvVYzw,125 -pip-22.0.4.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/__init__.py,sha256=b_avKym1xgWv1_1CobpKDp59sdjm_9nwB7sencJQUEY,357 +../../Scripts/pip.exe,sha256=zNe7MWGJY5vnrE40ug4IzMkbP58ZxpKsdyNBMA9ctmQ,107915 +../../Scripts/pip3.10.exe,sha256=zNe7MWGJY5vnrE40ug4IzMkbP58ZxpKsdyNBMA9ctmQ,107915 +../../Scripts/pip3.exe,sha256=zNe7MWGJY5vnrE40ug4IzMkbP58ZxpKsdyNBMA9ctmQ,107915 +pip-22.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-22.2.2.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 +pip-22.2.2.dist-info/METADATA,sha256=1THNkoBHocZtVQ8SixJH12wuSXHJIQb4Vu7RzzEjfKQ,4197 +pip-22.2.2.dist-info/RECORD,, +pip-22.2.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip-22.2.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +pip-22.2.2.dist-info/entry_points.txt,sha256=_ZUyZpzz1RdotcszCitH_lQ6yiWAKmaOcIkCEmkrePU,124 +pip-22.2.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=RKJ102-F8id9kMdMic9j7MD2OvtK6CP0CK1Erl6PtyU,357 pip/__main__.py,sha256=mXwWDftNLMKfwVqKFWGE_uuBZvGSIiUELhLkeysIuZc,1198 +pip/__pip-runner__.py,sha256=7S_j7iwRDWb9mahaaEiVL6fct6fWouB2V8W_S8FY0ME,1037 pip/__pycache__/__init__.cpython-310.pyc,, pip/__pycache__/__main__.cpython-310.pyc,, +pip/__pycache__/__pip-runner__.cpython-310.pyc,, pip/_internal/__init__.py,sha256=nnFCuxrPMgALrIDxSoy-H6Zj4W4UY60D-uL1aJyq0pc,573 pip/_internal/__pycache__/__init__.cpython-310.pyc,, pip/_internal/__pycache__/build_env.cpython-310.pyc,, @@ -23,8 +25,8 @@ pip/_internal/__pycache__/main.cpython-310.pyc,, pip/_internal/__pycache__/pyproject.cpython-310.pyc,, pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,, pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,, -pip/_internal/build_env.py,sha256=QAsnxJFvj74jS2cZUcxk7zXLvrtAYiRL0EkSPkpSJTo,9739 -pip/_internal/cache.py,sha256=71eaYwrls34HJ6gzbmmYiotiKhPNFTM_tqYJXD5nf3s,9441 +pip/_internal/build_env.py,sha256=Io06wf8aNlP1FkDYCbbuVFPGWAMJNys7l_p7r9CmEKE,9535 +pip/_internal/cache.py,sha256=-FXxS81WOM-amtx3w7N8s20PfFIlHPX8X27FfOBql-I,10623 pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,, pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc,, @@ -39,17 +41,17 @@ pip/_internal/cli/__pycache__/req_command.cpython-310.pyc,, pip/_internal/cli/__pycache__/spinners.cpython-310.pyc,, pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,, pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676 -pip/_internal/cli/base_command.py,sha256=zYHdQssEkCvWHYf3dtIApaVaxOwAh3maA61nVxaZF2M,8152 -pip/_internal/cli/cmdoptions.py,sha256=TTYO0nxK9YyLwrXk1NHrn7X3dbGoqdV02Yb8kdVoVhc,28526 -pip/_internal/cli/command_context.py,sha256=a1pBBvvGLDiZ1Kw64_4tT6HmRTwYDoYy8JFgG5Czn7s,760 +pip/_internal/cli/base_command.py,sha256=EiHzq1RBubmgYkhsVgJLNc4Y18koPUS1TzMVJwpnYxc,8146 +pip/_internal/cli/cmdoptions.py,sha256=LKKpinHThNt7wtHqxwkWJpgCUcyQeTX0GUCqyXImAbc,29985 +pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 pip/_internal/cli/main.py,sha256=ioJ8IVlb2K1qLOxR-tXkee9lURhYV89CDM71MKag7YY,2472 pip/_internal/cli/main_parser.py,sha256=Q9TnytfuC5Z2JSjBFWVGtEdYLFy7rukNIb04movHdAo,2614 -pip/_internal/cli/parser.py,sha256=CDXTuFr2UD8ozOlZYf1KDziQdo9-X_IaYOiUcyJQwrA,10788 -pip/_internal/cli/progress_bars.py,sha256=_52w11WoZrvDSR3oItLWvLrEZFUKAfLf4Y6I6WtOnIU,10339 -pip/_internal/cli/req_command.py,sha256=VwqonOy18QwZsRsVjHhp-6w15fG9x3Ltwoa8yJqQno8,18669 -pip/_internal/cli/spinners.py,sha256=TFhjxtOnLeNJ5YmRvQm4eKPgPbJNkZiqO8jOXuxRaYU,5076 +pip/_internal/cli/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817 +pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 +pip/_internal/cli/req_command.py,sha256=ypTutLv4j_efxC2f6C6aCQufxre-zaJdi5m_tWlLeBk,18172 +pip/_internal/cli/spinners.py,sha256=rs_NveD0wCoJ9GiJJmOjGC1UPVK8isOQpQsFVE899zQ,5098 pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 -pip/_internal/commands/__init__.py,sha256=Vc1HjsLEtyCh7506OozPHPKXe2Hk-z9cFkFF3BMj1lM,3736 +pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 pip/_internal/commands/__pycache__/__init__.cpython-310.pyc,, pip/_internal/commands/__pycache__/cache.cpython-310.pyc,, pip/_internal/commands/__pycache__/check.cpython-310.pyc,, @@ -61,69 +63,82 @@ pip/_internal/commands/__pycache__/freeze.cpython-310.pyc,, pip/_internal/commands/__pycache__/hash.cpython-310.pyc,, pip/_internal/commands/__pycache__/help.cpython-310.pyc,, pip/_internal/commands/__pycache__/index.cpython-310.pyc,, +pip/_internal/commands/__pycache__/inspect.cpython-310.pyc,, pip/_internal/commands/__pycache__/install.cpython-310.pyc,, pip/_internal/commands/__pycache__/list.cpython-310.pyc,, pip/_internal/commands/__pycache__/search.cpython-310.pyc,, pip/_internal/commands/__pycache__/show.cpython-310.pyc,, pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc,, pip/_internal/commands/__pycache__/wheel.cpython-310.pyc,, -pip/_internal/commands/cache.py,sha256=p9gvc6W_xgxE2zO0o8NXqO1gGJEinEK42qEC-a7Cnuk,7524 +pip/_internal/commands/cache.py,sha256=muaT0mbL-ZUpn6AaushVAipzTiMwE4nV2BLbJBwt_KQ,7582 pip/_internal/commands/check.py,sha256=0gjXR7j36xJT5cs2heYU_dfOfpnFfzX8OoPNNoKhqdM,1685 -pip/_internal/commands/completion.py,sha256=kTG_I1VR3N5kGC4Ma9pQTSoY9Q1URCrNyseHSQ-rCL4,2958 -pip/_internal/commands/configuration.py,sha256=arE8vLstjBg-Ar1krXF-bBmT1qBtnL7Fpk-NVh38a0U,8944 -pip/_internal/commands/debug.py,sha256=krET-y45CnQzXwKR1qA3M_tJE4LE2vnQtm3yfGyDSnE,6629 -pip/_internal/commands/download.py,sha256=gVIAEOcpWolhRj9hl89Qzn52G2b_pcZ8naXhxaXobdo,4942 +pip/_internal/commands/completion.py,sha256=H0TJvGrdsoleuIyQKzJbicLFppYx2OZA0BLNpQDeFjI,4129 +pip/_internal/commands/configuration.py,sha256=ZJRO2YMzI5vPA2ADTWZrSsvGd4q880CylCUzEUJziZY,9500 +pip/_internal/commands/debug.py,sha256=kVjn-O1ixLk0webD0w9vfFFq_GCTUTd2hmLOnYtDCig,6573 +pip/_internal/commands/download.py,sha256=vLtEY3QqIAddjAOGvJJsbaHJg7Har5TPa4UuOOL6Gn8,5058 pip/_internal/commands/freeze.py,sha256=gCjoD6foBZPBAAYx5t8zZLkJhsF_ZRtnb3dPuD7beO8,2951 pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 -pip/_internal/commands/index.py,sha256=8pYkICUJlccjm3E83b7UuZ5DtOfLh1N7ZHXAgkajjHo,4849 -pip/_internal/commands/install.py,sha256=YVygBF6vfrNi0jmdNBCM6bcoWb7vaALEGG1--8Mmf88,27893 -pip/_internal/commands/list.py,sha256=tTjZ7u0VIh3uhnX231Q9pwt6ObT_zrDfixRQvgpJAvM,12221 +pip/_internal/commands/index.py,sha256=1VVXXj5MsI2qH-N7uniQQyVkg-KCn_RdjiyiUmkUS5U,4762 +pip/_internal/commands/inspect.py,sha256=mRJ9aIkBQN0IJ7Um8pzaxAzVPIgL8KfWHx1fWKJgUAQ,3374 +pip/_internal/commands/install.py,sha256=nyZCUv7Oi8rScPe4WENgQ8Vd5n3OHzBuj2tw6khg4Ss,30315 +pip/_internal/commands/list.py,sha256=wF2g5i4j_JyoRckO9FAeB7KhcFAnLboy0dL-G9fn7Eo,12148 pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 -pip/_internal/commands/show.py,sha256=2VicM3jF0YWgn4O1jG_QF5oxOT0ln57VDu1NE6hqWcM,5859 -pip/_internal/commands/uninstall.py,sha256=DNTYAGJNljMO_YYBxrpcwj0FEl7lo_P55_98O6g2TNk,3526 -pip/_internal/commands/wheel.py,sha256=7HAjLclZxIzBrX6JmhmGBVxH5xrjaBYCtSdpQi1pWCE,6206 -pip/_internal/configuration.py,sha256=qmCX3uuVM73PQeAuWQHic22bhops8s31B8k02nFAoiQ,13171 +pip/_internal/commands/show.py,sha256=CJI8q4SSY0X346K1hi4Th8Nbyhl4nxPTBJUuzOlTaYE,6129 +pip/_internal/commands/uninstall.py,sha256=0JQhifYxecNrJAwoILFwjm9V1V3liXzNT-y4bgRXXPw,3680 +pip/_internal/commands/wheel.py,sha256=dar33wNjUyTN6Cy8PVxV5TerJS1u7pZmKoqgoYiQh7g,6307 +pip/_internal/configuration.py,sha256=uBKTus43pDIO6IzT2mLWQeROmHhtnoabhniKNjPYvD0,13529 pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc,, pip/_internal/distributions/__pycache__/base.cpython-310.pyc,, pip/_internal/distributions/__pycache__/installed.cpython-310.pyc,, pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc,, pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc,, -pip/_internal/distributions/base.py,sha256=3FUYD8Gb4YuSu3pggC_FRctZBDbpm5ZK89tPksIUjoE,1172 -pip/_internal/distributions/installed.py,sha256=HzfNRu3smoOm54m8H2iK6LHzBx6_DEnka4OPEsizbXg,680 -pip/_internal/distributions/sdist.py,sha256=0nJvU1RhZtbwaeYtLbzSwYrbGRcY6IgNsWdEhAHROK8,5499 -pip/_internal/distributions/wheel.py,sha256=-NgzdIs-w_hcer_U81yzgpVTljJRg5m79xufqvbjv0s,1115 +pip/_internal/distributions/base.py,sha256=jrF1Vi7eGyqFqMHrieh1PIOrGU7KeCxhYPZnbvtmvGY,1221 +pip/_internal/distributions/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729 +pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494 +pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164 pip/_internal/exceptions.py,sha256=U-dV1ixkSz6NAU6Aw9dosKi2EzZ5D3BA7ilYZuTLKeU,20912 pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 pip/_internal/index/__pycache__/__init__.cpython-310.pyc,, pip/_internal/index/__pycache__/collector.cpython-310.pyc,, pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,, pip/_internal/index/__pycache__/sources.cpython-310.pyc,, -pip/_internal/index/collector.py,sha256=E4yZHzlzPtaXg2BxaugrNg1Jwtwgs4gC-Q_0bzYrBU4,19671 -pip/_internal/index/package_finder.py,sha256=9UVg-7582nYNEWa0cIIl8otzPm4mlfyrQVuozAcssLo,36783 +pip/_internal/index/collector.py,sha256=wLRu5q9a7oVAMATsg1O4P9UT1jfjC6KaxwYf3GWI7Wk,20316 +pip/_internal/index/package_finder.py,sha256=kmcMu5_i-BP6v3NQGY0_am1ezxM2Gk4t00arZMmm4sc,37596 pip/_internal/index/sources.py,sha256=SVyPitv08-Qalh2_Bk5diAJ9GAA_d-a93koouQodAG0,6557 -pip/_internal/locations/__init__.py,sha256=ergvPwlfNTmQYFmaRYbj--ZwTN5izgTL9KE5d0FB7-8,17362 +pip/_internal/locations/__init__.py,sha256=QhB-Y6TNyaU010cimm2T4wM5loe8oRdjLwJ6xmsGc-k,17552 pip/_internal/locations/__pycache__/__init__.cpython-310.pyc,, pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc,, pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,, pip/_internal/locations/__pycache__/base.cpython-310.pyc,, -pip/_internal/locations/_distutils.py,sha256=Sk7tw8ZP1DWMYJ8MibABsa8IME2Ejv1PKeGlYQCBTZc,5871 -pip/_internal/locations/_sysconfig.py,sha256=LQNKTJKyjVqxXaPntlBwdUqTG1xwYf6GVCKMbyRJx5M,7918 -pip/_internal/locations/base.py,sha256=x5D1ONktmPJd8nnUTh-ELsAJ7fiXA-k-0a_vhfi2_Us,1579 +pip/_internal/locations/_distutils.py,sha256=AUJcoQ88zfYs9V57GsBlbhqCpyxxsAlLV1t6oqv55Xc,6272 +pip/_internal/locations/_sysconfig.py,sha256=nM-DiVHXWTxippdmN0MGVl5r7OIfIMy3vgDMlo8c_oo,7867 +pip/_internal/locations/base.py,sha256=ufyDqPwZ4jLbScD44u8AwTVI-3ft8O78UGrroQI5f68,2573 pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 -pip/_internal/metadata/__init__.py,sha256=iGoDbe_iTXQTIAEVy9f7dm-VQfZANO8kkwFr1CpqxqI,2036 +pip/_internal/metadata/__init__.py,sha256=IeqRXbTeSreqClORmjA_4CMjkWA-trWdss7Oyimwosw,3535 pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/metadata/__pycache__/_json.cpython-310.pyc,, pip/_internal/metadata/__pycache__/base.cpython-310.pyc,, pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,, -pip/_internal/metadata/base.py,sha256=SCRPtShrtPy0lfFxuaFTgJJHsRXToGFToQUAZoBBbeA,19429 -pip/_internal/metadata/pkg_resources.py,sha256=wAnEtrcgH9YtV996MfoBjR2hGLHvi3uxk0vUOHbqBak,9456 +pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595 +pip/_internal/metadata/base.py,sha256=gOjhT0Mk4f6hCa8hzZIQKynIwpHzydnm6krwGTHTVhI,24596 +pip/_internal/metadata/importlib/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107 +pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc,, +pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc,, +pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc,, +pip/_internal/metadata/importlib/_compat.py,sha256=B_qZlMBcbf2VrjHw4Pz9gfk-c-W1Mzp2u_GAzoWWuLE,1493 +pip/_internal/metadata/importlib/_dists.py,sha256=iEu6KvMdFIfq3ujQvsS0fvI9jDbp1qFC9SmOySfn_fY,7456 +pip/_internal/metadata/importlib/_envs.py,sha256=-4O0PiYmxydf0e6upJ7X-_BR4DB46I_szlgx53hnJLs,7195 +pip/_internal/metadata/pkg_resources.py,sha256=RfU--nYrkHAYJXfpoviyBHJA5b9Mw3Dc5HpeYwki1gE,9289 pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 pip/_internal/models/__pycache__/__init__.cpython-310.pyc,, pip/_internal/models/__pycache__/candidate.cpython-310.pyc,, pip/_internal/models/__pycache__/direct_url.cpython-310.pyc,, pip/_internal/models/__pycache__/format_control.cpython-310.pyc,, pip/_internal/models/__pycache__/index.cpython-310.pyc,, +pip/_internal/models/__pycache__/installation_report.cpython-310.pyc,, pip/_internal/models/__pycache__/link.cpython-310.pyc,, pip/_internal/models/__pycache__/scheme.cpython-310.pyc,, pip/_internal/models/__pycache__/search_scope.cpython-310.pyc,, @@ -131,15 +146,16 @@ pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc,, pip/_internal/models/__pycache__/target_python.cpython-310.pyc,, pip/_internal/models/__pycache__/wheel.cpython-310.pyc,, pip/_internal/models/candidate.py,sha256=6pcABsaR7CfIHlbJbr2_kMkVJFL_yrYjTx6SVWUnCPQ,990 -pip/_internal/models/direct_url.py,sha256=7XtGQSLLDQb5ZywI2EMnnLcddtf5CJLx44lMtTHPxFw,6350 +pip/_internal/models/direct_url.py,sha256=HLO0sL2aYB6n45bwmd72TDN05sLHJlOQI8M01l2SH3I,5877 pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520 pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 -pip/_internal/models/link.py,sha256=hoT_qsOBAgLBm9GKqpBrNF_mrEXeGXQE-aH_RX2cGgg,9817 +pip/_internal/models/installation_report.py,sha256=ad1arqtxrSFBvWnm6mRqmG12HLV3pZZcZcHrlTFIiqU,2617 +pip/_internal/models/link.py,sha256=_5okBLOR7vshRltnD11SC3cyD0aSxOa0lMpKWIwQ5UY,10490 pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 pip/_internal/models/search_scope.py,sha256=LwloG0PJAmtI1hFXIypsD95kWE9xfR5hf_a2v1Vw7sk,4520 pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858 -pip/_internal/models/wheel.py,sha256=hN9Ub-m-cAJCajCcQHyQNsqpcDCbPPDlEzBDwaBMc14,3500 +pip/_internal/models/wheel.py,sha256=X_fakLR3OGF7HhrhwVXCUN-1wBwVCT2Lz0o3NguT_GQ,3575 pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 pip/_internal/network/__pycache__/__init__.cpython-310.pyc,, pip/_internal/network/__pycache__/auth.cpython-310.pyc,, @@ -150,11 +166,11 @@ pip/_internal/network/__pycache__/session.cpython-310.pyc,, pip/_internal/network/__pycache__/utils.cpython-310.pyc,, pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc,, pip/_internal/network/auth.py,sha256=a3C7Xaa8kTJjXkdi_wrUjqaySc8Z9Yz7U6QIbXfzMyc,12190 -pip/_internal/network/cache.py,sha256=FJ3uTUo3wgf2KHmeZ3ltN9x3tQoy_0X6qNsRtNXsuL0,2131 -pip/_internal/network/download.py,sha256=12Ef_L7MlhNUN_0-n_3DggozWJER8c9J0us16cbvkKA,6062 -pip/_internal/network/lazy_wheel.py,sha256=1b8ZJ1w4bSBzpGzGwJR_CL2yQ6AFIwWQkS1vbPPw2XU,7627 -pip/_internal/network/session.py,sha256=38IKGKC64MTVUIH5XOR1hr2pOCzp39RccykdmGAvqRU,16729 -pip/_internal/network/utils.py,sha256=igLlTu_-q0LmL8FdJKq-Uj7AT_owrQ-T9FfyarkhK5U,4059 +pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145 +pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096 +pip/_internal/network/lazy_wheel.py,sha256=7YsbcpwOLyXbwCbR484ikhG9-C1FbUVABekVSBS0zHc,7637 +pip/_internal/network/session.py,sha256=BpDOJ7_Xw5VkgPYWsePzcaqOfcyRZcB2AW7W0HGBST0,18443 +pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791 pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip/_internal/operations/__pycache__/__init__.cpython-310.pyc,, @@ -163,12 +179,14 @@ pip/_internal/operations/__pycache__/freeze.cpython-310.pyc,, pip/_internal/operations/__pycache__/prepare.cpython-310.pyc,, pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc,, pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc,, pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc,, pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc,, pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc,, pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc,, pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc,, +pip/_internal/operations/build/build_tracker.py,sha256=vf81EwomN3xe9G8qRJED0VGqNikmRQRQoobNsxi5Xrs,4133 pip/_internal/operations/build/metadata.py,sha256=ES_uRmAvhrNm_nDTpZxshBfUsvnXtkj-g_4rZrH9Rww,1404 pip/_internal/operations/build/metadata_editable.py,sha256=_Rai0VZjxoeJUkjkuICrq45LtjwFoDOveosMYH43rKc,1456 pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198 @@ -176,31 +194,29 @@ pip/_internal/operations/build/wheel.py,sha256=AO9XnTGhTgHtZmU8Dkbfo1OGr41rBuSDj pip/_internal/operations/build/wheel_editable.py,sha256=TVETY-L_M_dSEKBhTIcQOP75zKVXw8tuq1U354Mm30A,1405 pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064 pip/_internal/operations/check.py,sha256=ca4O9CkPt9Em9sLCf3H0iVt1GIcW7M8C0U5XooaBuT4,5109 -pip/_internal/operations/freeze.py,sha256=ZiYw5GlUpLVx4VJHz4S1AP2JFNyvH0iq5kpcYj2ovyw,9770 +pip/_internal/operations/freeze.py,sha256=mwTZ2uML8aQgo3k8MR79a7SZmmmvdAJqdyaknKbavmg,9784 pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc,, pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc,, pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc,, pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc,, pip/_internal/operations/install/editable_legacy.py,sha256=ee4kfJHNuzTdKItbfAsNOSEwq_vD7DRPGkBdK48yBhU,1354 -pip/_internal/operations/install/legacy.py,sha256=x7BG8kBm0K3JO6AR4sBl0zh2LOrfUaz7EdNt-keHBv4,4091 -pip/_internal/operations/install/wheel.py,sha256=QuQyCZE-XjuJjDYRixo40oUt2ucFhNmSrCbcXY7A9aE,27412 -pip/_internal/operations/prepare.py,sha256=LJP97jsuiCAaTGVIRrcINvxc1ntVsB45MoRbyMIukg4,24145 -pip/_internal/pyproject.py,sha256=Wm2ljdT6spC-tSdf1LBRaMYSJaXr1xUxV3OwdHCW9jc,6722 -pip/_internal/req/__init__.py,sha256=A7mUvT1KAcCYP3H7gUOTx2GRMlgoDur3H68Q0OJqM5A,2793 +pip/_internal/operations/install/legacy.py,sha256=cHdcHebyzf8w7OaOLwcsTNSMSSV8WBoAPFLay_9CjE8,4105 +pip/_internal/operations/install/wheel.py,sha256=ZbmrarCh74tariXY8rgI56jbZ1BJ2Z6u5fZt4nt3Gmw,27379 +pip/_internal/operations/prepare.py,sha256=kvL-s1ZUs53g1JIzmJ62j8FwCO_fKWXN45pAtVuz0xE,22962 +pip/_internal/pyproject.py,sha256=ob0Gb0l12YLZNxjdpZGRfWHgjqhZTnSVv96RuJyNOfs,7074 +pip/_internal/req/__init__.py,sha256=rUQ9d_Sh3E5kNYqX9pkN0D06YL-LrtcbJQ-LiIonq08,2807 pip/_internal/req/__pycache__/__init__.cpython-310.pyc,, pip/_internal/req/__pycache__/constructors.cpython-310.pyc,, pip/_internal/req/__pycache__/req_file.cpython-310.pyc,, pip/_internal/req/__pycache__/req_install.cpython-310.pyc,, pip/_internal/req/__pycache__/req_set.cpython-310.pyc,, -pip/_internal/req/__pycache__/req_tracker.cpython-310.pyc,, pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,, -pip/_internal/req/constructors.py,sha256=fXmtNI_J77JFP_HRvYcQW-1nKw3AiUu6Q3b1Nm8aMm0,16094 -pip/_internal/req/req_file.py,sha256=5N8OTouPCof-305StC2YK9HBxQMw-xO46skRoBPbkZo,17421 -pip/_internal/req/req_install.py,sha256=jU1HQBT_DnXZean7jY8wPNMhb6_CzdKHcilHFY_o-Fc,32524 -pip/_internal/req/req_set.py,sha256=kHYiLvkKRx21WaLTwOI-54Ng0SSzZZ9SE7FD0PsfvYA,7584 -pip/_internal/req/req_tracker.py,sha256=jK7JDu-Wt73X-gqozrFtgJVlUlnQo0P4IQ4x4_gPlfM,4117 -pip/_internal/req/req_uninstall.py,sha256=K2BHYRRJAfkSpFqcPzc9XfX2EvbhaRtQIPRFmMtUdfo,23814 +pip/_internal/req/constructors.py,sha256=ypjtq1mOQ3d2mFkFPMf_6Mr8SLKeHQk3tUKHA1ddG0U,16611 +pip/_internal/req/req_file.py,sha256=Qgqx7qLfDO3ai72oO2U1u928_6Idajun5VFRWPZg3XM,17502 +pip/_internal/req/req_install.py,sha256=bOtpOZnDgmEst_QuWZRXViaPW1JJ1iAvO6vVFgFf0PI,33506 +pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858 +pip/_internal/req/req_uninstall.py,sha256=ZFQfgSNz6H1BMsgl87nQNr2iaQCcbFcmXpW8rKVQcic,24045 pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc,, pip/_internal/resolution/__pycache__/base.cpython-310.pyc,, @@ -208,7 +224,7 @@ pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtK pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc,, pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc,, -pip/_internal/resolution/legacy/resolver.py,sha256=b7bf5qL1ROg73sl8dhTvLdD1w5XF8xybBAF6eF_kz7c,18288 +pip/_internal/resolution/legacy/resolver.py,sha256=9em8D5TcSsEN4xZM1WreaRShOnyM4LlvhMSHpUPsocE,24129 pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc,, pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc,, @@ -220,14 +236,14 @@ pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc,, pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc,, pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc,, pip/_internal/resolution/resolvelib/base.py,sha256=u1O4fkvCO4mhmu5i32xrDv9AX5NgUci_eYVyBDQhTIM,5220 -pip/_internal/resolution/resolvelib/candidates.py,sha256=KR5jxZRSahByOABXbwrX-zNoawa7Gm9Iss-HrvrcvNw,18357 -pip/_internal/resolution/resolvelib/factory.py,sha256=0bbxnUSSjaeTmtIEgeeKtEqhEFfNhv3xpq7j9IaMq2c,28298 +pip/_internal/resolution/resolvelib/candidates.py,sha256=6kQZeMzwibnL4lO6bW0hUQQjNEvXfADdFphRRkRvOtc,18963 +pip/_internal/resolution/resolvelib/factory.py,sha256=OnjkLIgyk5Tol7uOOqapA1D4qiRHWmPU18DF1yN5N8o,27878 pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705 -pip/_internal/resolution/resolvelib/provider.py,sha256=LzQQyzMVaZYAwLgKInbq-it6mbQL1gX0hGohz5Cr5wg,9915 +pip/_internal/resolution/resolvelib/provider.py,sha256=Vd4jW_NnyifB-HMkPYtZIO70M3_RM0MbL5YV6XyBM-w,9914 pip/_internal/resolution/resolvelib/reporter.py,sha256=3ZVVYrs5PqvLFJkGLcuXoMK5mTInFzl31xjUpDBpZZk,2526 pip/_internal/resolution/resolvelib/requirements.py,sha256=B1ndvKPSuyyyTEXt9sKhbwminViSWnBrJa7qO2ln4Z0,5455 -pip/_internal/resolution/resolvelib/resolver.py,sha256=UsWuwuTu9aYHIfEBnEb7e1r3tXGgJbSA5LVgQqdVZ2w,11633 -pip/_internal/self_outdated_check.py,sha256=GKSatNlt2cz_CMGxu72FbUzuPaXpWOnIVKOOYIk0gvY,6849 +pip/_internal/resolution/resolvelib/resolver.py,sha256=nYZ9bTFXj5c1ILKnkSgU7tUCTYyo5V5J-J0sKoA7Wzg,11533 +pip/_internal/self_outdated_check.py,sha256=R3MmjCyUt_lkUNMc6p3xVSx7vX28XiDh3VDs5OrYn6Q,8020 pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip/_internal/utils/__pycache__/__init__.cpython-310.pyc,, pip/_internal/utils/__pycache__/_log.cpython-310.pyc,, @@ -264,23 +280,23 @@ pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1 pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627 pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 -pip/_internal/utils/distutils_args.py,sha256=mcAscyp80vTt3xAGTipnpgc83V-_wCvydNELVXLq7JI,1249 +pip/_internal/utils/distutils_args.py,sha256=bYUt4wfFJRaeGO4VHia6FNaA8HlYXMcKuEq1zYijY5g,1115 pip/_internal/utils/egg_link.py,sha256=5MVlpz5LirT4iLQq86OYzjXaYF0D4Qk1dprEI7ThST4,2203 -pip/_internal/utils/encoding.py,sha256=bdZ3YgUpaOEBI5MP4-DEXiQarCW3V0rxw1kRz-TaU1Q,1169 -pip/_internal/utils/entrypoints.py,sha256=aPvCnQVi9Hdk35Kloww_D5ibjUpqxgqcJP8O9VuMZek,1055 -pip/_internal/utils/filesystem.py,sha256=rrl-rY1w8TYyKYndUyZlE9ffkQyA4-jI9x_59zXkn5s,5893 +pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 +pip/_internal/utils/entrypoints.py,sha256=GgeG2FUbbYhQ0sYgG2AtM-a4d1P8MJYdmEl5IhQ-WeM,2900 +pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122 pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 pip/_internal/utils/glibc.py,sha256=tDfwVYnJCOC0BNVpItpy8CGLP9BjkxFHdl0mTS0J7fc,3110 -pip/_internal/utils/hashes.py,sha256=anpZfFGIT6HcIj2td9NHtE8AWg6GeAIhwpP8GPvZE0E,4811 +pip/_internal/utils/hashes.py,sha256=EPVx_I0UI8Gvu_skgLwpJA90pHZ5Ev1qNaZagYOub7I,4811 pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795 -pip/_internal/utils/logging.py,sha256=Rvght-fDXL70VWib1cpgZ3iU-kXODV98bNeLUlbqVto,11522 -pip/_internal/utils/misc.py,sha256=yLQuNWaRGtSGQqK7GT-Kj2mO7oXnPcJZkr5-9Q7AGwE,18392 +pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632 +pip/_internal/utils/misc.py,sha256=49Rs2NgrD4JGTKFt0farCm7FIAi-rjyoxgioArhCW_0,21617 pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 pip/_internal/utils/setuptools_build.py,sha256=vNH9hQB9wT6d-h1hVQhBKw91jNeT42meHpVeii-urOI,5652 -pip/_internal/utils/subprocess.py,sha256=vIWGpet5ARBmZ2Qn4NEHNgzCOduqbPIuByZmhhmr6mM,9182 -pip/_internal/utils/temp_dir.py,sha256=zob3PYMVevONkheOMUp_4jDofrEY3HIu5DHK78cSspI,7662 -pip/_internal/utils/unpacking.py,sha256=HUFlMEyCa9dPwdLh6sWeh95DeKytV8rsOyKShEw9y6g,8906 +pip/_internal/utils/subprocess.py,sha256=MYySbvY7qBevRxq_RFfOsDqG4vMqrB4vDoL_eyPE6Bo,9197 +pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702 +pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759 pip/_internal/utils/virtualenv.py,sha256=4_48qMzCwB_F5jIK5BC_ua7uiAMVifmQWU9NdaGUoVA,3459 pip/_internal/utils/wheel.py,sha256=lXOgZyTlOm5HmK8tw5iw0A3_5A6wRzsXHOaQkIvvloU,4549 @@ -296,13 +312,12 @@ pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,1811 pip/_internal/vcs/mercurial.py,sha256=Bzbd518Jsx-EJI0IhIobiQqiRsUv5TWYnrmRIFWE0Gw,5238 pip/_internal/vcs/subversion.py,sha256=TEMRdwECvMcXakZX0pTNUep79kmBYkWDkWFkrYmcmac,11718 pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811 -pip/_internal/wheel_builder.py,sha256=65rOA8FSYt3c3HyqEw17uujjlCgqmoKEIv6rv9xN2NM,12307 -pip/_vendor/__init__.py,sha256=xjcBX0EP50pkaMdCssrsBXoZgo2hTtYxlcH1CIyA3T4,4708 +pip/_internal/wheel_builder.py,sha256=S-_i83q75xGqKjBenUl4uaTkLyXcZf7jFgChcCNi0xc,12712 +pip/_vendor/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966 pip/_vendor/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/__pycache__/distro.cpython-310.pyc,, pip/_vendor/__pycache__/six.cpython-310.pyc,, pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc,, -pip/_vendor/cachecontrol/__init__.py,sha256=1j_YQfjmiix6YyouLrftC6NzksAm8e8xGSjMKMRPIkM,465 +pip/_vendor/cachecontrol/__init__.py,sha256=hrxlv3q7upsfyMw8k3gQ9vagBax1pYHSGGqYlZ0Zk0M,465 pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc,, pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc,, @@ -315,27 +330,27 @@ pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc,, pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc,, pip/_vendor/cachecontrol/_cmd.py,sha256=lxUXqfNTVx84zf6tcWbkLZHA6WVBRtJRpfeA9ZqhaAY,1379 pip/_vendor/cachecontrol/adapter.py,sha256=ew9OYEQHEOjvGl06ZsuX8W3DAvHWsQKHwWAxISyGug8,5033 -pip/_vendor/cachecontrol/cache.py,sha256=eMS9Bn9JWQkHiIYA5GPRBqKVU95uS-yXkxrzpoafRig,917 -pip/_vendor/cachecontrol/caches/__init__.py,sha256=gGFOtIH8QDRvkP4YAfGIh-u9YYcGZVxwLM1-6e1mPNI,170 +pip/_vendor/cachecontrol/cache.py,sha256=Tty45fOjH40fColTGkqKQvQQmbYsMpk-nCyfLcv2vG4,1535 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=h-1cUmOz6mhLsjTjOrJ8iPejpGdLCyG4lzTftfGZvLg,242 pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc,, pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc,, -pip/_vendor/cachecontrol/caches/file_cache.py,sha256=P2KHcNXiqxEW7fCq5KC-NYHGSk0nNR9NIKuN-vBTn-E,4251 -pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=tu_YBV7EV8vdBRGazUErkoRqYYjSBmNcB8dZ7BNomqk,940 +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=GpexcE29LoY4MaZwPUTcUBZaDdcsjqyLxZFznk8Hbr4,5271 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=mp-QWonP40I3xJGK3XVO-Gs9a3UjzlqqEmp9iLJH9F4,1033 pip/_vendor/cachecontrol/compat.py,sha256=LNx7vqBndYdHU8YuJt53ab_8rzMGTXVrvMb7CZJkxG0,778 -pip/_vendor/cachecontrol/controller.py,sha256=9DSEiV58Gx7Ce69fLCrRcpN-_sHzXTY4ol9bEviatR0,15625 +pip/_vendor/cachecontrol/controller.py,sha256=bAYrt7x_VH4toNpI066LQxbHpYGpY1MxxmZAhspplvw,16416 pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx_15MyFBpcs,3946 pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154 -pip/_vendor/cachecontrol/serialize.py,sha256=dlySaeA5U7Q5eHvjiObgo1M8j8_huVjfWjid7Aq-r8c,6783 +pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105 pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774 -pip/_vendor/certifi/__init__.py,sha256=xWdRgntT3j1V95zkRipGOg_A1UfEju2FcpujhysZLRI,62 +pip/_vendor/certifi/__init__.py,sha256=SuZ3iYmzdRyUv-PiaZkquUgXtWZ16ICUKgymlEBspx0,94 pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,, pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,, -pip/_vendor/certifi/cacert.pem,sha256=-og4Keu4zSpgL5shwfhd4kz0eUnVILzrGCi0zRy2kGw,265969 -pip/_vendor/certifi/core.py,sha256=gOFd0zHYlx4krrLEn982esOtmz3djiG0BFSDhgjlvcI,2840 -pip/_vendor/chardet/__init__.py,sha256=mWZaWmvZkhwfBEAT9O1Y6nRTfKzhT7FHhQTTAujbqUA,3271 +pip/_vendor/certifi/cacert.pem,sha256=pZ_eiDoO-ddKudrQCWieABc9KFlbV0FsmLLugygMbkw,285222 +pip/_vendor/certifi/core.py,sha256=g6EYcIFUAhYv5CB9B94iKRgMfGj8f82MF0CRdTDovxM,3052 +pip/_vendor/chardet/__init__.py,sha256=9-r0i294avRciob2HKVcKf6GJmXPHpgMqIijVrqHBDU,3705 pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/big5freq.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/big5prober.cpython-310.pyc,, @@ -343,7 +358,6 @@ pip/_vendor/chardet/__pycache__/chardistribution.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/charsetprober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-310.pyc,, -pip/_vendor/chardet/__pycache__/compat.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/cp949prober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/enums.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/escprober.cpython-310.pyc,, @@ -357,6 +371,8 @@ pip/_vendor/chardet/__pycache__/gb2312freq.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/gb2312prober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/hebrewprober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/jisfreq.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/johabfreq.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/johabprober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/jpcntx.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-310.pyc,, @@ -373,55 +389,58 @@ pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/sjisprober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/universaldetector.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/utf1632prober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/utf8prober.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/version.cpython-310.pyc,, -pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 -pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 -pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 -pip/_vendor/chardet/charsetgroupprober.py,sha256=GZLReHP6FRRn43hvSOoGCxYamErKzyp6RgOQxVeC3kg,3839 -pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 -pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274 +pip/_vendor/chardet/big5prober.py,sha256=neUXIlq35507yibstiznZWFzyNcMn6EXrqJaUJVPWKg,1741 +pip/_vendor/chardet/chardistribution.py,sha256=M9NTKdM72KieFKy4TT5eml4PP0WaVcXuY5PpWSFD0FA,9608 +pip/_vendor/chardet/charsetgroupprober.py,sha256=CaIBAmNitEsYuSgMvgAsMREN4cLxMj5OYwMhVo6MAxk,3817 +pip/_vendor/chardet/charsetprober.py,sha256=Eo3w8sCmbvnVKOGNW1iy50KATVs8xV-gF7cQ0VG85dQ,4801 +pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip/_vendor/chardet/cli/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-310.pyc,, -pip/_vendor/chardet/cli/chardetect.py,sha256=XK5zqjUG2a4-y6eLHZ8ThYcp6WWUrdlmELxNypcc2SE,2747 -pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 -pip/_vendor/chardet/compat.py,sha256=40zr6wICZwknxyuLGGcIOPyve8DTebBCbbvttvnmp5Q,1200 -pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 -pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 -pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 -pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 -pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 -pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 -pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 -pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 -pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 -pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 -pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 -pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 -pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 -pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 -pip/_vendor/chardet/langbulgarianmodel.py,sha256=rk9CJpuxO0bObboJcv6gNgWuosYZmd8qEEds5y7DS_Y,105697 -pip/_vendor/chardet/langgreekmodel.py,sha256=S-uNQ1ihC75yhBvSux24gLFZv3QyctMwC6OxLJdX-bw,99571 -pip/_vendor/chardet/langhebrewmodel.py,sha256=DzPP6TPGG_-PV7tqspu_d8duueqm7uN-5eQ0aHUw1Gg,98776 -pip/_vendor/chardet/langhungarianmodel.py,sha256=RtJH7DZdsmaHqyK46Kkmnk5wQHiJwJPPJSqqIlpeZRc,102498 -pip/_vendor/chardet/langrussianmodel.py,sha256=THqJOhSxiTQcHboDNSc5yofc2koXXQFHFyjtyuntUfM,131180 -pip/_vendor/chardet/langthaimodel.py,sha256=R1wXHnUMtejpw0JnH_JO8XdYasME6wjVqp1zP7TKLgg,103312 -pip/_vendor/chardet/langturkishmodel.py,sha256=rfwanTptTwSycE4-P-QasPmzd-XVYgevytzjlEzBBu8,95946 -pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 -pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 -pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 -pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/cli/chardetect.py,sha256=1qMxT3wrp5vP6ugSf1-Zz3BWwlbCWJ0jzeCuhgX85vw,2406 +pip/_vendor/chardet/codingstatemachine.py,sha256=BiGR9kgTYbS4gJI5qBmE52HMOBOR_roDvXf7aIehdEk,3559 +pip/_vendor/chardet/cp949prober.py,sha256=kCQEaOCzMntqv7pAyXEobWTRgIUxYfoiUr0btXO1nI8,1838 +pip/_vendor/chardet/enums.py,sha256=Rodw4p61Vg9U-oCo6eUuT7uDzKwIbCaA15HwbvCoCNk,1619 +pip/_vendor/chardet/escprober.py,sha256=girD61r3NsQLnMQXsWWBU4hHuRJzTH3V7-VfTUr-nQY,3864 +pip/_vendor/chardet/escsm.py,sha256=0Vs4iPPovberMoSxxnK5pI161Xf-mtKgOl14g5Xc7zg,12021 +pip/_vendor/chardet/eucjpprober.py,sha256=pGgs4lINwCEDV2bxqIZ6hXpaj2j4l2oLsMx6kuOK_zQ,3676 +pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566 +pip/_vendor/chardet/euckrprober.py,sha256=qBuSS2zXWaoUmGdzz3owAnD1GNhuKR_8bYzDC3yxe6I,1731 +pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913 +pip/_vendor/chardet/euctwprober.py,sha256=SLnCoJC94jZL8PJio60Q8PZACJA1rVPtUdWMa1W8Pwk,1731 +pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735 +pip/_vendor/chardet/gb2312prober.py,sha256=NS_i52jZE0TnWGkKqFduvu9fzW0nMcS2XbYJ8qSX8hY,1737 +pip/_vendor/chardet/hebrewprober.py,sha256=1l1hXF8-2IWDrPkf85UvAO1GVtMfY1r11kDgOqa-gU4,13919 +pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796 +pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498 +pip/_vendor/chardet/johabprober.py,sha256=C18osd4vMPfy9facw-Y1Lor_9UrW0PeV-zxM2fu441c,1730 +pip/_vendor/chardet/jpcntx.py,sha256=m1gDpPkRca4EDwym8XSL5YdoILFnFsDbNBYMQV7_-NE,26797 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562 +pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484 +pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196 +pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363 +pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035 +pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774 +pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372 +pip/_vendor/chardet/latin1prober.py,sha256=u_iGcQMUcZLXvj4B_WXx4caA0C5oaE2Qj1KTpz_RQ1I,5260 +pip/_vendor/chardet/mbcharsetprober.py,sha256=iKKuB6o_FF80NynRLBDT0UtwOnpLqmL_OspRPMib7CM,3367 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=1D_kp9nv2_NQRddq9I2WDvB35OJh7Tfpo-OYTnL3B5o,2056 +pip/_vendor/chardet/mbcssm.py,sha256=EfORNu1WXgnFvpFarU8uJHS8KFif63xmgrHOB4DdDdY,30068 pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/chardet/metadata/__pycache__/languages.cpython-310.pyc,, -pip/_vendor/chardet/metadata/languages.py,sha256=41tLq3eLSrBEbEVVQpVGFq9K7o1ln9b1HpY1l0hCUQo,19474 -pip/_vendor/chardet/sbcharsetprober.py,sha256=nmyMyuxzG87DN6K3Rk2MUzJLMLR69MrWpdnHzOwVUwQ,6136 -pip/_vendor/chardet/sbcsgroupprober.py,sha256=hqefQuXmiFyDBArOjujH6hd6WFXlOD1kWCsxDhjx5Vc,4309 -pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 -pip/_vendor/chardet/universaldetector.py,sha256=DpZTXCX0nUHXxkQ9sr4GZxGB_hveZ6hWt3uM94cgWKs,12503 -pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 -pip/_vendor/chardet/version.py,sha256=A4CILFAd8MRVG1HoXPp45iK9RLlWyV73a1EtwE8Tvn8,242 -pip/_vendor/colorama/__init__.py,sha256=pCdErryzLSzDW5P-rRPBlPLqbBtIRNJB6cMgoeJns5k,239 +pip/_vendor/chardet/metadata/languages.py,sha256=HcaBygWtZq3gR8prIkJp_etvkhm2V4pUIToqjPZhgrc,13280 +pip/_vendor/chardet/sbcharsetprober.py,sha256=VvtWiNRLbHDZ5xgnofsmP1u8VQIkkaAuw3Ir9m1zDzQ,6199 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=mekr4E3hgT4onmwi8oi1iEGW1CN-Z-BArG6kOtCunJw,4129 +pip/_vendor/chardet/sjisprober.py,sha256=sLfWS25PVFr5cDGhEf6h_s-RJsyeSteA-4ynsTl_UvA,3749 +pip/_vendor/chardet/universaldetector.py,sha256=BHeNWt1kn0yQgnR6xNtLAjiNmEQpSHYlKEvuZ9QyR1k,13288 +pip/_vendor/chardet/utf1632prober.py,sha256=N42YJEOkVDB67c38t5aJhXMG1QvnyWWDMNY5ERzniU0,8289 +pip/_vendor/chardet/utf8prober.py,sha256=mnLaSBV4gg-amt2WmxKFKWy4vVBedMNgjdbvgzBo0Dc,2709 +pip/_vendor/chardet/version.py,sha256=u_QYi-DXU1s7fyC_Rwa0I0-UcxMVmH7Co6c7QGKbe3g,242 +pip/_vendor/colorama/__init__.py,sha256=ihDoWQOkapwF7sqQ99AoDoEF3vGYm40OtmgW211cLZw,239 pip/_vendor/colorama/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/colorama/__pycache__/ansi.cpython-310.pyc,, pip/_vendor/colorama/__pycache__/ansitowin32.cpython-310.pyc,, @@ -429,11 +448,11 @@ pip/_vendor/colorama/__pycache__/initialise.cpython-310.pyc,, pip/_vendor/colorama/__pycache__/win32.cpython-310.pyc,, pip/_vendor/colorama/__pycache__/winterm.cpython-310.pyc,, pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 -pip/_vendor/colorama/ansitowin32.py,sha256=yV7CEmCb19MjnJKODZEEvMH_fnbJhwnpzo4sxZuGXmA,10517 +pip/_vendor/colorama/ansitowin32.py,sha256=gGrO7MVtwc-j1Sq3jKfZpERT1JWmYSOsTVDiTnFbZU4,10830 pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 -pip/_vendor/distlib/__init__.py,sha256=HTGLP7dnTRTQCbEZNGUxBq-0sobr0KQUMn3yd6uEObA,581 +pip/_vendor/distlib/__init__.py,sha256=kshNHF2XFPxmBv57X7Jsj7c6VzF5r9naVwGePP-s5Wc,581 pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,, pip/_vendor/distlib/__pycache__/database.cpython-310.pyc,, @@ -447,102 +466,30 @@ pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc,, pip/_vendor/distlib/__pycache__/util.cpython-310.pyc,, pip/_vendor/distlib/__pycache__/version.cpython-310.pyc,, pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc,, -pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 -pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/distlib/_backport/__pycache__/misc.cpython-310.pyc,, -pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-310.pyc,, -pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-310.pyc,, -pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-310.pyc,, -pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 -pip/_vendor/distlib/_backport/shutil.py,sha256=IX_G2NPqwecJibkIDje04bqu0xpHkfSQ2GaGdEVqM5Y,25707 -pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 -pip/_vendor/distlib/_backport/sysconfig.py,sha256=BQHFlb6pubCl_dvT1NjtzIthylofjKisox239stDg0U,26854 -pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 -pip/_vendor/distlib/compat.py,sha256=fbsxc5PfJ2wBx1K4k6mQ2goAYs-GZW0tcOPIlE_vf0I,41495 -pip/_vendor/distlib/database.py,sha256=Kl0YvPQKc4OcpVi7k5cFziydM1xOK8iqdxLGXgbZHV4,51059 -pip/_vendor/distlib/index.py,sha256=UfcimNW19AB7IKWam4VaJbXuCBvArKfSxhV16EwavzE,20739 -pip/_vendor/distlib/locators.py,sha256=AKlB3oZvfOTg4E0CtfwOzujFL19X5V4XUA4eHdKOu44,51965 +pip/_vendor/distlib/compat.py,sha256=tfoMrj6tujk7G4UC2owL6ArgDuCKabgBxuJRGZSmpko,41259 +pip/_vendor/distlib/database.py,sha256=o_mw0fAr93NDAHHHfqG54Y1Hi9Rkfrp2BX15XWZYK50,51697 +pip/_vendor/distlib/index.py,sha256=HFiDG7LMoaBs829WuotrfIwcErOOExUOR_AeBtw_TCU,20834 +pip/_vendor/distlib/locators.py,sha256=wNzG-zERzS_XGls-nBPVVyLRHa2skUlkn0-5n0trMWA,51991 pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 -pip/_vendor/distlib/markers.py,sha256=9c70ISEKwBjmUOHuIdOygVnRVESOKdNYp9a2TVn4qrI,4989 -pip/_vendor/distlib/metadata.py,sha256=vatoxFdmBr6ie-sTVXVNPOPG3uwMDWJTnEECnm7xDCw,39109 +pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-U,5058 +pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801 pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 -pip/_vendor/distlib/scripts.py,sha256=tjSwENINeV91ROZxec5zTSMRg2jEeKc4enyCHDzNvEE,17720 -pip/_vendor/distlib/t32.exe,sha256=NS3xBCVAld35JVFNmb-1QRyVtThukMrwZVeXn4LhaEQ,96768 -pip/_vendor/distlib/t64-arm.exe,sha256=8WGDh6aI8WJAjngRNQpyJpB21Sv20PCYYFSNW1fWd6w,180736 -pip/_vendor/distlib/t64.exe,sha256=oAqHes78rUWVM0OtVqIhUvequl_PKhAhXYQWnUf7zR0,105984 -pip/_vendor/distlib/util.py,sha256=0Uq_qa63FCLtdyNdWvMnmPbiSvVa-ykHM2E8HT7LSIU,67766 +pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102 +pip/_vendor/distlib/t32.exe,sha256=lD3IWCwZiYZ9onypJifi2R1sGS-S24t3mYupsEAOKyA,97792 +pip/_vendor/distlib/t64-arm.exe,sha256=3hjLTLg7XBVHwDxgzZpkiHXXp4IJQMLvg_ZlGGpKZDI,182784 +pip/_vendor/distlib/t64.exe,sha256=vvS31h4-SnumthypJJKAWBeBh7cxSJ8AwGmbqumM05k,107520 +pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262 pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513 -pip/_vendor/distlib/w32.exe,sha256=lJtnZdeUxTZWya_EW5DZos_K5rswRECGspIl8ZJCIXs,90112 -pip/_vendor/distlib/w64-arm.exe,sha256=Q_HdzVu9zxYdaBa3m0iJ5_ddLOEqtPe8x30WADoXza8,166400 -pip/_vendor/distlib/w64.exe,sha256=0aRzoN2BO9NWW4ENy4_4vHkHR4qZTFZNVSAJJYlODTI,99840 -pip/_vendor/distlib/wheel.py,sha256=pj5VVCjqZMcHvgizORWwAFPS7hOk61CZ59dxP8laQ4E,42943 -pip/_vendor/distro.py,sha256=O1EeHMq1-xAO373JI2_6pYEtd09yEkxtmrYkdY-9S-w,48414 -pip/_vendor/html5lib/__init__.py,sha256=BYzcKCqeEii52xDrqBFruhnmtmkiuHXFyFh-cglQ8mk,1160 -pip/_vendor/html5lib/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-310.pyc,, -pip/_vendor/html5lib/__pycache__/_inputstream.cpython-310.pyc,, -pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-310.pyc,, -pip/_vendor/html5lib/__pycache__/_utils.cpython-310.pyc,, -pip/_vendor/html5lib/__pycache__/constants.cpython-310.pyc,, -pip/_vendor/html5lib/__pycache__/html5parser.cpython-310.pyc,, -pip/_vendor/html5lib/__pycache__/serializer.cpython-310.pyc,, -pip/_vendor/html5lib/_ihatexml.py,sha256=ifOwF7pXqmyThIXc3boWc96s4MDezqRrRVp7FwDYUFs,16728 -pip/_vendor/html5lib/_inputstream.py,sha256=jErNASMlkgs7MpOM9Ve_VdLDJyFFweAjLuhVutZz33U,32353 -pip/_vendor/html5lib/_tokenizer.py,sha256=04mgA2sNTniutl2fxFv-ei5bns4iRaPxVXXHh_HrV_4,77040 -pip/_vendor/html5lib/_trie/__init__.py,sha256=nqfgO910329BEVJ5T4psVwQtjd2iJyEXQ2-X8c1YxwU,109 -pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-310.pyc,, -pip/_vendor/html5lib/_trie/__pycache__/py.cpython-310.pyc,, -pip/_vendor/html5lib/_trie/_base.py,sha256=CaybYyMro8uERQYjby2tTeSUatnWDfWroUN9N7ety5w,1013 -pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 -pip/_vendor/html5lib/_utils.py,sha256=Dx9AKntksRjFT1veBj7I362pf5OgIaT0zglwq43RnfU,4931 -pip/_vendor/html5lib/constants.py,sha256=Ll-yzLU_jcjyAI_h57zkqZ7aQWE5t5xA4y_jQgoUUhw,83464 -pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-310.pyc,, -pip/_vendor/html5lib/filters/__pycache__/base.cpython-310.pyc,, -pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-310.pyc,, -pip/_vendor/html5lib/filters/__pycache__/lint.cpython-310.pyc,, -pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-310.pyc,, -pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-310.pyc,, -pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-310.pyc,, -pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 -pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 -pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 -pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 -pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 -pip/_vendor/html5lib/filters/sanitizer.py,sha256=m6oGmkBhkGAnn2nV6D4hE78SCZ6WEnK9rKdZB3uXBIc,26897 -pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 -pip/_vendor/html5lib/html5parser.py,sha256=anr-aXre_ImfrkQ35c_rftKXxC80vJCREKe06Tq15HA,117186 -pip/_vendor/html5lib/serializer.py,sha256=_PpvcZF07cwE7xr9uKkZqh5f4UEaI8ltCU2xPJzaTpk,15759 -pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 -pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-310.pyc,, -pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-310.pyc,, -pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 -pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 -pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 -pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-310.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-310.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-310.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-310.pyc,, -pip/_vendor/html5lib/treebuilders/base.py,sha256=z-o51vt9r_l2IDG5IioTOKGzZne4Fy3_Fc-7ztrOh4I,14565 -pip/_vendor/html5lib/treebuilders/dom.py,sha256=22whb0C71zXIsai5mamg6qzBEiigcBIvaDy4Asw3at0,8925 -pip/_vendor/html5lib/treebuilders/etree.py,sha256=w5ZFpKk6bAxnrwD2_BrF5EVC7vzz0L3LMi9Sxrbc_8w,12836 -pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9gqDjs-IxsPhBYa5cpvv2FZ1KZlG83Giusy2lFmvIkE,14766 -pip/_vendor/html5lib/treewalkers/__init__.py,sha256=OBPtc1TU5mGyy18QDMxKEyYEz0wxFUUNj5v0-XgmYhY,5719 -pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-310.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-310.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-310.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-310.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-310.pyc,, -pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 -pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 -pip/_vendor/html5lib/treewalkers/etree.py,sha256=xo1L5m9VtkfpFJK0pFmkLVajhqYYVisVZn3k9kYpPkI,4551 -pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=_b0LAVWLcVu9WaU_-w3D8f0IRSpCbjf667V-3NRdhTw,6357 -pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/distlib/w32.exe,sha256=-a9nfgVZClK_mGnbQtXVLbn7xtPYw3xDKTddKnu2AJ8,91648 +pip/_vendor/distlib/w64-arm.exe,sha256=LW-JyIIGblDOp8Psy8igJXDvcg_YpJIINvN0tRjfv18,168448 +pip/_vendor/distlib/w64.exe,sha256=XvKqAoQzca86ERd2-KV5Vo1RSOBM28I2a35sPQONrYI,101888 +pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898 +pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 +pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 +pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc,, +pip/_vendor/distro/__pycache__/distro.cpython-310.pyc,, +pip/_vendor/distro/distro.py,sha256=UYQG_9H_iSOt422uasA92HlY7aXeTnWKdV-IhsSAdwQ,48841 pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/idna/__pycache__/codec.cpython-310.pyc,, @@ -559,16 +506,14 @@ pip/_vendor/idna/idnadata.py,sha256=fzMzkCea2xieVxcrjngJ-2pLsKQNejPCZFlBajIuQdw, pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 pip/_vendor/idna/package_data.py,sha256=szxQhV0ZD0nKJ84Kuobw3l8q4_KeCyXjFRdpwIpKZmw,21 pip/_vendor/idna/uts46data.py,sha256=o-D7V-a0fOLZNd7tvxof6MYfUd0TBZzE2bLR5XO67xU,204400 -pip/_vendor/msgpack/__init__.py,sha256=2gJwcsTIaAtCM0GMi2rU-_Y6kILeeQuqRkrQ22jSANc,1118 +pip/_vendor/msgpack/__init__.py,sha256=NryGaKLDk_Egd58ZxXpnuI7OWO27AXz7S6CBFRM3sAY,1132 pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/msgpack/__pycache__/_version.cpython-310.pyc,, pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc,, pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc,, pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc,, -pip/_vendor/msgpack/_version.py,sha256=JpTcnRd3YUioA24NDtDZbLW0Nhl2yA-N1Rq2lLDBB-g,20 pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 -pip/_vendor/msgpack/ext.py,sha256=4l356Y4sVEcvCla2dh_cL57vh4GMhZfa3kuWHFHYz6A,6088 -pip/_vendor/msgpack/fallback.py,sha256=L5jriXysURbf6rPbbHbvXgvoFrKZiryIBmujMTcrf3A,34475 +pip/_vendor/msgpack/ext.py,sha256=TuldJPkYu8Wo_Xh0tFGL2l06-gY88NSR8tOje9fo2Wg,6080 +pip/_vendor/msgpack/fallback.py,sha256=OORDn86-fHBPlu-rPlMdM10KzkH6S_Rx9CHN1b7o4cg,34557 pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661 pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 pip/_vendor/packaging/__pycache__/__about__.cpython-310.pyc,, @@ -617,7 +562,7 @@ pip/_vendor/pkg_resources/__init__.py,sha256=NnpQ3g6BCHzpMgOR_OLBmYtniY4oOzdKpwq pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-310.pyc,, pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 -pip/_vendor/platformdirs/__init__.py,sha256=Aizpxewwd4nY63Gqw-Od1Rso9Ah4bSoc6rkx-GBRu2Y,12676 +pip/_vendor/platformdirs/__init__.py,sha256=x0aUmmovXXuRFVrVQBtwIiovX12B7rUkdV4F9UlLz0Y,12831 pip/_vendor/platformdirs/__main__.py,sha256=ZmsnTxEOxtTvwa-Y_Vfab_JN3X4XCVeN8X0yyy9-qnc,1176 pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc,, @@ -627,24 +572,14 @@ pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc,, pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc,, pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc,, pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc,, -pip/_vendor/platformdirs/android.py,sha256=xhlD4NmrKCARe5lgnpBGYo4lOYxEOBOByNDNYy91gEE,4012 +pip/_vendor/platformdirs/android.py,sha256=GKizhyS7ESRiU67u8UnBJLm46goau9937EchXWbPBlk,4068 pip/_vendor/platformdirs/api.py,sha256=MXKHXOL3eh_-trSok-JUTjAR_zjmmKF3rjREVABjP8s,4910 pip/_vendor/platformdirs/macos.py,sha256=-3UXQewbT0yMhMdkzRXfXGAntmLIH7Qt4a9Hlf8I5_Y,2655 pip/_vendor/platformdirs/unix.py,sha256=b4aVYTz0qZ50HntwOXo8r6tp82jAa3qTjxw-WlnC2yc,6910 -pip/_vendor/platformdirs/version.py,sha256=bXzLJCe23FNQRQrf7ZRWKejxWnct_wft7dxdkMGT33E,80 +pip/_vendor/platformdirs/version.py,sha256=tsBKKPDX3LLh39yHXeTYauGRbRd-AmOJr9SwKldlFIU,78 pip/_vendor/platformdirs/windows.py,sha256=ISruopR5UGBePC0BxCxXevkZYfjJsIZc49YWU5iYfQ4,6439 -pip/_vendor/progress/__init__.py,sha256=1HejNZtv2ouUNQeStUDAtZrtwkz_3FmYKQ476hJ7zOs,5294 -pip/_vendor/progress/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/progress/__pycache__/bar.cpython-310.pyc,, -pip/_vendor/progress/__pycache__/colors.cpython-310.pyc,, -pip/_vendor/progress/__pycache__/counter.cpython-310.pyc,, -pip/_vendor/progress/__pycache__/spinner.cpython-310.pyc,, -pip/_vendor/progress/bar.py,sha256=GbedY0oZ-Q1duXjmvVLO0tSf-uTSH7hJ3zzyI91Esws,2942 -pip/_vendor/progress/colors.py,sha256=cCYXQnYFYVmQKKmYEbQ_lj6SPSFzdw4FN98F2x2kR-U,2655 -pip/_vendor/progress/counter.py,sha256=zYt9DWH0_05s8Q9TrJwHVud-WwsyyaR3PwYtk5hxwwQ,1613 -pip/_vendor/progress/spinner.py,sha256=u5ElzW94XEiLGH-aAlr54VJtKfeK745xr6UfGvvflzU,1461 -pip/_vendor/pygments/__init__.py,sha256=CAmA9UthykwxvtutUcH0IxqtiyQcSg6CmYdM-jKlcRY,3002 -pip/_vendor/pygments/__main__.py,sha256=X7rGLMUC54EXgO14FZ9goKXZDmhPzKXTsUglmb_McIU,353 +pip/_vendor/pygments/__init__.py,sha256=M4yPkVb6x8OkEb4tHfVU8p6B3DBEsshB_8a2gZvr4FE,3002 +pip/_vendor/pygments/__main__.py,sha256=p0_rz3JZmNZMNZBOqDojaEx1cr9wmA9FQZX_TYl74lQ,353 pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/cmdline.cpython-310.pyc,, @@ -661,13 +596,13 @@ pip/_vendor/pygments/__pycache__/style.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/token.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/util.cpython-310.pyc,, -pip/_vendor/pygments/cmdline.py,sha256=XpsyWgErcSqHC7rXiYKLF3Y61Uy8SR2DNQDDhZGuezg,23408 -pip/_vendor/pygments/console.py,sha256=QZXBUAkyl4dPLQ1e6XHjQu3mmXBWvuGQwsQT2q1mtCY,1697 -pip/_vendor/pygments/filter.py,sha256=35iMZiB1rcuogxokm92kViB2DPXPp_wWoxWuMmwvvzY,1938 -pip/_vendor/pygments/filters/__init__.py,sha256=-veOimzCyYGEARru2Dfo6ofSYcZ8tGsIVuMprtaZQ24,40292 +pip/_vendor/pygments/cmdline.py,sha256=HYs14dbtMgL7t_BJ7B84NXlFjOzMYgW7Z0ZSxkTJun4,23408 +pip/_vendor/pygments/console.py,sha256=hQfqCFuOlGk7DW2lPQYepsw-wkOH1iNt9ylNA1eRymM,1697 +pip/_vendor/pygments/filter.py,sha256=NglMmMPTRRv-zuRSE_QbWid7JXd2J4AvwjCW2yWALXU,1938 +pip/_vendor/pygments/filters/__init__.py,sha256=F8WwJguaJLs3bomEH8LyVATQfpULTpSpTd4PRPONR5A,40292 pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/pygments/formatter.py,sha256=zSBbX2U_OOriy7SJvSTK6OAxjuXtROWxQlNpJEJZjBA,2917 -pip/_vendor/pygments/formatters/__init__.py,sha256=fjkYDy5-F998XczKi0ymHFayr5ObIRLHF8cgp9k8kpA,5119 +pip/_vendor/pygments/formatter.py,sha256=6-TS2Y8pUMeWIUolWwr1O8ruC-U6HydWDwOdbAiJgJQ,2917 +pip/_vendor/pygments/formatters/__init__.py,sha256=5LfCZThsbVVtZU5OyavkRPwC0MV7tB6pqcJ793PWi6E,5119 pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-310.pyc,, @@ -682,38 +617,38 @@ pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/svg.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-310.pyc,, -pip/_vendor/pygments/formatters/_mapping.py,sha256=3A1rYSjYN9MLduCFWy2_mYhllPVpwlw55anRYnPXX8w,6516 -pip/_vendor/pygments/formatters/bbcode.py,sha256=cSKMOioUnE4TzvCCsK4IbJ6G78W07ZwHtkz4V1Wte0U,3314 -pip/_vendor/pygments/formatters/groff.py,sha256=ULgMKvGeLswX0KZn3IBp0p0U3rruiSHBtpl6O5qbqLs,5005 -pip/_vendor/pygments/formatters/html.py,sha256=0jM7Jc4xA4tsjmPq35uklm_En_OVdcNb0__SEXp2pDQ,35330 -pip/_vendor/pygments/formatters/img.py,sha256=r4iag_jCfyv_LhIt-1fRDeVEEoAfVJzkD9nZChIwiS8,21819 -pip/_vendor/pygments/formatters/irc.py,sha256=gi_IeIZeNaTfTMtvseLigZdS6lNicN7r7O7rnI6myo0,5871 -pip/_vendor/pygments/formatters/latex.py,sha256=qZUerrHt2Nn2aB4gJcdqj99qBkIxl_1v1ukYsf230Gk,18930 -pip/_vendor/pygments/formatters/other.py,sha256=Q01LtkqPZ8m_EYdgMVzXPUGjHoL00lXI3By97wzytYU,5073 -pip/_vendor/pygments/formatters/pangomarkup.py,sha256=ZpjALTSuGFwviJd5kOYwr-1NgqxCX3XRJrjXC7x1UbQ,2212 -pip/_vendor/pygments/formatters/rtf.py,sha256=qh7-z_wbUsTY6z7fZUGrYECYBlWB0wEdBwIZVEVybL0,5014 -pip/_vendor/pygments/formatters/svg.py,sha256=T7Jj004I3JUPOr48aAhQ368K2qWCciUyMQ2tdU-LB-4,7335 -pip/_vendor/pygments/formatters/terminal.py,sha256=cRD5hitINOkYlGZo9ma252vpJYPSGNgLivrsm6zGyec,4674 -pip/_vendor/pygments/formatters/terminal256.py,sha256=Bvz9zZL3UWc94TDm1GhKMI4x0BTit0XplhyRL0zmtkw,11753 -pip/_vendor/pygments/lexer.py,sha256=ECXWlEsbRnKs_njozZns6BGQ4riTMzct_BzAr3zV6dY,31937 -pip/_vendor/pygments/lexers/__init__.py,sha256=6Ds0GVBP3jrIU02wmjRdpoL4eFGhwT2IVD1zf3cV5_Y,11307 +pip/_vendor/pygments/formatters/_mapping.py,sha256=QLyYZ7Cv9W7YcM8seq0XqR3MXW3MzoFZSyHd7BDNU84,6517 +pip/_vendor/pygments/formatters/bbcode.py,sha256=JrL4ITjN-KzPcuQpPMBf1pm33eW2sDUNr8WzSoAJsJA,3314 +pip/_vendor/pygments/formatters/groff.py,sha256=xrOFoLbafSA9uHsSLRogy79_Zc4GWJ8tMK2hCdTJRsw,5086 +pip/_vendor/pygments/formatters/html.py,sha256=QNt9prPgxmbKx2M-nfDwoR1bIg06-sNouQuWnE434Wc,35441 +pip/_vendor/pygments/formatters/img.py,sha256=j3hHU1fhbBEIKEtWTV-vc-z-5c2nqoobOty3QqeQbpk,21819 +pip/_vendor/pygments/formatters/irc.py,sha256=iwk5tDJOxbCV64SCmOFyvk__x6RD60ay0nUn7ko9n7U,5871 +pip/_vendor/pygments/formatters/latex.py,sha256=thPbytJCIs2AUXsO3NZwqKtXJ-upOlcXP4CXsx94G4w,19351 +pip/_vendor/pygments/formatters/other.py,sha256=PczqK1Rms43lz6iucOLPeBMxIncPKOGBt-195w1ynII,5073 +pip/_vendor/pygments/formatters/pangomarkup.py,sha256=ZZzMsKJKXrsDniFeMTkIpe7aQ4VZYRHu0idWmSiUJ2U,2212 +pip/_vendor/pygments/formatters/rtf.py,sha256=abrKlWjipBkQvhIICxtjYTUNv6WME0iJJObFvqVuudE,5014 +pip/_vendor/pygments/formatters/svg.py,sha256=6MM9YyO8NhU42RTQfTWBiagWMnsf9iG5gwhqSriHORE,7335 +pip/_vendor/pygments/formatters/terminal.py,sha256=NpEGvwkC6LgMLQTjVzGrJXji3XcET1sb5JCunSCzoRo,4674 +pip/_vendor/pygments/formatters/terminal256.py,sha256=4v4OVizvsxtwWBpIy_Po30zeOzE5oJg_mOc1-rCjMDk,11753 +pip/_vendor/pygments/lexer.py,sha256=ZPB_TGn_qzrXodRFwEdPzzJk6LZBo9BlfSy3lacc6zg,32005 +pip/_vendor/pygments/lexers/__init__.py,sha256=Gku6kqn9IvgIdvV50gISPo0mmyyMNYRoUliEwhw6eNY,11491 pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc,, pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc,, -pip/_vendor/pygments/lexers/_mapping.py,sha256=jAxmvh5wvNkD-p3Fh6E7hY_B0sGbcxWRfseT6iq7ex4,70032 -pip/_vendor/pygments/lexers/python.py,sha256=LXnk43Lcngqn9xj6eRqdk2f73oF4kHZWiwgHMM_RlVM,52776 -pip/_vendor/pygments/modeline.py,sha256=37fen3cf1moCz4vMVJqX41eAQCmj8pzUchikgPcHp-U,986 -pip/_vendor/pygments/plugin.py,sha256=zGSig3S7QX-3o6RDxd4_Uvice_t25l_BN9aQQ9k8vmU,1727 -pip/_vendor/pygments/regexopt.py,sha256=mj8Fgu3sT0d5PZwRwDLexEvVOQbuHeosubQnqVwgiqs,3072 -pip/_vendor/pygments/scanner.py,sha256=nGoHy-Npk2ylUd4bws_CJN1hK785Xqo8e0teRmNX2jo,3091 -pip/_vendor/pygments/sphinxext.py,sha256=FZ2puvLe2Bztqtj6UJvQd7D8TvtOZ1GsfRJObvH59tE,4630 -pip/_vendor/pygments/style.py,sha256=lGyan5bU42q1kGMfFqafwL3g1j5EurTvfkv8vdP7NzQ,6257 -pip/_vendor/pygments/styles/__init__.py,sha256=Qx2zq6ufbDNE2cTp51M-s9zW-sDE-KLIqFw31qr3Bhg,3252 +pip/_vendor/pygments/lexers/_mapping.py,sha256=sExOsmEbtg7hKwXgSz6M3L77cKPaOgskzxOCdw_GxVc,72083 +pip/_vendor/pygments/lexers/python.py,sha256=QWj4ud4brZCj0-LXjR7IcO0kL6lqM2HzM_DzZZxMRjg,52792 +pip/_vendor/pygments/modeline.py,sha256=gIbMSYrjSWPk0oATz7W9vMBYkUyTK2OcdVyKjioDRvA,986 +pip/_vendor/pygments/plugin.py,sha256=tIRWetjR4dokpgbbFnsx7jjfN57T4-Z4errH1eVgGYw,1727 +pip/_vendor/pygments/regexopt.py,sha256=c6xcXGpGgvCET_3VWawJJqAnOp0QttFpQEdOPNY2Py0,3072 +pip/_vendor/pygments/scanner.py,sha256=F2T2G6cpkj-yZtzGQr-sOBw5w5-96UrJWveZN6va2aM,3092 +pip/_vendor/pygments/sphinxext.py,sha256=F8L0211sPnXaiWutN0lkSUajWBwlgDMIEFFAbMWOvZY,4630 +pip/_vendor/pygments/style.py,sha256=RRnussX1YiK9Z7HipIvKorImxu3-HnkdpPCO4u925T0,6257 +pip/_vendor/pygments/styles/__init__.py,sha256=eVJlJqbmc-TYSQEEl-2yhbtnW6INfuvlayJOiXrt9ro,3252 pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/pygments/token.py,sha256=lNPgeaQTzu2DEUi6n_lxAIU7uy4DVj8LMI3nSVnTjks,6143 -pip/_vendor/pygments/unistring.py,sha256=Xs0FzOzE0l0iWRoTlcgi-Q_kAMdF5Gt5FL_goGKJc98,63188 -pip/_vendor/pygments/util.py,sha256=s9n8BQXIxG3lIwCPWv5-ci8yhaqq5JbEVK9v8Z-8_3I,9123 -pip/_vendor/pyparsing/__init__.py,sha256=jXheGTFT1b6r_4WxuOE0uVUqiouLJ3WHzOScpLieRgQ,9107 +pip/_vendor/pygments/token.py,sha256=naybicpgOtSlh3vMGvbbx2T_6qEdGWYEH_RJ4gacIcc,6143 +pip/_vendor/pygments/unistring.py,sha256=gP3gK-6C4oAFjjo9HvoahsqzuV4Qz0jl0E0OxfDerHI,63187 +pip/_vendor/pygments/util.py,sha256=KgwpWWC3By5AiNwxGTI7oI9aXupH2TyZWukafBJe0Mg,9110 +pip/_vendor/pyparsing/__init__.py,sha256=ZPdI7pPo4IYXcABw-51AcqOzsxVvDtqnQbyn_qYWZvo,9171 pip/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc,, pip/_vendor/pyparsing/__pycache__/common.cpython-310.pyc,, @@ -724,18 +659,18 @@ pip/_vendor/pyparsing/__pycache__/results.cpython-310.pyc,, pip/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc,, pip/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc,, pip/_vendor/pyparsing/__pycache__/util.cpython-310.pyc,, -pip/_vendor/pyparsing/actions.py,sha256=60v7mETOBzc01YPH_qQD5isavgcSJpAfIKpzgjM3vaU,6429 +pip/_vendor/pyparsing/actions.py,sha256=wU9i32e0y1ymxKE3OUwSHO-SFIrt1h_wv6Ws0GQjpNU,6426 pip/_vendor/pyparsing/common.py,sha256=lFL97ooIeR75CmW5hjURZqwDCTgruqltcTCZ-ulLO2Q,12936 -pip/_vendor/pyparsing/core.py,sha256=GtQsD06HlwKPc7M8K8hyOuOW-cRnd87AxAHq-ad5lEk,212248 -pip/_vendor/pyparsing/diagram/__init__.py,sha256=h0gsUwmo5N3shgvfXVQTtqvTpUAv-ZdQjSQ6IUJmsxY,22165 +pip/_vendor/pyparsing/core.py,sha256=AzTm1KFT1FIhiw2zvXZJmrpQoAwB0wOmeDCiR6SYytw,213344 +pip/_vendor/pyparsing/diagram/__init__.py,sha256=KW0PV_TvWKnL7jysz0pQbZ24nzWWu2ZfNaeyUIIywIg,23685 pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/pyparsing/exceptions.py,sha256=H4D9gqMavqmAFSsdrU_J6bO-jA-T-A7yvtXWZpooIUA,9030 -pip/_vendor/pyparsing/helpers.py,sha256=kqpIZFG-y0fQ3g_TmloYllo9we6YCYiewZMXIK0y5wc,38299 -pip/_vendor/pyparsing/results.py,sha256=4D-oURF1cLeL7k0d3zMqUuWH_gTjop_OrZwik9O0HXU,25339 -pip/_vendor/pyparsing/testing.py,sha256=szs8AKZREZMhL0y0vsMfaTVAnpqPHetg6VKJBNmc4QY,13388 -pip/_vendor/pyparsing/unicode.py,sha256=IR-ioeGY29cZ49tG8Ts7ITPWWNP5G2DcZs58oa8zn44,10381 +pip/_vendor/pyparsing/exceptions.py,sha256=3LbSafD32NYb1Tzt85GHNkhEAU1eZkTtNSk24cPMemo,9023 +pip/_vendor/pyparsing/helpers.py,sha256=QpUOjW0-psvueMwWb9bQpU2noqKCv98_wnw1VSzSdVo,39129 +pip/_vendor/pyparsing/results.py,sha256=HgNvWVXBdQP-Q6PtJfoCEeOJk2nwEvG-2KVKC5sGA30,25341 +pip/_vendor/pyparsing/testing.py,sha256=7tu4Abp4uSeJV0N_yEPRmmNUhpd18ZQP3CrX41DM814,13402 +pip/_vendor/pyparsing/unicode.py,sha256=fwuhMj30SQ165Cv7HJpu-rSxGbRm93kN9L4Ei7VGc1Y,10787 pip/_vendor/pyparsing/util.py,sha256=kq772O5YSeXOSdP-M31EWpbH_ayj7BMHImBYo9xPD5M,6805 -pip/_vendor/requests/__init__.py,sha256=6IUFQM6K9V2NIu4fe4LtUsN21-TFbw_w3EfPpdUN-qc,5130 +pip/_vendor/requests/__init__.py,sha256=3XN75ZS4slWy3TQsEGF7-Q6l2R146teU-s2_rXNhxhU,5178 pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc,, pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc,, @@ -754,23 +689,23 @@ pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc,, pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc,, pip/_vendor/requests/__pycache__/structures.cpython-310.pyc,, pip/_vendor/requests/__pycache__/utils.cpython-310.pyc,, -pip/_vendor/requests/__version__.py,sha256=q8miOQaomOv3S74lK4eQs1zZ5jwcnOusyEU-M2idhts,441 -pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 -pip/_vendor/requests/adapters.py,sha256=WazYJQ_b2LHhNDb_y0hscNlWVsSe5ca5I3pymPrer5w,21861 -pip/_vendor/requests/api.py,sha256=hjuoP79IAEmX6Dysrw8t032cLfwLHxbI_wM4gC5G9t0,6402 -pip/_vendor/requests/auth.py,sha256=OMoJIVKyRLy9THr91y8rxysZuclwPB-K1Xg1zBomUhQ,10207 -pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 -pip/_vendor/requests/compat.py,sha256=N1281mkcTluMjKqCSLf88LR6HNOygEhS1TbR9LLsoVY,2114 -pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 -pip/_vendor/requests/exceptions.py,sha256=VcpBXOL-9JYhNbK8OZxCIImBgpQSXJlUelDPf1f-pmM,3446 -pip/_vendor/requests/help.py,sha256=dyhe3lcmHXnFCzDiZVjcGmVvvO_jtsfAm-AC542ndw8,3972 -pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 -pip/_vendor/requests/models.py,sha256=7pzscX_47qxx7-zEaBWGxMoB33Vdf6HLoUKZh1ktEvM,35116 +pip/_vendor/requests/__version__.py,sha256=nJVa3ef2yRyeYMhy7yHnRyjjpnNTDykZsE4Sp9irBC4,440 +pip/_vendor/requests/_internal_utils.py,sha256=aSPlF4uDhtfKxEayZJJ7KkAxtormeTfpwKSBSwtmAUw,1397 +pip/_vendor/requests/adapters.py,sha256=GFEz5koZaMZD86v0SHXKVB5SE9MgslEjkCQzldkNwVM,21443 +pip/_vendor/requests/api.py,sha256=dyvkDd5itC9z2g0wHl_YfD1yf6YwpGWLO7__8e21nks,6377 +pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 +pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441 +pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286 +pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 +pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 +pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879 +pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 +pip/_vendor/requests/models.py,sha256=GZRMMrGwDOLVvVfFHLUq0qTfIWDla3NcFHa1f5xs9Q8,35287 pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 -pip/_vendor/requests/sessions.py,sha256=Zu-Y9YPlwTIsyFx1hvIrc3ziyeFpuFPqcOuSuz8BNWs,29835 -pip/_vendor/requests/status_codes.py,sha256=gT79Pbs_cQjBgp-fvrUgg1dn2DQO32bDj4TInjnMPSc,4188 -pip/_vendor/requests/structures.py,sha256=msAtr9mq1JxHd-JRyiILfdFlpbJwvvFuP3rfUQT_QxE,3005 -pip/_vendor/requests/utils.py,sha256=siud-FQ6xgKFbL49DRvAb3PMQMMHoeCL_TCmuHh9AUU,33301 +pip/_vendor/requests/sessions.py,sha256=KUqJcRRLovNefUs7ScOXSUVCcfSayTFWtbiJ7gOSlTI,30180 +pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 +pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 +pip/_vendor/requests/utils.py,sha256=0gzSOcx9Ya4liAbHnHuwt4jM78lzCZZoDFgkmsInNUg,33240 pip/_vendor/resolvelib/__init__.py,sha256=UL-B2BDI0_TRIqkfGwLHKLxY-LjBlomz7941wDqzB1I,537 pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc,, @@ -785,25 +720,27 @@ pip/_vendor/resolvelib/providers.py,sha256=roVmFBItQJ0TkhNua65h8LdNny7rmeqVEXZu9 pip/_vendor/resolvelib/reporters.py,sha256=fW91NKf-lK8XN7i6Yd_rczL5QeOT3sc6AKhpaTEnP3E,1583 pip/_vendor/resolvelib/resolvers.py,sha256=2wYzVGBGerbmcIpH8cFmgSKgLSETz8jmwBMGjCBMHG4,17592 pip/_vendor/resolvelib/structs.py,sha256=IVIYof6sA_N4ZEiE1C1UhzTX495brCNnyCdgq6CYq28,4794 -pip/_vendor/rich/__init__.py,sha256=wF1th4JGBCVC02xfaw8j6P2MrFcJaQJL72scKtEmDYQ,5804 -pip/_vendor/rich/__main__.py,sha256=vd1PP-o7_1un-ThdgMU9LHV-D8z56yz_-fryczn38eE,8810 +pip/_vendor/rich/__init__.py,sha256=zREyQ22R3zKg8gMdhiikczdVQYtZNeayHNrbBg5scm0,5944 +pip/_vendor/rich/__main__.py,sha256=BmTmBWI93ytq75IEPi1uAAdeRYzFfDbgaAXjsX1ogig,8808 pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_export_format.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc,, -pip/_vendor/rich/__pycache__/_lru_cache.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_win32_console.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_windows_renderer.cpython-310.pyc,, pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc,, pip/_vendor/rich/__pycache__/abc.cpython-310.pyc,, pip/_vendor/rich/__pycache__/align.cpython-310.pyc,, @@ -854,7 +791,6 @@ pip/_vendor/rich/__pycache__/style.cpython-310.pyc,, pip/_vendor/rich/__pycache__/styled.cpython-310.pyc,, pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc,, pip/_vendor/rich/__pycache__/table.cpython-310.pyc,, -pip/_vendor/rich/__pycache__/tabulate.cpython-310.pyc,, pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc,, pip/_vendor/rich/__pycache__/text.cpython-310.pyc,, pip/_vendor/rich/__pycache__/theme.cpython-310.pyc,, @@ -864,75 +800,76 @@ pip/_vendor/rich/__pycache__/tree.cpython-310.pyc,, pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 +pip/_vendor/rich/_export_format.py,sha256=nHArqOljIlYn6NruhWsAsh-fHo7oJC3y9BDJyAa-QYQ,2114 pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 -pip/_vendor/rich/_inspect.py,sha256=vq6BjewwEvddjcBTr_lCcjYQBsKi92aTNpcXyaA5ERA,7444 +pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 -pip/_vendor/rich/_lru_cache.py,sha256=M7H1ZQF32o6SxrpOur9zTIhEHlNXT9XnrcdhruUmG5I,1246 pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472 -pip/_vendor/rich/_spinners.py,sha256=huT1biTlwyp9Lm8S7bLfVzg1psUaIH5xHDwTaWEHVh0,26521 +pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 -pip/_vendor/rich/_windows.py,sha256=nBO71icHMIHlzT7hg6fkoIdh1mT-5MvDdPDwunkshyw,2065 -pip/_vendor/rich/_wrap.py,sha256=OtnSxnERkuNlSM1d_MYtNg8KIYTcTBk3peg16dCZH_U,1804 +pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820 +pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926 +pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 +pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840 pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 -pip/_vendor/rich/align.py,sha256=2zRHV8SzR5eP-vQkSDgjmgsBLBluCBwykgejAW6oRD0,10425 -pip/_vendor/rich/ansi.py,sha256=QaVVkfvVL6C3OsuWI9iQ-iJFkMsMohjYlxgMLnVTEPo,6676 +pip/_vendor/rich/align.py,sha256=FV6_GS-8uhIyViMng3hkIWSFaTgMohK1Oqyjl8I8mGE,10368 +pip/_vendor/rich/ansi.py,sha256=HtaPG7dvgL6_yo0sQmx5CM05DJ4_1goY5SWXXOYNaKs,6820 pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 -pip/_vendor/rich/box.py,sha256=o0ywz1iW0WjGLPrRVDAZPh1CVPEgAOaWsn8Bf3sf43g,9069 -pip/_vendor/rich/cells.py,sha256=NadN20gFxE8Aj-2S3Drn7qgn-ZpsRZcNnTNtweRL7rA,4285 -pip/_vendor/rich/color.py,sha256=SD3yTf3t8japb-jOv8GYCMCDqyzpipzXS_0rAXhSlU4,17285 +pip/_vendor/rich/box.py,sha256=1Iv1sUWqjtp5XwLwGH-AJ8HgyXZ7dRFUkO0z3M_bRl8,9864 +pip/_vendor/rich/cells.py,sha256=zMjFI15wCpgjLR14lHdfFMVC6qMDi5OsKIB0PYZBBMk,4503 +pip/_vendor/rich/color.py,sha256=kp87L8V4-3qayE6CUxtW_nP8Ujfew_-DAhNwYMXBMOY,17957 pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 -pip/_vendor/rich/console.py,sha256=bioCy8012eZ8PIOBxMyyqxYPltKk2pGEG9jmwylNCQk,81236 +pip/_vendor/rich/console.py,sha256=bTT9DNX03V4cQXefg22d-gLSs_e_ZY2zdCvLIlEyU2Q,95885 pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 -pip/_vendor/rich/control.py,sha256=qxg6Yjd78XuF0VxthlT8O4dpvpACYwKkBfm2S4-IvHA,5298 -pip/_vendor/rich/default_styles.py,sha256=At42PcWzmnYWcx5fUOKyOUpI8HK5m4ItZqxkgHToaMs,7614 -pip/_vendor/rich/diagnose.py,sha256=4L8SZfbqjIRotzJ39QzD9-d4I80FyV1mNKHryg1eArE,183 +pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630 +pip/_vendor/rich/default_styles.py,sha256=WqVh-RPNEsx0Wxf3fhS_fCn-wVqgJ6Qfo-Zg7CoCsLE,7954 +pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972 pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 -pip/_vendor/rich/file_proxy.py,sha256=fHeReSO3VJ7IbH_9ri-OrPYbFC3UYOzeTNjngiiWOcY,1613 -pip/_vendor/rich/filesize.py,sha256=oQJnM5_7ygkpzt3GtNq5l3F6gmB7YahBA5vpdQVKLwI,2511 -pip/_vendor/rich/highlighter.py,sha256=AdhjC0meTYswZ_xKgka0cRYdNjLABLUzHAbyF3QpPWo,4894 +pip/_vendor/rich/file_proxy.py,sha256=4gCbGRXg0rW35Plaf0UVvj3dfENHuzc_n8I_dBqxI7o,1616 +pip/_vendor/rich/filesize.py,sha256=yShoVpARafJBreyZFaAhC4OhnJ6ydC1WXR-Ez4wU_YQ,2507 +pip/_vendor/rich/highlighter.py,sha256=3WW6PACGlq0e3YDjfqiMBQ0dYZwu7pcoFYUgJy01nb0,9585 pip/_vendor/rich/json.py,sha256=RCm4lXBXrjvXHpqrWPH8wdGP0jEo4IohLmkddlhRY18,5051 -pip/_vendor/rich/jupyter.py,sha256=4sxNAwJs4g3dYfWy_enPw9fp0Tdn-82tV4T9uh9vAOM,3025 -pip/_vendor/rich/layout.py,sha256=b64KMDP2EPiC103P-v-_VZKGY13oWiiGS418P_KRRlc,14048 -pip/_vendor/rich/live.py,sha256=OKxMaFU5sFfuR--cJftGYjSvg1VPQri1U_DNZUjCsvI,13711 +pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 +pip/_vendor/rich/layout.py,sha256=E3xJ4fomizUADwime3VA0lBXoMSPl9blEokIzVBjO0Q,14074 +pip/_vendor/rich/live.py,sha256=emVaLUua-FKSYqZXmtJJjBIstO99CqMOuA6vMAKVkO0,14172 pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667 -pip/_vendor/rich/logging.py,sha256=YNcCSK6pCo2Wg6JKqScAe6VgFqebHBnS5nDnBO4gXAA,10868 -pip/_vendor/rich/markup.py,sha256=hsVW_k1TIvj5OPPQ12ihAii9HSVa8N1TStvA5B2GGpo,8058 -pip/_vendor/rich/measure.py,sha256=Z74XvzIgLZm0xH-QIo1uX5d4oahavHe8D8MKyxLNqPQ,5258 +pip/_vendor/rich/logging.py,sha256=10j13lPr-QuYqEEBz_2aRJp8gNYvSN2wmCUlUqJcPLM,11471 +pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198 +pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 -pip/_vendor/rich/pager.py,sha256=VK_2EfH0JduZWdyV-KZma06bvi_V5PWmHG6W7BoiaTg,838 +pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 -pip/_vendor/rich/panel.py,sha256=O6ORyIhDcOLSEasTjpcDvmhvIcppPGCeQoXpoycIUT8,8637 -pip/_vendor/rich/pretty.py,sha256=HAB68BpYysaL1EXeV4X5Tt-U2hDlcLpbFz06fkojWWE,32572 -pip/_vendor/rich/progress.py,sha256=jcgi7aMnQ_YjSpAmQkalwtNsgVn9i56SeZGprr7tuOk,35926 -pip/_vendor/rich/progress_bar.py,sha256=ELiBaxJOgsRYKpNIrot7BC0bFXvmf8cTd6nxI02BbK0,7762 -pip/_vendor/rich/prompt.py,sha256=gKVd13YWv6jedzwcRPZGUINBjC-xcJhJ_xz_NvMW80c,11307 -pip/_vendor/rich/protocol.py,sha256=Vx6n4fEoSDhzSup8t3KH0iK2RWyssIOks5E0S1qw1GA,1401 +pip/_vendor/rich/panel.py,sha256=CzdojkDAjxAKgvDxis47nWzUh1V2NniOqkJJQajosG8,8744 +pip/_vendor/rich/pretty.py,sha256=CalVLVW3mvTn1hvI9Pgi2v-y4S-5zUWBK-PH7SlVs-U,36576 +pip/_vendor/rich/progress.py,sha256=zjQRwd3TmDnAvSjTPsNPHFjmqE9GOEX3bf0Lj56hIL8,59746 +pip/_vendor/rich/progress_bar.py,sha256=zHHaFPEfIhW2fq6Fnl5vBY7AUpP1N0HVGElISUHsnqw,8161 +pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303 +pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 -pip/_vendor/rich/repr.py,sha256=1A0U0_ibG_bZbw71pUBIctO9Az-CQUuyOTbiKcJOwyw,4309 -pip/_vendor/rich/rule.py,sha256=cPK6NYo4kzh-vM_8a-rXajXplsbaHa6ahErYvGSsrJ0,4197 +pip/_vendor/rich/repr.py,sha256=Je91CIrZN_av9L3FRCKCs5yoX2LvczrCNKqUbVsjUvQ,4449 +pip/_vendor/rich/rule.py,sha256=V6AWI0wCb6DB0rvN967FRMlQrdlG7HoZdfEAHyeG8CM,4773 pip/_vendor/rich/scope.py,sha256=HX13XsJfqzQHpPfw4Jn9JmJjCsRj9uhHxXQEqjkwyLA,2842 pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 -pip/_vendor/rich/segment.py,sha256=MBBAWaHyqCQFCfiNbrTW4BGaFR1uU31XktJ1S3Taqb4,23916 -pip/_vendor/rich/spinner.py,sha256=V6dW0jIk5IO0_2MyxyftQf5VjCHI0T2cRhJ4F31hPIQ,4312 +pip/_vendor/rich/segment.py,sha256=6XdX0MfL18tUCaUWDWncIqx0wpq3GiaqzhYP779JvRA,24224 +pip/_vendor/rich/spinner.py,sha256=7b8MCleS4fa46HX0AzF98zfu6ZM6fAL0UgYzPOoakF4,4374 pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 -pip/_vendor/rich/style.py,sha256=AD1I7atfclsFCtGeL8ronH1Jj-02WLp9ZQ2VYqmpBjM,26469 +pip/_vendor/rich/style.py,sha256=4WnUEkHNMp9Tfmd8cmbxWGby7QeTk2LUTQzFSs46EQc,26240 pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 -pip/_vendor/rich/syntax.py,sha256=pJAD08ywowg5xVwTGCqUOMpDYskjoMoDYEV-hryEX5s,26994 -pip/_vendor/rich/table.py,sha256=oQAEBaV4zMUPyg_tSA93_GrCirdIf-osolxf9wb3pEo,36757 -pip/_vendor/rich/tabulate.py,sha256=nl0oeNbiXectEgTHyj3K7eN4NZMISpaogpOdZyEOGbs,1700 -pip/_vendor/rich/terminal_theme.py,sha256=E0nI_ycFpvflamt-KVCY4J52LmUjRi1Y6ICB-Ef3gMo,1459 -pip/_vendor/rich/text.py,sha256=auX3LpY-I6PBiNyxB3o3LyMEx7lna2cx9IbNQJDwtw8,44424 +pip/_vendor/rich/syntax.py,sha256=_M08KbE11nNWNBPooFLKAA7lWkThPzlGUsuesxQYsuA,34697 +pip/_vendor/rich/table.py,sha256=r_lahmj45cINCWLYaIjq9yEv3gve8E6bkYTP8NDqApE,39515 +pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 +pip/_vendor/rich/text.py,sha256=oajdGIeHcLcSdOwbC48_20ylDsHAS5fsPZD_Ih0clyA,44666 pip/_vendor/rich/theme.py,sha256=GKNtQhDBZKAzDaY0vQVQQFzbc0uWfFe6CJXA-syT7zQ,3627 pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 -pip/_vendor/rich/traceback.py,sha256=hAU3IR295eFuup_px2NU4aCEWu7KQs1qpZbnqoHCtR0,25935 -pip/_vendor/rich/tree.py,sha256=JxyWbc27ZuwoLQnd7I-rSsRsqI9lzaVKlfTLJXla9U0,9122 +pip/_vendor/rich/traceback.py,sha256=MORQpXH7AvhAAThW8oIbtwffXb8M6XRkSkcJ52JuA3g,26060 +pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 pip/_vendor/tenacity/__init__.py,sha256=GLLsTFD4Bd5VDgTR6mU_FxyOsrxc48qONorVaRebeD4,18257 pip/_vendor/tenacity/__pycache__/__init__.cpython-310.pyc,, @@ -956,13 +893,15 @@ pip/_vendor/tenacity/retry.py,sha256=62R71W59bQjuNyFKsDM7hE2aEkEPtwNBRA0tnsEvgSk pip/_vendor/tenacity/stop.py,sha256=sKHmHaoSaW6sKu3dTxUVKr1-stVkY7lw4Y9yjZU30zQ,2790 pip/_vendor/tenacity/tornadoweb.py,sha256=E8lWO2nwe6dJgoB-N2HhQprYLDLB_UdSgFnv-EN6wKE,2145 pip/_vendor/tenacity/wait.py,sha256=e_Saa6I2tsNLpCL1t9897wN2fGb0XQMQlE4bU2t9V2w,6691 -pip/_vendor/tomli/__init__.py,sha256=z1Elt0nLAqU5Y0DOn9p__8QnLWavlEOpRyQikdYgKro,230 +pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc,, pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc,, -pip/_vendor/tomli/_parser.py,sha256=50BD4o9YbzFAGAYyZLqZC8F81DQ7iWWyJnrHNwBKa6A,22415 -pip/_vendor/tomli/_re.py,sha256=5GPfgXKteg7wRFCF-DzlkAPI2ilHbkMK2-JC49F-AJQ,2681 -pip/_vendor/typing_extensions.py,sha256=1uqi_RSlI7gos4eJB_NEV3d5wQwzTUQHd3_jrkbTo8Q,87149 +pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc,, +pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 +pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 +pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 +pip/_vendor/typing_extensions.py,sha256=U_PyumPFBkMiR_Iq78QWZXdPprTywptECB2WRIQjDv0,75420 pip/_vendor/urllib3/__init__.py,sha256=j3yzHIbmW7CS-IKQJ9-PPQf_YKO8EOAey_rMW0UR7us,2763 pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,, @@ -976,9 +915,9 @@ pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,, pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 -pip/_vendor/urllib3/_version.py,sha256=_NdMUQaeBvFHAX2z3zAIX2Wum58A6rVtY1f7ByHsQ4g,63 -pip/_vendor/urllib3/connection.py,sha256=6zokyboYYKm9VkyrQvVVLgxMyCZK7n9Vmg_2ZK6pbhc,20076 -pip/_vendor/urllib3/connectionpool.py,sha256=qz-ICrW6g4TZVCbDQ8fRe68BMpXkskkR9vAVY9zUWtA,39013 +pip/_vendor/urllib3/_version.py,sha256=kDAZ-bEcWgqZsVJELrYbVo4buZP5eBBOGl_X7VA0Ic4,64 +pip/_vendor/urllib3/connection.py,sha256=8976wL6sGeVMW0JnXvx5mD00yXu87uQjxtB9_VL8dx8,20070 +pip/_vendor/urllib3/connectionpool.py,sha256=vEzk1iJEw1qR2vHBo7m3Y98iDfna6rKkUz3AyK5lJKQ,39093 pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc,, @@ -996,8 +935,8 @@ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 pip/_vendor/urllib3/contrib/appengine.py,sha256=lfzpHFmJiO82shClLEm3QB62SYgHWnjpZOH_2JhU5Tc,11034 pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=ej9gGvfAb2Gt00lafFp45SIoRz-QwrQ4WChm6gQmAlM,4538 -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=DD4pInv_3OEEGffEFynBoirc8ldR789sLmGSKukzA0E,16900 -pip/_vendor/urllib3/contrib/securetransport.py,sha256=4qUKo7PUV-vVIqXmr2BD-sH7qplB918jiD5eNsRI9vU,34449 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=oR_4W0U0gaDYBN8Q5qz_VZ8xrYZsoXve52RwIKdYGbc,16899 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448 pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 @@ -1009,10 +948,10 @@ pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc,, pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 -pip/_vendor/urllib3/packages/six.py,sha256=1LVW7ljqRirFlfExjwl-v1B7vSAUNTmzGMs-qays2zg,34666 -pip/_vendor/urllib3/poolmanager.py,sha256=whzlX6UTEgODMOCy0ZDMUONRBCz5wyIM8Z9opXAY-Lk,19763 +pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 +pip/_vendor/urllib3/poolmanager.py,sha256=0KOOJECoeLYVjUHvv-0h4Oq3FFQQ2yb-Fnjkbj8gJO0,19786 pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985 -pip/_vendor/urllib3/response.py,sha256=hGhGBh7TkEkh_IQg5C1W_xuPNrgIKv5BUXPyE-q0LuE,28203 +pip/_vendor/urllib3/response.py,sha256=36JUM28H4dHsuCQgIPeN91LNcK8r1wBUJGFLk3ALfJc,28156 pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc,, @@ -1030,16 +969,16 @@ pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc,, pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 -pip/_vendor/urllib3/util/request.py,sha256=NnzaEKQ1Pauw5MFMV6HmgEMHITf0Aua9fQuzi2uZzGc,4123 +pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997 pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 pip/_vendor/urllib3/util/retry.py,sha256=iESg2PvViNdXBRY4MpL4h0kqwOOkHkxmLn1kkhFHPU8,22001 pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 -pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=w01jCYuwvQ038p9mhc1P1gF8IiTN1qHakThpoukOlbw,5751 +pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758 pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 pip/_vendor/urllib3/util/timeout.py,sha256=QSbBUNOB9yh6AnDn61SrLQ0hg5oz0I9-uXEG91AJuIg,10003 -pip/_vendor/urllib3/util/url.py,sha256=QVEzcbHipbXyCWwH6R4K4TR-N8T4LM55WEMwNUTBmLE,14047 -pip/_vendor/urllib3/util/wait.py,sha256=3MUKRSAUJDB2tgco7qRUskW0zXGAWYvRRE4Q1_6xlLs,5404 -pip/_vendor/vendor.txt,sha256=SpijkWP2aapE1DEgOKL1wxuOz1ztM7E2Xs2PZ-V1PKA,496 +pip/_vendor/urllib3/util/url.py,sha256=49HwObaTUUjqVe4qvSUvIjZyf3ghgNA6-OLm3kmkFKM,14287 +pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 +pip/_vendor/vendor.txt,sha256=8XILGklF_LcEc20OonK8_bpFH7tG7wLotFxI0k3FMU0,469 pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 pip/_vendor/webencodings/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/webencodings/__pycache__/labels.cpython-310.pyc,, diff --git a/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/REQUESTED b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/WHEEL b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/WHEEL similarity index 100% rename from sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/WHEEL rename to sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/WHEEL diff --git a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/entry_points.txt b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/entry_points.txt similarity index 69% rename from sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/entry_points.txt rename to sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/entry_points.txt index 9609f72..d3ad2e2 100644 --- a/sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/entry_points.txt +++ b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/entry_points.txt @@ -1,5 +1,4 @@ [console_scripts] pip = pip._internal.cli.main:main pip3 = pip._internal.cli.main:main -pip3.9 = pip._internal.cli.main:main - +pip3.8 = pip._internal.cli.main:main diff --git a/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip-22.2.2.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/sbsheriff/Lib/site-packages/pip/__init__.py b/sbsheriff/Lib/site-packages/pip/__init__.py index 3a0d263..3d4b45a 100644 --- a/sbsheriff/Lib/site-packages/pip/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/__init__.py @@ -1,6 +1,6 @@ from typing import List, Optional -__version__ = "22.0.4" +__version__ = "22.2.2" def main(args: Optional[List[str]] = None) -> int: diff --git a/sbsheriff/Lib/site-packages/pip/__pip-runner__.py b/sbsheriff/Lib/site-packages/pip/__pip-runner__.py new file mode 100644 index 0000000..14026c0 --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/__pip-runner__.py @@ -0,0 +1,36 @@ +"""Execute exactly this copy of pip, within a different environment. + +This file is named as it is, to ensure that this module can't be imported via +an import statement. +""" + +import runpy +import sys +import types +from importlib.machinery import ModuleSpec, PathFinder +from os.path import dirname +from typing import Optional, Sequence, Union + +PIP_SOURCES_ROOT = dirname(dirname(__file__)) + + +class PipImportRedirectingFinder: + @classmethod + def find_spec( + self, + fullname: str, + path: Optional[Sequence[Union[bytes, str]]] = None, + target: Optional[types.ModuleType] = None, + ) -> Optional[ModuleSpec]: + if fullname != "pip": + return None + + spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target) + assert spec, (PIP_SOURCES_ROOT, fullname) + return spec + + +sys.meta_path.insert(0, PipImportRedirectingFinder()) + +assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module" +runpy.run_module("pip", run_name="__main__", alter_sys=True) diff --git a/sbsheriff/Lib/site-packages/pip/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/__pycache__/__init__.cpython-310.pyc index fe43584b815ab298cd47f0ffb0428da893c266e8..d8a7dcaa1234561e13a11d2a8656b39d9d136e9d 100644 GIT binary patch delta 27 hcmeyt@`HstpO=@50SHPD%TMGkWj4|?+SvS+5ddc32fhFR delta 27 hcmeyt@`HstpO=@50SKzqB`0#1G8^cbY;69@2moIE2Of;$&@4 zX{zBux$*}%?Ou@h9sCPlIq?@@K|CjARV~7ipZ%Qop5Oc4=W;lV5RCP&AEZMcq2HWx ze*~aBgQW(J?dUUu2RCHO98fGvzKHdp10( zOjb&k+i)gcu7ym64bCJSr7q6>(Ff%jOnm@CAm|WEi12#2hXE@heC~-rbVL_$_m|`$ zav%5MtalN?E`VMCAzFq_F9PVxfMYl%gdaA?G3>owaZ?GXNyzyRp-}xI~zjuHP z+2AE{ZQuBi3^}wOv~uhz58Q2U37ApsARHaPIHt3svy-p#6YOYPGiiOHnj0>vIg#xn7_2S>%SJ`5& zGb8pZmR_=z&~r%WV@g5ptF@FuQ97w=wFU9r9ok(Tc6~e|Bkbdw5C0#{$=h##fA4tYuh1uNI>G4A#?ED0uuM{V^XZgH zS(+HIi2s9%drmBtrQCPcaa)oa!Ud=BBtr0M3bs9#8vs(*dc0@5l=3pAGzs8;RYQ@r zRxT;K+rGCvTTBX;!rKb-q5 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc index 8136637e4da5aa3d33d515cc5f7c12071f03aa2f..c8db980d329792dc3040be1bac87dd1ee5efbeb2 100644 GIT binary patch delta 20 acmey!`jM48pO=@50SHPD%Wvd<#smO5sRf1r delta 20 acmey!`jM48pO=@50SKzqB{y-DbJ>-b~rwMjO%H)$G56TEdLQ{1G)R5U@#D0DU1xwgld z+1=ckO&V(~Bb=9#q!3;4K%)v93H6N>T%hoTR3s!oh(|Qyfd_cvAK)v%IkTquPXD;_6<~OvZG= zO?hcE9n-3t@v>&t%b7WEz#Q=MX5Je#2fcz>@P^ExSVwbW9rLno)tfPAyjgQLUgzA;ct_2n zF+JcO^J-?zJ8m8)63gPn=a z3mCVqx=b9U_eW_|US~nmW@}c@4VtWd!{ME_$J)WcO5K~$AH#1Ida9+?!gi7F&3 zNebM{aQk(DK-wb#-6wnUzO<=qOQE!v*q8i#poY>ec|!`cJw1e@IU?=Dsz$dyT48}< z8EcNqjG$w5E#JqdWxReX*yywk_7-dP0t|5;`MlRQf(>T0dYrTN`M|xk0IastUN^c< zx1LHF@VmI-_y+uYKC}OCWTD*fdsn->(_+3qZ>)8=;k5n0a$PVNe^AHfV(TZ;uE&h6 z!DbVT;}8Atk>Z?jg%W;GJ2ey7JjAbtTY-#|&i@48M9#}jE?E7MJHH1;Ani)qG)6fjycG~Ezg@}; z0S%>1d6%?lpn#4Nk}pVKdu=-rB*Mfl*;Ye!Q?+T2@HwRRG+VY6hwKx7?s_>?pp4bc zKJfb$aW5gPL%LKYxWJ&RvsJkr?>%k9A#2xs`zbPh#H zzsp+AnuF3-ryW?(FtucV&jWEVyixxSsQL2%s-_Z!=yK-23Z;+qgic0fN;1Gp5quU& zffmG4*_=EJ+AW+K_`?aJ!mYs_Pmx9OQF(R;j)n&Et`w4xhKW$I>AeI@N(pvAUWF_< zI;koAOYq=TfT+|wZ006s*Lx0UIJbQMBI+Gh$v08?4#HgobiuD6JX6_4NBnwZXzFJm z@<#wtdWv9j{fk06c%}X&Nabig%0N4R(%byX!HLRWXactVmM=!e8Vg?m2ayK-kNY3x zVCr~Q(8SH;9k<^Z8fRVCg0ayM-x#~Rl);el2*Uui9RC*5kAsgx#^58x;_E*DK9XAB zvCn@XM#sk|-bIt|B0QZNzX!bEiA&=jq_3eAM-Weo{KUxTd?fKG_z8p*LK5L^gm(a< z3{1ouv181nT~s-2^&cAJXP))| zCGqS)_!O6z>VQzDmS1??5AJc*J##3yxuf9Tr$DIsRt;Yuij~spLtxYf_&mB_K&T^pfG~&f#3ADH zM+n$jJU&gV;3tmso%pN{fT@a)r$0Z1RPD2UZ{I`J_*-!jsRsy`MXh?J91TH%*PAz3 z+wSl>RA~SMfoH^i^%%*D-&CvlcvQ%s#Rt&rlz3D%NM20LjL*fNpaOD-0HWd8mD7ef z-?rR36p{r)--?Hkux9R#zK5!DVZ}v=-OI7K_yNRT7WLVIvoF9>k#t!n{VM~*B|~ON ahQ<_Nk>r7sCkoIhnv-+sTwdBKUicqC_;36G delta 2898 zcmZuzZ)_Y_5#RUr&+Yv`pYLp+|E}+n*yki}oHS`EaZ*T|C=m`Nsfw}$j`QtavX|Yx z%iDFFx@(-uDIirPgx7-95Xpw30;+)4AS7r}DSYJ%A5dAo@PRMsH^di8X~WE(u@lN! z``dXl^XARWo0;`rPkeYP(@v)o0{ottC^eG1Zf1tb{LS6_SE#M%ia`u&$MhJyMO$^^ zdYlMAOLoFZ>dA*s z&VW7;(W+f?2KB*+j@v`dus)3RijlBKoKbx&5+rTS8P~@nI%Sugie7Pc=sTR9`p$@# zws$!b`b0!$>`AApS0g%WPdU5w-Oe6;4-w2P`#LzEv-djF`ZTQR+5_gkb)wIl5R4up ze_b&0t5n}_lGXuZrq}E-A1nz?Y7~s(b!nC82SKgR=m)iaP&)*x0iy(~l6h!V)F0xE zEE1K!M+W2SN#A63zspS;3DP)DT}FH_j{*Uv0(L5&>z&4QZV&Q%hJD{bVa;$d_cc*H8k{ zh#eOEbSo23Lv4aQ5MLqRAUB4Wr9fEA8u4}VnDE8SvK&Zjxj+u&wVps|N$X@Szb>p( zB3zzb`8*se36iiX62Vnx1n;RuLckd!oP%f61!^SLDY|&CHo6P??!EfRt0tFzd5oEL z-_+__+4JkJQMcQ!sdcPQSzEF?TGO)4=|n<<->xSwnp?aHPiwSY-*kP=@-)i;!fMoQ z&2RJ9<>3|7Kj~|WmThbErncaj28cAvg)@M~%*zWFGac9kn_ZCjV0(VSvJK62uUM?@ zqHH=k_w-U`+q1pk*^fvlU9wzbDO;<7b`4my+BA4urFTTQtvl)tz~f<$=QFF}*L=${ z!GhEALb4c=sZfL+)m}cQ9A4=MO@``h2q2VNZOaWs?`bbgT``$wwcVQKHrrtg%wsOX zm~M5BBO$X3c6&aQ7n$XoVUn44-M6loHNPFIb+6WGd)C#e5-MJMfi+;C?{sR0#ljf6 z3)VvA(qes{UGPG>)C}duMF^f%(US-%M19&VP}Z z9Xbc1rJM%=H5NR-?O03ZbmwVy5ZD{Z+MTMxCegw& z!dDPhzSX;ryu@dE=T^Q8YhPFumT81yK-ejtK>N{E0_};7`N*>Di-8Pl1sYTel$N|s zmSaK8s|0jS319^+n)QLxQvLWUWd~5_7IZ9fZV9)=Wz~&u^5`}XsEP{g#1+C$1|pbJ z1G!1N<^nOGO$u!)@-u~RjxEvI*(GsycD9;?5;c8R#6Z4`kOAP27WWTife7PX$817i^YpO)M+%9`ZMt3s3!p``?|fCLnVm}JlwWIkRhuFTvwc?1mU^pk8KSgXd^ zm*B-J0AV7UDOY{lnh)cTU$y+Re!X!iOv5ZNS#49u=1{c=eF+`nB5BBez_%+D9QGkS+AebC%CQJ?8`cpqBf5e~Z zpNKIm80Kue(f>DStfR2tw+3g4!T&rsk~Lu&#+cc$>kTYYdFb5HH0t*t^Z`^eT?5-b zqGM5mhEg2{0{bbf!&tM;oVxF^H~8(Lk2>5wp4w*9whcCj{FnK)O25KR z1AUy|9o~CjkW%`QBGM13ME^|{`Y#$wyifb1T;2V+EcZS;y-^#K_!W zNrc}VD{(E?%ikJH@Bb|xhP~X4@trMdYa%j?F%R3>?|@hu<*#c+{@Hvyb#G_$nX!>i z+;6KYeXRfgk8#XSk$-LMSnmGa>>VDC4JAjm&K<^cM;f+ScNaP=y2ujR+pf47zF(V! zaKE6HC$}#;D#oZ5|K}1h^BVtwcIfn*KvlC0M?Bk$FpcmQ0uIn90o#|%euKR2tNlGL zx9|6M_u}3LZi*it|Kx6@st&5q`O>Rk66ke(0)cXiMl-w{B0{?FJN5+x5C1j9%0(@L!dO`CrP< zPyHB|SY2Uev#*`HTfbnkZe`A)7z>WQ4KeI`^e~W;po%Jd;r{!Vf(A{IN%;0f6ks9Z Uz?Tr{1kH$2vOqE=VWn{5KbzgQ&Hw-a diff --git a/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-310.pyc index fb57e4028c78ee9181e8bf08b5ab197bb3a176d5..d3c1debbb50bd5afa18fdd324f40068326c6548a 100644 GIT binary patch delta 3233 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 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc index b73b14c7a385ce542ba911d183499d4b10bc6f62..a403f0bdb1f320e0a44ace608f31bd3cb0809245 100644 GIT binary patch delta 1164 zcmZuwTSydP6rM9TCv{cU+)Z@7?`2FvNXx=5BvB+qWGGlOqO1AR;0{g6binb9U1*nqj^<|2h9T=llLM^R<1pBQI>T zWlMC$o|OCN8t&({+P5pTH0WueC$gEqg18(d9ECUx>z33978FYzQk$eoQF*8gB)+2x z@1VEZ3zm!%_HB)t@KCzwB$zi^14G+|2n$iiz7+(fBKERkw@c_9B7cB0MW#I=Q$BNl}h8Cg;SlGLAg$r0Nw=`4^(NlFLhxDr<_ViNs_iuphe7zjCAPI+2Pv2n-^QcUCsxM1^hSE;;@_z-4sv({zb&pOR@d2%;== zfY+s)@+hRmXn%>3NzCr3zDx`ePlDJ$5)77*lp~v{hLXGbN?x1k?Z>>@yXHm^! zYaA;YFmf~V>cQ_tF7Ttn;j27C^v$e4a}r(T5J85c3?b}v)a2hIGvXuQnHi88cgO%e zIO%MuTG~1fM??*$q`^(ryc+2q49wty^96+Q@v3sIhrF-w-KzKSCN*399P}_J3}Uim zr=BTB(#foj}R(FmbbtfB=Vgbyp% zYNHf2Qwx=DD7(TNOBwzlbD4bWQw`PU0IuSr8ZV6F+nOpkjheeo8>Zk^T<3lYhY&m; z=r})mn&Bw=y!-5NikWI=D!8mc7;%%~U(QA+C7Snji*Hv_w zR-%vLI75t~2f=hTU0{UFbp<#srP=2WVWF=uGjo@ZOy7erM*)%r|p#mwLW-yHjh| z7HjlOhW&$f&e!-N+!e$yfj3h<$)rCOJL zbadI#k(f9jWlBmXZKFaSrjP6=z_QXxH`fwk4Xgn-h#%Nix^F5?CZ%Py9Oa`rU_0Bj z86bLy=D-dTGnrAek+qbmEG2R}?F3~j;*5UM z-pn-|N>@fsfEI@?(ssV~P%4g2ZxEcg(|ZO^;6v{|*B#PhdkGu@KYE*{ETRUj!Z@-- z{v(#;p5}5?Y8<35t@Bv!X%EB&D70b}TA^l?9v9Tg!L<3S6(eIRon#w1kd4HO6t^Yp zJ(NS|=m;4d?6&t4b28&OWs9jloqPFR8ef$qt6efi3S|pJCj;Mt>|v;9IEnEMk%|P- zsP*@1}Z1sK7SnnrVmyw&-(nh?NE>fC4EAj9_jZ15t$EnFW8 z!xh{cs(}plhw9AV_>Yh=?2QJRE;Hr+ONy Gp8E+>nD?>( diff --git a/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-310.pyc index 6345af107952e884329736be09e62545851a80b6..7f382bfa6552d6abe31ea980d1fc31ef500f52eb 100644 GIT binary patch delta 22 ccmcb*h4JbZM(%uGUM>b8C_OB{k=rW@08;-3Y5)KL delta 22 ccmcb*h4JbZM(%uGUM>b8s8*NU$n6yc08e8D&Hw-a diff --git a/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc index 4ed35832e17506d5ef5c95b6b2f58e5ea6fb6fe7..f1670d87b636deab12ad0d7c37cdaa3f39821250 100644 GIT binary patch delta 20 acmaFG@`{B!pO=@50SHPD%Wve4X955?Z3OQC delta 20 acmaFG@`{B!pO=@50SKzqB{y=%GXVfJ(F9Wf diff --git a/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc index 1cdf6519f7f308bfb884887a9a2179a78f8d21e7..5c7aa2a7bd5abc6258241712bde07dc465f1bf75 100644 GIT binary patch delta 608 zcmX|<&1(}u7{=$_Og6i-GrOCwYDl!F3hkkVUQNM+2NCh&K^PFhzMBx)H8HypjI$OS z4|*snb5KyBEf~G}fhR8_6!GRYhyDxx3r<&XV0hsS zU-+G!Z$=?Oh>3(^TGBGpic1NV6i%{ITuy9hCly&q9O)DujopMvR=mrxmvG4wAw{9> z*iQl(B%utGs;nBX64~fPwH`$m*<&i}=tT|VGP9)5~NR6iFW<4X1;P~kj}HfBvq{KS-Y^Q+>7MK*_=)7EL3a;K(3R!A1KMH_m6<& z9*`+3fVyI@t+y7|^!M`eMx##-tX%X-?kiqYI!2N6f3 z3zkONWRwkuajKuQDXeMFy8v~4#p`w!?jRWr$5}kMwV;!15HH-`;11qQN71%^;(dWL vdW)a8yqcc!OYN@t7OSTh{(olu1Q~A{TmR&rpsOE3Ncp^yF&4V5BBM*+-l)J)pb@i+l*w^@BZs`>i1? z218gAG@wOqTKxR`7%_LB*dxr`>EHnS?tAbWzqxz-11`Hid}TYdK>Qi38_OGLHCELf z*g*@`2JyRKqqe_8f|3cF$9c<|sHIrFnop9l(Q{nitA!0H+ePn%_)0tlrnD z@8s0oWxf~Rf(Ofun1;2q;@k`o?!(i44z=3+fzbFJO+{!I$&l3+@iZ6vysLa>H-oadO=qCr3DPTj@2{ f;qGgCJ6!eOIzHu=tmzR9m diff --git a/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc index 33676e1f1abc5249eafd75714ae528f6a5dfd42d..275ec81ec9f60d3e098e62d65330fcf999886df9 100644 GIT binary patch literal 6574 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 DWx&-` delta 2341 zcmZ7%TW{Q0`J7{q?eTc7N#>ID;xuW~+3u#Ls9f8sOPi(aF3UmCc|}qHkfnfGTiX%LBnZec;0UYEvFUC zJM+PUvyjnD|4eY!IXi_#!8s?C!}G#EqRt|>#06dy7kVl$@$!eNv-C~EE4=z4;nl~? zS?0Bje-ZdId=~hZ_?&3)x={NoyvS)!;|<;f`ejbnNxStgJo~e`u9JG|g{|{m#aIB*Ii3xPf>|WFvW|JgP!0Nr=HSXo;#+ zwvwNzXX*Xq*Xs4JC_FFpzRnp}zyXsNzyX6R;DD8u)`j1@yCu5Y>yaCYG~ac*TcX1~ zDa*;#+@FkGn9)l~K|8OtU;|l7u4%X03z<6^v*-CjHjtHpCUT5U#~XN2r?Z&+Lfg1n z0U91N+z(T2Bt_5LYg5@i(K%6+c+Bg`if+%3_D5c4N663{4pOT-mQoC&PUHn5`ONrh zEsKZgyJ6G;kGtD)HTiS?^7K5~EFiEEECNV%I1WZj7Lk-G8et@RXe+I)uf6-$-TP~I z-|5_Y^TAr@t#3b&%czy(<6sm@tk*QRE4@g_D(YJZ>Ig0YXluvESVh8B0wj43&{U1Y zUX;?_=L4gL?vD6U@=NoL`po~weib?GeDbOJ+WS|~gfWuCk&w~;3zs=02wj#paj(;W zp9T-Bz=khGrwvl0tXiRG6gmGpR?;ZdlYDvU_FdqmD)%4)r#7;r&F;D(qz#hl`+`HA zbw=LkA=*;`SXzzB`$@liVOq}26N09~2b7SAJSK;f(<3@zF$+!3)=A9zY@%>BQ4cu1a%dhAu5E+# zG-KylWTM6@XJaCN7!~?fOk&D)Zah&YMpWc^c+Dqll8;KjGvYiifD`2%!Yz<6WAm_r z4)?2*LR`qK^u7;cW}QT}xX@>hDOk@P&ctf09WhFx*;oad6)W-7+9tzCvC^N5t^VA$ zGJF)(IR$1hE`~pSVWiP-{)+J8$81uHT8Hzz1d3{0I#MY)mQYEwu>X`2e4|$X3@?N8 zl_#*(!_19c(yku-CF@PQH8jB&P)D*Zod)Okne+!9uCL0D}_A{ zy}>4u>=#{VUktx)Zw+?^tY3eHXnUdU?zo=sZunx=ME!7UIQF^S9S%Z|3kjZYN|$>j zFu3EncC;nzm5X8WH>+-~fK(8;1HO82Be^n@De6lj*E@)X1grEg{p6(YU#8Gu}#y$$h$W>*&>@XIAdVk0LW7R9mL*8 zU9IO0AmGx$MM;Wa7@c^RJgYSyraEM_(+&9NyT6X~5UzulI~~u}E*J_204!aFn?++P zWz3=`n`Ig`srtO4nAA{Ime6Yb9fN7lEZv~UvJ`_Ez+}%g#{Q$~8nsMNrc8m4n*X+p zY(=gAvgdLOc4)UH=2O-XEGIvy+f5tMES_2f_rYLOGNdTUr}ZTbr;_|2`Jk~xbIG)E znQF-=jWaOj{@Hkq8cD6WMDxj`=5hhY;qj$lCBJQ+n`ZYwRv!6H5xtuwN8UoAA0W7c zAiL|Z&{B0{IP@iEHr2l8`ePAh-o6sQlL?#}H-jM``{FhXMG~Up23*OfZ-rXSYC-&t S-&y#p%v5ShNvnPJjQKyY3`TGO diff --git a/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc index 99516986ccd1caab32c3c0a0819a209820204012..e0a741604ecf771095634336785bb630e4fe7544 100644 GIT binary patch delta 290 zcmdn&{>_~)pO=@50SHPD%O|fe+{jlY#i%#AQ_4U%gpnZ~2$`5_S!>y97+e@)T_&HA zGOmxSVb9`BVJ&4Wa;srnz*WNm;xA-kWGLY-;i=(lW^87xVUOnpit=Xh0a^TDmOycY z7efZj0}bHHEalWI71363j+&7GczMY9)}@Aab7u44G2a8aSdxxa|y!& z#uT;`_Q`3|;*66w*Ga!;WGtVYCtJl`!^pr;)CTl|rqJZivJUD|yeawRc{%xsDe;+k zY57rNMXAa8MJe%c(fp#!^vt};#&Sy;118^;(-z@k;$z`s;$q|hK_;dbGXGd)H;c&6 GX8{0(KuYfb delta 194 zcmez7zS*5GpO=@50SKzqC6k2>Hu6^h21{a1{i^*rC zj7@_|I7_%{IGY)p8Ee?%xog<7xU+bGEM72+uh_?np^34Ebpd}3`$9%WhC=xowgvo? zeWWD?lgfd75R3%k8rGun$z{^=jP0AJNxx@gES%gXTg6?*$iPt426T?5z+`SYhsi~9 gOBsD8OUP>r@G)^Q@_--{(>s}eEaIEP<>#{i0C;;XtpET3 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/build_env.py b/sbsheriff/Lib/site-packages/pip/_internal/build_env.py index daeb7fb..6d4f6a5 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/build_env.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/build_env.py @@ -1,17 +1,15 @@ """Build Environment used for isolation during sdist building """ -import contextlib import logging import os import pathlib import sys import textwrap -import zipfile from collections import OrderedDict from sysconfig import get_paths from types import TracebackType -from typing import TYPE_CHECKING, Iterable, Iterator, List, Optional, Set, Tuple, Type +from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type from pip._vendor.certifi import where from pip._vendor.packaging.requirements import Requirement @@ -20,7 +18,7 @@ from pip._vendor.packaging.version import Version from pip import __file__ as pip_location from pip._internal.cli.spinners import open_spinner from pip._internal.locations import get_platlib, get_prefixed_libs, get_purelib -from pip._internal.metadata import get_environment +from pip._internal.metadata import get_default_environment, get_environment from pip._internal.utils.subprocess import call_subprocess from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds @@ -41,30 +39,20 @@ class _Prefix: self.lib_dirs = get_prefixed_libs(path) -@contextlib.contextmanager -def _create_standalone_pip() -> Iterator[str]: - """Create a "standalone pip" zip file. +def _get_runnable_pip() -> str: + """Get a file to pass to a Python executable, to run the currently-running pip. - The zip file's content is identical to the currently-running pip. - It will be used to install requirements into the build environment. + This is used to run a pip subprocess, for installing requirements into the build + environment. """ source = pathlib.Path(pip_location).resolve().parent - # Return the current instance if `source` is not a directory. We can't build - # a zip from this, and it likely means the instance is already standalone. if not source.is_dir(): - yield str(source) - return + # This would happen if someone is using pip from inside a zip file. In that + # case, we can use that directly. + return str(source) - with TempDirectory(kind="standalone-pip") as tmp_dir: - pip_zip = os.path.join(tmp_dir.path, "__env_pip__.zip") - kwargs = {} - if sys.version_info >= (3, 8): - kwargs["strict_timestamps"] = False - with zipfile.ZipFile(pip_zip, "w", **kwargs) as zf: - for child in source.rglob("*"): - zf.write(child, child.relative_to(source.parent).as_posix()) - yield os.path.join(pip_zip, "pip") + return os.fsdecode(source / "__pip-runner__.py") class BuildEnvironment: @@ -168,9 +156,17 @@ class BuildEnvironment: missing = set() conflicting = set() if reqs: - env = get_environment(self._lib_dirs) + env = ( + get_environment(self._lib_dirs) + if hasattr(self, "_lib_dirs") + else get_default_environment() + ) for req_str in reqs: req = Requirement(req_str) + # We're explicitly evaluating with an empty extra value, since build + # environments are not provided any mechanism to select specific extras. + if req.marker is not None and not req.marker.evaluate({"extra": ""}): + continue dist = env.get_distribution(req.name) if not dist: missing.add(req_str) @@ -179,7 +175,7 @@ class BuildEnvironment: installed_req_str = f"{req.name}=={dist.version}" else: installed_req_str = f"{req.name}==={dist.version}" - if dist.version not in req.specifier: + if not req.specifier.contains(dist.version, prereleases=True): conflicting.add((installed_req_str, req_str)) # FIXME: Consider direct URL? return conflicting, missing @@ -197,15 +193,13 @@ class BuildEnvironment: prefix.setup = True if not requirements: return - with contextlib.ExitStack() as ctx: - pip_runnable = ctx.enter_context(_create_standalone_pip()) - self._install_requirements( - pip_runnable, - finder, - requirements, - prefix, - kind=kind, - ) + self._install_requirements( + _get_runnable_pip(), + finder, + requirements, + prefix, + kind=kind, + ) @staticmethod def _install_requirements( diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cache.py b/sbsheriff/Lib/site-packages/pip/_internal/cache.py index 1d6df22..e51edd5 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/cache.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/cache.py @@ -5,12 +5,14 @@ import hashlib import json import logging import os +from pathlib import Path from typing import Any, Dict, List, Optional, Set from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version from pip._vendor.packaging.utils import canonicalize_name from pip._internal.exceptions import InvalidWheelFilename +from pip._internal.models.direct_url import DirectUrl from pip._internal.models.format_control import FormatControl from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel @@ -19,6 +21,8 @@ from pip._internal.utils.urls import path_to_url logger = logging.getLogger(__name__) +ORIGIN_JSON_NAME = "origin.json" + def _hash_dict(d: Dict[str, str]) -> str: """Return a stable sha224 of a dictionary.""" @@ -204,6 +208,10 @@ class CacheEntry: ): self.link = link self.persistent = persistent + self.origin: Optional[DirectUrl] = None + origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME + if origin_direct_url_path.exists(): + self.origin = DirectUrl.from_json(origin_direct_url_path.read_text()) class WheelCache(Cache): @@ -262,3 +270,20 @@ class WheelCache(Cache): return CacheEntry(retval, persistent=False) return None + + @staticmethod + def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None: + origin_path = Path(cache_dir) / ORIGIN_JSON_NAME + if origin_path.is_file(): + origin = DirectUrl.from_json(origin_path.read_text()) + # TODO: use DirectUrl.equivalent when https://github.com/pypa/pip/pull/10564 + # is merged. + if origin.url != download_info.url: + logger.warning( + "Origin URL %s in cache entry %s does not match download URL %s. " + "This is likely a pip bug or a cache corruption issue.", + origin.url, + cache_dir, + download_info.url, + ) + origin_path.write_text(download_info.to_json(), encoding="utf-8") diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc index 4974250e28c08561ecab3a6f107a0f5526e9c332..20fe33d4f71fbbcbf1c8e615f1f57cf35f8beeb7 100644 GIT binary patch delta 20 acmbQpG?9rrpO=@50SHPD%WvdnV*~&yJOkeV delta 20 acmbQpG?9rrpO=@50SKzqB{y=jF#-T4paVky diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc index d00e9f8e4184426b8843ed46723de663708ea19c..dee28fccc88e09ead6b91da69c82d5b20be265dd 100644 GIT binary patch delta 20 acmdm^xkr;bpO=@50SHPD%Wve~C;|XCg9SkV delta 20 acmdm^xkr;bpO=@50SKzqB{yuSB;fGdW}P6M+}(02wL{mH+?% delta 48 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 I`NGn_12qtwwEzGB delta 7088 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 Rfu+Q3mOWcrq;Knl{{wQvA&~$8 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-310.pyc index f3e70ea9fdb832de83d4636daa6d5f5c0472b312..1238ab75a5adada3c938c46654ef51152c1e37fa 100644 GIT binary patch delta 120 zcmbQuwUCQ1pO=@50SHPD%O|rjPvo1)!s(uxH*uARD|b6X8ev&wC51DEtA!v3A&M)QL6hf}@Z>}$ W;mux*#*D0*%zl1;n`@coF#!NvI~w2s delta 107 zcmZ3;HJghspO=@50SKzqC6j+JP2`)&%;8xwakYmtS35%*V+wN$OAAjFb1F*;V=8M3 zlO#hLQwnPeTMJ7wV-#Bodn$V>ha>|~jw6jFg(HQtg(Zr!oq>fRiYu5wlY6rnqX*;W IW~O;e03g5@!2kdN diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-310.pyc index a3af6992cb3fce5475b91240e89f6f3175f45a7a..c059fe8398c5e342db10d8d82595cd2faec672c6 100644 GIT binary patch delta 20 acmcc3b(@PjpO=@50SHPD%WvckUaR2}|{{(sf diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-310.pyc index f290f81c72130810e72db409dac223d3dcdff412..ee5e1b07760caa7153a29d38d20d0a7351f07519 100644 GIT binary patch delta 110 zcmV-!0FnRLP2)`sZw(C!00000b;BQHL9q=l0R#z0Wp1-S0kIPSyp!=1VFqLgWC>;i zvr-jG1Od6Tof$^~0R*$<8o~qt`m?AXTmb>jvjriz0s#(_z9ZxTB$J~gs{tyLPbDD; Q0tXZV3jQJ-vveh70X6C&LI3~& delta 98 zcmV-o0GhvkW1)0s#z@#UtbaB9p2ls{tmHRwW?>8V4d8vwtOI E0k^^)1ONa4 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc index 4e72329680656d60409ba4292c1b7e21351d2c12..6f16166f4f2d2d3ac39b3c98e76484027ed94ea9 100644 GIT binary patch delta 892 zcmYk3yKWRQ6o!47+ukq9ZnC+syFnmL0udB6Q4~;81R9!jMq)KtdzT^O*_FprAVrE4 zMRXKsL`OrJj(0%f5hz?mqRJD1AQ0>UkytvPea`$IAOC*)_`G^FsZ@$UkMvV__|XO6 zt4Xepl1?7!NIq*&Kw$)knNb8eB8X#xxkW5)6Pr84;VyBZ`Hmxx7f68@Ns*UGiI+*4 zS4f3dNtM?~jn_$?H^@0mdrxH5VKgT1ICcqW*(sqAZ=>@tx|{0QJ2kA zk73rLkirqx8jlue@x&q>T`9eX|5Of}?*OfAj~rU2l@o_7P`C&D>bbrQchX=|%gTzvn2pWf0r>vVhssW-j8TP|46=(G9s39Douh22+kaNo5>YWQFCZEQH3QF} zU{E(OFQB}D(t!+;1JN|8lTK+MnZgl^eNW67-K;^&pqIVt-nLGGSj{%ZaQI>{ z6_c@GNix_EL>pvh-Ob%QTJ6Jp(@-z-fiz9nI(BpRTDIN4xwWD5 z#L@8FI<%0uub2L!Sl5$s!Kv=eFlQ z=k7MLbfs?@Q?oBC{jtJ{6bgs2%sb7Gzt&^k?V1)VZ<9}G8nG>?v&7uW13h>Tl`Cz8 cumjO0!sr*W&_&rU{zSK&OQdUg9aVq-0r_mdumAu6 literal 9233 zcmb7JU2Ggja-N>Qon0=M6h-}zlI5{1SzKFM{rT^FKA&t!_Q}Z6jwna*M3>EQyO$hl zW_H~(E0ODE?q`+Q4^e^um*9Y05*Y}P=ruqP($f&xwj&F)DebXu_LNV`f;6CcVk1 z;#Hz4Z%VC;vI>O zdPmj#Likj4%sZyqPWW`>dai00!)K!7-f^aN9Z*yXpN&pLD6vcCM+6v2moBEvQo#GQ>l9y2?#bndw6+U&(^cKW|m=cqH-K&a%c%Dzc zuDzr2eSGGg#%BP10locv7QI=_GQ891AK(YkKPaZqKZE`uei;43m|a6}j?bevkKS4I zj_{-C9TjKA3!>JyymNp(#g74YOq>(dzUiF@06E1M09nXa6Z`tM_p-PkE;MyQ62275=<G1RX0%m-ZGk)=> zY%snR!;Ac-d$#vFXG>c3<3sv@j{NZgkqA07~O6UuOH>4#F^qS1t## z5sHLBm1}WBib%w%AEIAnSz)Oi#IcaoQdR`yax3gaaaOs~x*LZrpAY*$C6B*`kn)?j3EfN#((-4N^PpuO)#5Q(dy-%i93?|uSZ7m**tL}4go!L^P9T_*E{-Zw=EeGW?O43G^YCUa@;V`wnv8ng;WTJO( z5>sFHWm0QzWC!bs2t^~Uk474ypCl(hLo$!5!c5a-C9A~DuVzi%nnAz(3y0~CjLM6Vsfi#f1))Rw|U`S*|T_A^&DPA&*mjQ zaZmFKpWviC2g*8`&0M3+$PQEu+V|aHJ&66kgZPwO{C!7+Z6V#X<%&4zNa3cde(GX- z%~}(ZovbcYT^v~AHXwk4yRF#0EjE^0zT~cA65*|t6s{YqLE>Us>u%!mffgo&dRdI; z0>|ATU2SzzHx&LI$cvjoULf&u!%ZL=Lg88ngWJMg4LCH#ZFFSPl1UYaR-rpvms5;) zv2GGXLFlWUq^rUmo{Sp?%Y^z=;)-=h8m+e!tbiqo5o)bf#e>uCGHCJ>x7Bp-K!%{4 z?)ln<(>X`-IWB}4ec?7+v`s>Wg}~J)c`fI``I>tzRm=iO8%Yg|rVG`YTIYfq<3Z8@ z_i{XAnv@|0eq}q|Mk|6jOhvene|k}UN(>W;8{jy=-qGYBcH5!f5U#ibX8BE=w(G}k z2Zm{I@L+m=nx_>ZIQP4&L1Pss5r#l>M_{s8Z$qRplZ(*bz^`aF0l;!iwdD>J%Y|C4 ztbjSdKg86DB|e}JcMFD_v?7QUEai}_(ZQSnA3*g6csRr~lo`ckKa|4f8zWBe(_p&9 zA^OCboGY2>%atUvZ{MX~c?>$U*kD@}%0Qcp;}lBrDymfL!!Y((p!M`WW4{Zt2GeK2 zSekvkr`0XAEY3QboKJ1)(|xDzJiYs^A(`$HF^r_31#Uo@LN~t#M+ZWL5=&%GCh6H? zwUAj!2f7CBhj|IodR-D}k_>q^nIAmv03b}W=^^IfWh!YW4~@(u&6MZpyYmELS+QPM zIskNJ1LbL|E~2`Dl8`ewV^#E00k-H-_Xy;EhbgEHsoBOjVj?X`MVT~W+ynL*9J4XQ z$Vr2R(YrqzvF5rUd;4VWSKoZ!7kb{@)Hl$gK6(|dQ0Hv3AR|WVE zG2E)*13?-{xJX9C#B{HQ;l^nkRBpt!D8$yIvE&8pGqZD=#>XOG0{9`5ui!_L_-tYE zYv>A;gbuM(m}cF%J(!zgY!DlVf7GULE~6xeQT4P38Zj2XkW5^*`iQZAIob<3Pdm)= zvVfckQdjUu88(>OCy3=vMh|VxfZ?q;+{i8Uz?#5Bg!xI1jOmco!I;UofrC2(ear=2 zm&6;zyQ-mhm%Dhg;m>CR}XXP@QNrb=yi zT&Z1O!9W)!KNom4k|4YGON3scY2=`d_N#mr&*VBh6a#*ViCtS+`K_=cu12l302}{e z^5g;xVgqcb@{=dOU~bju&~E?hPk;P3!^U3^8-E28x`TAcRj1hu*0T~kGdN>n)Xw4Z zSs>eUYwuv-`zXT$)lFtHhe?9(+Th43TgB*jgMyqggN}9JkXhV@3uX#zSlEch3f#G8 z_L)~0L5jSjAkGLf!OIF#R6xOz<7% zkaX%(6eTM&`aJ6%+mrgoUpKVqWx_yr7KI~gtdHwOUPZU6%X$1{7DZ0$axVoa4ZR1! z?-Le6SJJ!g-c*by?|JPhI$U4?6}aSX>#{&?J*X+CPFY*K7%<#COQbcQoo+^Jt-|gvr+_fnDUb$m9}1n#ypO_;}5pQ zsU)3bfg6N{r1OVbk6qEeSEd;CSMnRE{>!bZeUF28un+rY%Y1#F=e>Bir*l zz+Z2Bl=ZM6mxZi+6Uu^6?Eh&rIMzuu>3j;Ikq&2{YIS8W){JdlvnFe)DbJ9XiHgf#$ruYquo6`%!*gMg<(8fdpW5`0^y+S>diE z=a6T1kRX$=k#l=&6x7K(uZMoL%>6fhM)(MES?iwK%9D{Ps=Xez5Z)$lppk#`Si-g?DRlyn2(VUlvB8**O02h{Ris>aTaYAIgQ1^@RbiG#|~ zY`6t*3JChxZ7NY6ZZnUEviU1{I&_b{Ej~1M5Veg@J#h!I&!QeJ%cpA%2|F6EIT>@}EYSsrR**=Z2VfWqzNq&PTxf zFQav+_qFRB9j-HSM2F7RleZ*+{9i{)QE%5$27s4Pk{YU^L~Ip&QGipJM*$9ZRQ}HN zik!@KF*`IQY)H=_8{K_oEclPn1LX(qas`N-%S6s`R4Tp8`g&4MVNu}_Ah8R#&rB)f z0Us44=!;pQuCla}vb4x_sVr@guEey}3X{xgY#ndD#$onCT;l;>Nuq%sie1W;Du6k2rQfD2)aVU-G? zIhmF7ie^y~8xIj`|05=-xavPKs)GCy3<**&OxH_HM@wh=m*%5NX}6m^IQMNaTWP1w z2!L0vQAIamPU^2yOHuwdwZ_zpNlGyAZzzMX$3~XAqE{?QaC)a{HJh2 z;=9;PpZy3@hHNfgSNm+!K#Tx=N_CECkQeSFyV%!K6UFLlO>5JPXL@*Y8O*W)FAT;R zckrEqS@x!x7JDW~v=|^qxoP#RHKg^^350EB6}B0C^1i-l_pINWr@Rqd=*niHS5Pjr zwN~!g>13~f7^QL_xulQYy$MM-@!vOcnLn>3{4V65{y!YJ*VU;-xryC%&uq=Y4UqLvv!-0Uv=+E6rVTqF${sAs+JeVqEq?X8ea`7xGQLBZeud>gM_ zmI{942k2)r2;lKDw_1mXjTe?iE9Re5PFJa>B-N)6(iUC-(J1)*jvqHfwLHA57b(j$j1VfHDszv%fSQ zayL|)>MttA!w6O=V3}q5SH~a8ALB!41kuz$QGX<$RLDpw14(xeUinDh$|i6Mt0d4?3lcJr%4EAs#kj8bt|Bk@RN9?wi*O2kYA>#?Cfj-`C)WIXKCKS(TIR}YhT8c@$4q*sHtlhnVBR}0`9>KnZY9VaLLc%Fq-f`^penCCrg0|u$s z?8J@y@+q`^nFe?jAU5QY7Adj(1FFWhPMLsX^vF6Sb9@5%9)x^}j-iC_DA(wK*(F{6 z1l{Vl@+>K+%!Oa6fs%VA?W6|Tyh5hZ z-*~U6b{E;GMKV*VviiCF&~a~(n$ZoJIj`p_jmm^o50reB@5Do(|neQKsKW9I)Q6XNyAK4wFU)&G}z j5jX!M8wH-gS9)2s4E-0nssFESmA=$Z+KG?D+q>KQ7=Zbq{DXFX|viS9kDY`yVWk~sGW6kR!-8U-Qjdvolf4$%X-Z2a=NW4d%A>9u+#owWO$f>n@o%HHAhTg`r1N!tU?pfxDzHhaj~Y3-DB#@^)&Tfwi2do3m zLF=I8WDAWsd2h?}4c6RipZau~hEvV|j1kTBmIfd?`!yrD)9s_l!sCr&0j@@DnDi{#IUg)kt^;JTYiwafF zD_4}YzTxHyfzC16d3>$2N<*mbisF;I5now~t`baXGkABRp49UQ1DF$DOy*8!Mf5vo`!C6-3pKB3GLDqam8+82${3^kZR<1EY) zT?$RC{U%wGsw_5d(iBbK3R$U7D7s>$;Y_rP{|S9K#0NmDc-~k{!-8OOV+i{Ip1e02 z9wdjSfeg%Qjk1?Y%iMMY4KUD=Yzb^g1*y^k^I+fCyFM-MMDCIO;_>KE?f|MqU0a2O zAI+1J_(F8Lc_Ijd^YAKjgRob1SbfEV<26#>yJjb{?1fJ6bTl%`Y z;|6%xig8h?X;&oWg+bY*R2K0=R9#hTu>HPDm1V-GeYK{7+9(v$SMJ7qvPyjLoOIbe*_6yC*lNjiWp4TXbf>5PgS!Dba>_d={Cy~+8VjX;(KZd;6mLmyA`3dBO zP}VKx#DAJS(?NPI4!9*&L+_{ZKnBs{FI8B>1E=EcD5Njdt2H?ee-i5am?*^h$Z2sj zHr9;rO-tiU_-TYQ21xq97}GYAr;QpGO2ZiU%)skCL12T?>i$OKR*>kb1%6kSci;5{Uh zP!rOf@2jf%OG8uNH+1!Z8V#xURU`8YJ|Vsz|8FuazMU8#w)k;kzfO(Yx=1I7+Q+Uy zfXDAeDDp}Qi&M#)y^p{Evoh+wi%0)LQETmdYhT4rlOvB{m)6WR2Mi-ywgV5kZW^P6 zogUurATREu^4q@wEp8ql8IG$u(KTFwNz{<>e}*Y8r>0JpQFaaigA=C+c$x4z!lu$q zOD;jfSE0DL>9{`~24A}O^VE|1Asc0$M%W1uL>hM4gGlZ02J%J_b|ZXHt@vstPyR-H zC(}o~d;gr-L-LnVo_Je&qHTh1@!@PY`FC+3`LV55pX;3a-+fc&&2VZ^(d}{qY1b?O$$JQ7fF%khTQKUC1(-8QuP+$9I!?OY#uSv<&XC#OVr$Khr)sz*&oQ(};wgk{){LCB8NBumf~gzPj+u`q=3HkPIu zYn#tNcyGT2SG$#AD4UJupk$*RK!iIX;g>&YLE`y z(m}RcPHDGX7E0}ekszOgX~>~LOJcs;lsQ<)>XFycb_i#C_;uX8kBM8I&pd}$X3^kN z$id4fh*TU}sy940Fw0a@7(YyGU%|d>M;)!nZy-ot-LR!pq7kt-Uj+AiF7K0T;z#+@ z>0i5%_ICBD5h7;04vTtEM>;WwsUO_yGWX*pA$pD`KA@K+`w;m>;3x+X+}{MEu3}-zKlzOZMhTzL*H2twCrN5)zkJNC z;^{)R8Kfbi!~M6`fi+zIDlQJ4IfyrSeSt$HEzOlV|1`3aoV~bQ<*c+=b{Cn;ZzI#R z%h#@!t}HTU^UnaI7~{{t5C0^>1%yqf%VG63gwFvS;sVLfBYXj%80SZk{uF}Tx{cY$ z@#T2@4z_+qjPBT-{yik65n7fIwH>{O(~v^8B76!GA=qsb;yFfmNP@2G5v)mC2SiHZ z8ZF-2@#B-Y_n6qp{r@Zwp5hT-TT*?~)8IxWkWp)J3+pR!xRrHZTO}(AKSA|NDj%b8 zi`$`^L@UnMksTYZDv0Zliy5$M#`>g1biOyY-R8vgNJtSJwUG#mQ%3AkC_ zkh>2rCSJnVlwDjmU2$$?=ft;Bla3d}2M=%>A0=yX5nqb#bv(kah;NQe2ICiTQ`TqQ&IJ4)Y`O1R~Wzl}Qq#@nVOTWRZBur==Mk=B+N z?+bnGk^V1%%31ge0ZK0~qy9OB3W7|D_KEUXXLBCw@>*d?^&(^uWUh^q=Zgp%2^5$2 z%@>guMTj8uAp9wUfv^qXuMqwYA%pNEget=3Iu9y+P#;6)bpRFD_Qya(ly1mnvqTMx z!uW17CC-k|kVE3LeZ>tHQ=6+az6 zqVkC7o#^Vq*;{Q8K1ads9^brT3n zV(-4aC$AvsA-s%m9bt3VC54+FL=HQ3x@@x}uS;bu&jUwR?A( zUFtzEdugaN%@4Y9rjNwUL$dwHKp#QXKQ4+UX;Gv|gS2Q0v{@7?ilQxwz%5z?2w=%^ zzi*B&%jq5F+i$*kee=!tnt8K+*U2@r*^~mmmk;#U-Z}efZisy6)kDv=i9!iA+^mK6lhX2rKtgXSS1a0zAr zi}KYa7F3-EW!I~#-1Se0cT;!B0r3av$;vc#o!#lbJE$ASP*%5B-Jt3--*=jgvw~zE zX-9Ejfji8P;(_C_=4w#WVS?>n43IdK(@^|B1`v`Jg=Ye?qTbRFzfJtiIpuRC&}BeUo{)BHF>s3qZ> z@lS;se=5}EM5jYdPLzSx476tXd4yP~_B9o#Il%K7CDd06)viznaqEkbz8nOtvL3~1 zc5RvQldzX43p%js!--dyn||Q)qd+XHd;!~H*xxS~qof>Ar4EnOrXT4oJ6Milj&EP` zc@cZ+D@~^%C*+SqogWvO+$cFEW^#w0j`7_y!6o@A91-6-g3ht-91}kQjpw2Gs01ZL zB_*|>>Lfvoca4)aE@Tk7IsxgdJ-l{WT?(lyuieUAmpP0BT(a03AzTcr5`=f|;% zZ1P7X&1nR3nJ8PW%CR-(y4C6)PRiIBRgI4Un1kXYl2CLtr>pu9DQ4BIN_zDBs;d6n z(A4(~UA?cyiud@K_?P_ufZG13Fiuv)&k9G?O-;;oO?FqV5u)J#B`DH74YAy{QL4bi ziyZ7!`A=jSWZw~zNEQzs#l{Y=ng;?#$?+lVrR@>wb4cA|B4W8X+_wQlA2*$gXFz_s zmLtadh9+Jwe&iXHFaIQh3kZG*ffQU7vE7+=PsM_Um!bG5S`@=RgCmWP!*+Y_%yqw@ zKK3cBqmh8rZ}?H7<=R2L$vyrVq#15=X^HVDe$D0$r?K>*WyGKLmdH26KlF~0r8__C zogpO$$B|%9Pig%FBJ3L=-xV+Pebne^miT&Ki%f`IY3yhg#(Y3H4IsRwat}Uy8Ntq` zfE8}HT8#gtU?uAm3ZJ9hchu)1U~m?42;UiZ1u@A*=9&{MgZePLvD*4malbT50+fZA z>rawTixd4P+c6pkXQ)XxoucWR`UbI5ES=Po8G49jSw^9&d`2Vlw)zN0T|l@V{x9rHh>{0!%#+8 zoQ^_c5*khT_QK@*>uSFOb&c(-mt-8lMfxaVCCLCzh)f}K8qoUtm3m4>8QmISG1;b3 z9b(WFJs>wXC|R17+sd=K9G!-xhG2=It)(@VhbhYRAOwP883;zeGgY{cVr__52F_Nck!PX{S2}D&xkF74h(384S=K49UCV?%>A@4@Lv= z@X)AwR}mM7PPS`kc-ue3cRc+us8A9rE6P>E<7lu{lQo4G0z%<1!Q-nmMhzN=lAy`W z7#Ma6Hk4jFcZLOwgUK@AytWLkiE;DNs^e0#ZaeNO2eQB1Ty@*jyu?g@wFPn4_ZcPt#>fcI}1e#?w4JHnF+lF8O96By5JKqF#D#tJ(vHfNviZ3-A46=+U z%^CQznoO9YOr6<~udpia3S%IM=>ljbdPkl?FpMBXus%NVEIN>P=ESgqR+NoA;R zD*){F-(jF%0+7;ll2Q`{B8;l)P&AboKh<+<$Hdam@Tu(?J~V+0B~dP5UTbR^4BN1W zE7gutasHh6lcC3R=qmG2&}I97ClbRiwP`$5S7KMmdWI$dQ?DxgWMI%F1@}cWn;PhM zr-#DN0zC_v?G_z+$7v2M=*fWd)Oov984ijO9c5P8S5zhTGnaot&V@ZQ|;(5XdS2lC=aTFxs~Wu z)+(SP9i5Z(+1XW}&2F9HsSnI2^>j@Kg`6*IZT>4D7XDcTZ2)Uy&+W3acfsA1xw4=_ zM@Wzwk=Cr&*UG0MuWEW`i#M0hy1_WP=?6Dluo+}^cjVd>FbRC^;k+mK1>?m1ky88D zagluI_#LooI{>ZWpGQV95r{I|>s4Vr{%c6eZP`F|+4h&2&%c1glxwfus7gEKUqk{( z7c_*ij@Fbj{0va}IyM!y1m;&+wP9a!8RZNc>j;$q>hl@h^&h9X-_hDxzOTu*ZbNh&giUeIWXm02uj;U4O7DLn<>&fj=172AVDO1Vu}0hj$HWeXG6%^yEofE993q-`K0ffA5VTT#OlC7arM z2C{c8)NYgYEMU6Ca$%0DmsLJTAu77D^?aCLF;?O$3Gui4hl*jA#x^q;M4&N)jpF+#z-2(^X3j^O{BvYg|n z`n(SSsF74kxKMaa%J>F0NF|y9hg|{YAuu*5c@3vkp>IyRUo8gr3AMF;#r9J{yCtl#Y#sNP+3wWp(jX2 z-By%N%Wlp1X(A^kCZ0`UW+FA@oOpTS94oFTgIJiP=-f0Y20nXi#?}*I3{)g>8}k1v z{(q;&2ljXY7!V~-V)k*p#TULK4j;I;fX#4A zO?P6t4Cx$0DBp+RO$0{}^ddlYiIR*u0Xj0D_Xuyg?;N@*j+gr=RfmU#Dr6X!eHqUq z11~Xl5b4yZ1^h|q1BNn<{beF5_bu7R&GWa#52vT*{|IN&n=QCdKfrqdpCR_DUb5=xWw+=SI6p<_||M+`$a^hr_wJqn{LN*y@13K1Oo_)2;_bY#4aL`0q?gF zOCZ1t1Rq53`v_tP`Vss&g6|>dLhvI5FCpk`Sl(qMz+_QgiT)7~|62eO$^cPgJw%N| zDG63NM9zv=E2sNT8u0!Anc;hoA;SBEde1OY@2byp9O_&uN(g*HD$y2Ziyi9!#qEX`1wW}o=>EY?K&YtR}%3Ayh~-^UxH|X-wbU0 ezmN0{A=X1Ov6NcSicjmqQaj&E#fu|7L;nY5E5Pmm diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-310.pyc index 16eabf269f3a841531577997397e6f2f624df324..ca9cbefcb5ef874b095f4cddd1b69bb72810cd43 100644 GIT binary patch delta 1945 zcmaJ>&2Jk;6yMohuh(mP{Sn9cY7&>0z{+hxQ-wlEO%ha<(qN<%fn-E1$1_g0wRf%A zjoOrtASDMlAOs^JBqUT$h$G?;K!^hp5+`nZ0R$H~a^b**_s02XOu}08^ZS}NZ+>rP zewzAzs_duJmIB|_cazOO2NdNuR383JP!?eXzkgW1wnG%EP`zz+lC>mJnED{a(w~!> zeO;k3YV0Z0*i~y8(Bjkt&19Kft(FBnK`qcNspmjX(iG?^h|V+R_5e+@0<~G3WhkMf zrHv>pon~luPv0fAL7J--X}&hZ7BF;x8LTj(U^s<;2pptE88}SIEyWr71M9CkYNXzH zDN0;t9^;MB=i+(t1F^+`+9nzCj(Xz?ZjC1pkb*B&o<=#3U>`yTq{wKwo*QgRSMDQi zlEg(xD?gP*pB99i7Y^f(&*TO;&=jCxDi$ef-1vG|i^x(8ERj*a>(X%3iS-sA2OFP2 zm_#Tc9M2e;^*R(2*6Ty!v)Ce3@^fr&?JNX3CVw2`FCsjOZ~-9F+RTe$t@c*1$sa>Q zjI)4+j@Dao22I9#qj_hm+rJbP$K8;X#kaT@i1`FOapeT!;LP=5( zuWxl}BV-3;9?j_^0E<`=Pgs}83=l9bcC7hjnG4hK%K(wl_BS>dk95~-`5aes_D>|X zsGrfRU|SXcSnpjtO7kSfq2tsZyehs*&d46P=j1#YeH!6wqLaF`^9&}GTqjQC`f2n_ zl4Y|0CwU%%Z^8)h#+k}6$s1Oz80Tnj!Z`Nnpe>5=^ionXUIG<*;im6Q$crlV6L@Zk zztXQ)RQ?=JmKjbu+SofE zMxX-NsYWiLX&rI80=MK)7 zndFYKMUfG1!xlE=<>wk&M#Y1C!EE}SF1!P}_%wfZM?SiV4HmA*+tzD}EDj%N-s1@+ zHV@KrKX6b V+FI7k&e@~7Jwfy#o# delta 1972 zcmaJ>&2QsG6!+MUV>^lKq+dxXZI@lTcuTVsSXe~2n=VwSQt4LO6)Pgq;Kq~I)Um_Z zVY@7-p!Nb1NHB;qNL;uf@gE>0xC0jpAtWRO2d6xfdFeUiizgTJhJSa(jpm6-Bflz}L|M|(x(r(+Vn?&*?PYrVId_6DrnV`_N>K2ix z{KWvZza;hIOOmH~*?q~&?#cBMNV;c$WYE%{QXd4_^l~8QgggXt-YbAy0PA5Yy)oih zbkrN5Sz4+{E!DHV;=Z~^>etIcS)v*ptw?C#5n(Xs4GDvaM{Y^Z@ZVU$sw1cJ^37CV zPAGGeh&eL-OKn>|m!e(L1EQFIeGbHLc?q(k+L;T}x<4KVxUOdW^J&oe*cnuON&eJcJ+vV7-x>uqW_9#K8>C?$S7D%lsSNA>%yNKhKFa2=Wbn z-+1N51-vbiehhb_{A{D!@!W(yAoA!=U-6j4DjziG$Q)lX@7xf6&;`2!kZM7+xk*{7 z`e7?#7|A(!q}ZB%Ca=TUZT_42!R(Qnt7wOcGr512f0nxp+<%|*&x?D)`Yf_v=WF@7 z-D~Jj@NAsQ^Yf?|1Pf>XPw+e#zYHrj0d%QMN}8D&$uc}|!aDI&L8^UPSj-8s58AL& z*q#ud?kV4dNMnotQh04ayiz4q6TeN_i{Oa80C3QwR0*TIX~v^L;`S4ZBnG@=tzHr? zWVVEtg@@B#G`8+d{+BgD1x0#4MThL9>P8d=O!NpZ9g8d83636yg>J%%aa`z9iCC(Y z5vObt^#t*x&Lwoufek-Z5w9}-W#E(LFNq9fa z#=S{)EVvkX`KUv~#(}cS|FLI`+vscxfIm}wcUN#>FdSZN1)+w3on)&BHxY2mFl-vj z063&Kz(jRNC9Z+$BUmv$6!|?>g;5C0lx3omF`1#>8B5J(1k-jW3H%K;!e0sg!)gS>eu33*y6tOR None: + key, sep, val = value.partition("=") + if sep != "=": + parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL") # noqa + dest = getattr(parser.values, option.dest) + if dest is None: + dest = {} + setattr(parser.values, option.dest, dest) + dest[key] = val + + +config_settings: Callable[..., Option] = partial( + Option, + "--config-settings", + dest="config_settings", + type=str, + action="callback", + callback=_handle_config_settings, + metavar="settings", + help="Configuration settings to be passed to the PEP 517 build backend. " + "Settings take the form KEY=VALUE. Use multiple --config-settings options " + "to pass multiple keys to the backend.", +) + install_options: Callable[..., Option] = partial( Option, "--install-option", @@ -858,6 +896,15 @@ disable_pip_version_check: Callable[..., Option] = partial( "of pip is available for download. Implied with --no-index.", ) +root_user_action: Callable[..., Option] = partial( + Option, + "--root-user-action", + dest="root_user_action", + default="warn", + choices=["warn", "ignore"], + help="Action if pip is run as a root user. By default, a warning message is shown.", +) + def _handle_merge_hash( option: Option, opt_str: str, value: str, parser: OptionParser @@ -953,7 +1000,7 @@ use_new_feature: Callable[..., Option] = partial( metavar="feature", action="append", default=[], - choices=["2020-resolver", "fast-deps", "in-tree-build"], + choices=["2020-resolver", "fast-deps", "truststore"], help="Enable new functionality, that may be backward incompatible.", ) @@ -966,9 +1013,6 @@ use_deprecated_feature: Callable[..., Option] = partial( default=[], choices=[ "legacy-resolver", - "out-of-tree-build", - "backtrack-on-build-failures", - "html5lib", ], help=("Enable deprecated functionality, that will be removed in the future."), ) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/command_context.py b/sbsheriff/Lib/site-packages/pip/_internal/cli/command_context.py index ed68322..139995a 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/cli/command_context.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/cli/command_context.py @@ -1,5 +1,5 @@ from contextlib import ExitStack, contextmanager -from typing import ContextManager, Iterator, TypeVar +from typing import ContextManager, Generator, TypeVar _T = TypeVar("_T", covariant=True) @@ -11,7 +11,7 @@ class CommandContextMixIn: self._main_context = ExitStack() @contextmanager - def main_context(self) -> Iterator[None]: + def main_context(self) -> Generator[None, None, None]: assert not self._in_main_context self._in_main_context = True diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/parser.py b/sbsheriff/Lib/site-packages/pip/_internal/cli/parser.py index a1c99a8..c762cf2 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/cli/parser.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/cli/parser.py @@ -6,7 +6,7 @@ import shutil import sys import textwrap from contextlib import suppress -from typing import Any, Dict, Iterator, List, Tuple +from typing import Any, Dict, Generator, List, Tuple from pip._internal.cli.status_codes import UNKNOWN_ERROR from pip._internal.configuration import Configuration, ConfigurationError @@ -175,7 +175,9 @@ class ConfigOptionParser(CustomOptionParser): print(f"An error occurred during configuration: {exc}") sys.exit(3) - def _get_ordered_configuration_items(self) -> Iterator[Tuple[str, Any]]: + def _get_ordered_configuration_items( + self, + ) -> Generator[Tuple[str, Any], None, None]: # Configuration gives keys in an unordered manner. Order them. override_order = ["global", self.name, ":env:"] diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/progress_bars.py b/sbsheriff/Lib/site-packages/pip/_internal/cli/progress_bars.py index ffa1964..0ad1403 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/cli/progress_bars.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/cli/progress_bars.py @@ -1,11 +1,6 @@ import functools -import itertools -import sys -from signal import SIGINT, default_int_handler, signal -from typing import Any, Callable, Iterator, Optional, Tuple +from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple -from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar -from pip._vendor.progress.spinner import Spinner from pip._vendor.rich.progress import ( BarColumn, DownloadColumn, @@ -19,263 +14,17 @@ from pip._vendor.rich.progress import ( TransferSpeedColumn, ) -from pip._internal.utils.compat import WINDOWS from pip._internal.utils.logging import get_indentation -from pip._internal.utils.misc import format_size -try: - from pip._vendor import colorama -# Lots of different errors can come from this, including SystemError and -# ImportError. -except Exception: - colorama = None - -DownloadProgressRenderer = Callable[[Iterator[bytes]], Iterator[bytes]] +DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]] -def _select_progress_class(preferred: Bar, fallback: Bar) -> Bar: - encoding = getattr(preferred.file, "encoding", None) - - # If we don't know what encoding this file is in, then we'll just assume - # that it doesn't support unicode and use the ASCII bar. - if not encoding: - return fallback - - # Collect all of the possible characters we want to use with the preferred - # bar. - characters = [ - getattr(preferred, "empty_fill", ""), - getattr(preferred, "fill", ""), - ] - characters += list(getattr(preferred, "phases", [])) - - # Try to decode the characters we're using for the bar using the encoding - # of the given file, if this works then we'll assume that we can use the - # fancier bar and if not we'll fall back to the plaintext bar. - try: - "".join(characters).encode(encoding) - except UnicodeEncodeError: - return fallback - else: - return preferred - - -_BaseBar: Any = _select_progress_class(IncrementalBar, Bar) - - -class InterruptibleMixin: - """ - Helper to ensure that self.finish() gets called on keyboard interrupt. - - This allows downloads to be interrupted without leaving temporary state - (like hidden cursors) behind. - - This class is similar to the progress library's existing SigIntMixin - helper, but as of version 1.2, that helper has the following problems: - - 1. It calls sys.exit(). - 2. It discards the existing SIGINT handler completely. - 3. It leaves its own handler in place even after an uninterrupted finish, - which will have unexpected delayed effects if the user triggers an - unrelated keyboard interrupt some time after a progress-displaying - download has already completed, for example. - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - """ - Save the original SIGINT handler for later. - """ - # https://github.com/python/mypy/issues/5887 - super().__init__(*args, **kwargs) # type: ignore - - self.original_handler = signal(SIGINT, self.handle_sigint) - - # If signal() returns None, the previous handler was not installed from - # Python, and we cannot restore it. This probably should not happen, - # but if it does, we must restore something sensible instead, at least. - # The least bad option should be Python's default SIGINT handler, which - # just raises KeyboardInterrupt. - if self.original_handler is None: - self.original_handler = default_int_handler - - def finish(self) -> None: - """ - Restore the original SIGINT handler after finishing. - - This should happen regardless of whether the progress display finishes - normally, or gets interrupted. - """ - super().finish() # type: ignore - signal(SIGINT, self.original_handler) - - def handle_sigint(self, signum, frame): # type: ignore - """ - Call self.finish() before delegating to the original SIGINT handler. - - This handler should only be in place while the progress display is - active. - """ - self.finish() - self.original_handler(signum, frame) - - -class SilentBar(Bar): - def update(self) -> None: - pass - - -class BlueEmojiBar(IncrementalBar): - - suffix = "%(percent)d%%" - bar_prefix = " " - bar_suffix = " " - phases = ("\U0001F539", "\U0001F537", "\U0001F535") - - -class DownloadProgressMixin: - def __init__(self, *args: Any, **kwargs: Any) -> None: - # https://github.com/python/mypy/issues/5887 - super().__init__(*args, **kwargs) # type: ignore - self.message: str = (" " * (get_indentation() + 2)) + self.message - - @property - def downloaded(self) -> str: - return format_size(self.index) # type: ignore - - @property - def download_speed(self) -> str: - # Avoid zero division errors... - if self.avg == 0.0: # type: ignore - return "..." - return format_size(1 / self.avg) + "/s" # type: ignore - - @property - def pretty_eta(self) -> str: - if self.eta: # type: ignore - return f"eta {self.eta_td}" # type: ignore - return "" - - def iter(self, it): # type: ignore - for x in it: - yield x - # B305 is incorrectly raised here - # https://github.com/PyCQA/flake8-bugbear/issues/59 - self.next(len(x)) # noqa: B305 - self.finish() - - -class WindowsMixin: - def __init__(self, *args: Any, **kwargs: Any) -> None: - # The Windows terminal does not support the hide/show cursor ANSI codes - # even with colorama. So we'll ensure that hide_cursor is False on - # Windows. - # This call needs to go before the super() call, so that hide_cursor - # is set in time. The base progress bar class writes the "hide cursor" - # code to the terminal in its init, so if we don't set this soon - # enough, we get a "hide" with no corresponding "show"... - if WINDOWS and self.hide_cursor: # type: ignore - self.hide_cursor = False - - # https://github.com/python/mypy/issues/5887 - super().__init__(*args, **kwargs) # type: ignore - - # Check if we are running on Windows and we have the colorama module, - # if we do then wrap our file with it. - if WINDOWS and colorama: - self.file = colorama.AnsiToWin32(self.file) # type: ignore - # The progress code expects to be able to call self.file.isatty() - # but the colorama.AnsiToWin32() object doesn't have that, so we'll - # add it. - self.file.isatty = lambda: self.file.wrapped.isatty() - # The progress code expects to be able to call self.file.flush() - # but the colorama.AnsiToWin32() object doesn't have that, so we'll - # add it. - self.file.flush = lambda: self.file.wrapped.flush() - - -class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, DownloadProgressMixin): - - file = sys.stdout - message = "%(percent)d%%" - suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" - - -class DefaultDownloadProgressBar(BaseDownloadProgressBar, _BaseBar): - pass - - -class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): - pass - - -class DownloadBar(BaseDownloadProgressBar, Bar): - pass - - -class DownloadFillingCirclesBar(BaseDownloadProgressBar, FillingCirclesBar): - pass - - -class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, BlueEmojiBar): - pass - - -class DownloadProgressSpinner( - WindowsMixin, InterruptibleMixin, DownloadProgressMixin, Spinner -): - - file = sys.stdout - suffix = "%(downloaded)s %(download_speed)s" - - def next_phase(self) -> str: - if not hasattr(self, "_phaser"): - self._phaser = itertools.cycle(self.phases) - return next(self._phaser) - - def update(self) -> None: - message = self.message % self - phase = self.next_phase() - suffix = self.suffix % self - line = "".join( - [ - message, - " " if message else "", - phase, - " " if suffix else "", - suffix, - ] - ) - - self.writeln(line) - - -BAR_TYPES = { - "off": (DownloadSilentBar, DownloadSilentBar), - "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), - "ascii": (DownloadBar, DownloadProgressSpinner), - "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), - "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner), -} - - -def _legacy_progress_bar( - progress_bar: str, max: Optional[int] -) -> DownloadProgressRenderer: - if max is None or max == 0: - return BAR_TYPES[progress_bar][1]().iter # type: ignore - else: - return BAR_TYPES[progress_bar][0](max=max).iter - - -# -# Modern replacement, for our legacy progress bars. -# def _rich_progress_bar( - iterable: Iterator[bytes], + iterable: Iterable[bytes], *, bar_type: str, size: int, -) -> Iterator[bytes]: +) -> Generator[bytes, None, None]: assert bar_type == "on", "This should only be used in the default mode." if not size: @@ -315,7 +64,5 @@ def get_download_progress_renderer( """ if bar_type == "on": return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size) - elif bar_type == "off": - return iter # no-op, when passed an iterator else: - return _legacy_progress_bar(bar_type, size) + return iter # no-op, when passed an iterator diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/req_command.py b/sbsheriff/Lib/site-packages/pip/_internal/cli/req_command.py index 5d4d1f0..1044809 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/cli/req_command.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/cli/req_command.py @@ -10,7 +10,7 @@ import os import sys from functools import partial from optparse import Values -from typing import Any, List, Optional, Tuple +from typing import TYPE_CHECKING, Any, List, Optional, Tuple from pip._internal.cache import WheelCache from pip._internal.cli import cmdoptions @@ -22,6 +22,7 @@ from pip._internal.index.package_finder import PackageFinder from pip._internal.models.selection_prefs import SelectionPreferences from pip._internal.models.target_python import TargetPython from pip._internal.network.session import PipSession +from pip._internal.operations.build.build_tracker import BuildTracker from pip._internal.operations.prepare import RequirementPreparer from pip._internal.req.constructors import ( install_req_from_editable, @@ -31,10 +32,8 @@ from pip._internal.req.constructors import ( ) from pip._internal.req.req_file import parse_requirements from pip._internal.req.req_install import InstallRequirement -from pip._internal.req.req_tracker import RequirementTracker from pip._internal.resolution.base import BaseResolver from pip._internal.self_outdated_check import pip_self_version_check -from pip._internal.utils.deprecation import deprecated from pip._internal.utils.temp_dir import ( TempDirectory, TempDirectoryTypeRegistry, @@ -42,9 +41,33 @@ from pip._internal.utils.temp_dir import ( ) from pip._internal.utils.virtualenv import running_under_virtualenv +if TYPE_CHECKING: + from ssl import SSLContext + logger = logging.getLogger(__name__) +def _create_truststore_ssl_context() -> Optional["SSLContext"]: + if sys.version_info < (3, 10): + raise CommandError("The truststore feature is only available for Python 3.10+") + + try: + import ssl + except ImportError: + logger.warning("Disabling truststore since ssl support is missing") + return None + + try: + import truststore + except ImportError: + raise CommandError( + "To use the truststore feature, 'truststore' must be installed into " + "pip's current environment." + ) + + return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + + class SessionCommandMixin(CommandContextMixIn): """ @@ -84,15 +107,27 @@ class SessionCommandMixin(CommandContextMixIn): options: Values, retries: Optional[int] = None, timeout: Optional[int] = None, + fallback_to_certifi: bool = False, ) -> PipSession: - assert not options.cache_dir or os.path.isabs(options.cache_dir) + cache_dir = options.cache_dir + assert not cache_dir or os.path.isabs(cache_dir) + + if "truststore" in options.features_enabled: + try: + ssl_context = _create_truststore_ssl_context() + except Exception: + if not fallback_to_certifi: + raise + ssl_context = None + else: + ssl_context = None + session = PipSession( - cache=( - os.path.join(options.cache_dir, "http") if options.cache_dir else None - ), + cache=os.path.join(cache_dir, "http") if cache_dir else None, retries=retries if retries is not None else options.retries, trusted_hosts=options.trusted_hosts, index_urls=self._get_index_urls(options), + ssl_context=ssl_context, ) # Handle custom ca-bundles from the user @@ -142,7 +177,14 @@ class IndexGroupCommand(Command, SessionCommandMixin): # Otherwise, check if we're using the latest version of pip available. session = self._build_session( - options, retries=0, timeout=min(5, options.timeout) + options, + retries=0, + timeout=min(5, options.timeout), + # This is set to ensure the function does not fail when truststore is + # specified in use-feature but cannot be loaded. This usually raises a + # CommandError and shows a nice user-facing error, but this function is not + # called in that try-except block. + fallback_to_certifi=True, ) with session: pip_self_version_check(session, options) @@ -227,37 +269,12 @@ class RequirementCommand(IndexGroupCommand): return "2020-resolver" - @staticmethod - def determine_build_failure_suppression(options: Values) -> bool: - """Determines whether build failures should be suppressed and backtracked on.""" - if "backtrack-on-build-failures" not in options.deprecated_features_enabled: - return False - - if "legacy-resolver" in options.deprecated_features_enabled: - raise CommandError("Cannot backtrack with legacy resolver.") - - deprecated( - reason=( - "Backtracking on build failures can mask issues related to how " - "a package generates metadata or builds a wheel. This flag will " - "be removed in pip 22.2." - ), - gone_in=None, - replacement=( - "avoiding known-bad versions by explicitly telling pip to ignore them " - "(either directly as requirements, or via a constraints file)" - ), - feature_flag=None, - issue=10655, - ) - return True - @classmethod def make_requirement_preparer( cls, temp_build_dir: TempDirectory, options: Values, - req_tracker: RequirementTracker, + build_tracker: BuildTracker, session: PipSession, finder: PackageFinder, use_user_site: bool, @@ -288,33 +305,13 @@ class RequirementCommand(IndexGroupCommand): "fast-deps has no effect when used with the legacy resolver." ) - in_tree_build = "out-of-tree-build" not in options.deprecated_features_enabled - if "in-tree-build" in options.features_enabled: - deprecated( - reason="In-tree builds are now the default.", - replacement="to remove the --use-feature=in-tree-build flag", - gone_in="22.1", - ) - if "out-of-tree-build" in options.deprecated_features_enabled: - deprecated( - reason="Out-of-tree builds are deprecated.", - replacement=None, - gone_in="22.1", - ) - - if options.progress_bar not in {"on", "off"}: - deprecated( - reason="Custom progress bar styles are deprecated", - replacement="to use the default progress bar style.", - gone_in="22.1", - ) - return RequirementPreparer( build_dir=temp_build_dir_path, src_dir=options.src_dir, download_dir=download_dir, build_isolation=options.build_isolation, - req_tracker=req_tracker, + check_build_deps=options.check_build_deps, + build_tracker=build_tracker, session=session, progress_bar=options.progress_bar, finder=finder, @@ -322,7 +319,6 @@ class RequirementCommand(IndexGroupCommand): use_user_site=use_user_site, lazy_wheel=lazy_wheel, verbosity=verbosity, - in_tree_build=in_tree_build, ) @classmethod @@ -347,8 +343,8 @@ class RequirementCommand(IndexGroupCommand): install_req_from_req_string, isolated=options.isolated_mode, use_pep517=use_pep517, + config_settings=getattr(options, "config_settings", None), ) - suppress_build_failures = cls.determine_build_failure_suppression(options) resolver_variant = cls.determine_resolver_variant(options) # The long import name and duplicated invocation is needed to convince # Mypy into correctly typechecking. Otherwise it would complain the @@ -368,7 +364,6 @@ class RequirementCommand(IndexGroupCommand): force_reinstall=force_reinstall, upgrade_strategy=upgrade_strategy, py_version_info=py_version_info, - suppress_build_failures=suppress_build_failures, ) import pip._internal.resolution.legacy.resolver @@ -419,6 +414,7 @@ class RequirementCommand(IndexGroupCommand): isolated=options.isolated_mode, use_pep517=options.use_pep517, user_supplied=True, + config_settings=getattr(options, "config_settings", None), ) requirements.append(req_to_add) @@ -428,6 +424,7 @@ class RequirementCommand(IndexGroupCommand): user_supplied=True, isolated=options.isolated_mode, use_pep517=options.use_pep517, + config_settings=getattr(options, "config_settings", None), ) requirements.append(req_to_add) @@ -502,5 +499,4 @@ class RequirementCommand(IndexGroupCommand): link_collector=link_collector, selection_prefs=selection_prefs, target_python=target_python, - use_deprecated_html5lib="html5lib" in options.deprecated_features_enabled, ) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/cli/spinners.py b/sbsheriff/Lib/site-packages/pip/_internal/cli/spinners.py index 1e313e1..a50e6ad 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/cli/spinners.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/cli/spinners.py @@ -3,9 +3,7 @@ import itertools import logging import sys import time -from typing import IO, Iterator - -from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR +from typing import IO, Generator from pip._internal.utils.compat import WINDOWS from pip._internal.utils.logging import get_indentation @@ -115,7 +113,7 @@ class RateLimiter: @contextlib.contextmanager -def open_spinner(message: str) -> Iterator[SpinnerInterface]: +def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]: # Interactive spinner goes directly to sys.stdout rather than being routed # through the logging system, but it acts like it has level INFO, # i.e. it's only displayed if we're at level INFO or better. @@ -138,8 +136,12 @@ def open_spinner(message: str) -> Iterator[SpinnerInterface]: spinner.finish("done") +HIDE_CURSOR = "\x1b[?25l" +SHOW_CURSOR = "\x1b[?25h" + + @contextlib.contextmanager -def hidden_cursor(file: IO[str]) -> Iterator[None]: +def hidden_cursor(file: IO[str]) -> Generator[None, None, None]: # The Windows terminal does not support the hide/show cursor ANSI codes, # even via colorama. So don't even try. if WINDOWS: diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/__init__.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/__init__.py index c72f24f..858a410 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/__init__.py @@ -38,6 +38,11 @@ commands_dict: Dict[str, CommandInfo] = { "FreezeCommand", "Output installed packages in requirements format.", ), + "inspect": CommandInfo( + "pip._internal.commands.inspect", + "InspectCommand", + "Inspect the python environment.", + ), "list": CommandInfo( "pip._internal.commands.list", "ListCommand", diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc index 1115bd8e062f04179e29a24d1953e0a3bb3db2c6..492ec03feab929679e8272f454622c241d4c0e88 100644 GIT binary patch delta 477 zcmYk1J4*vW5XWyfm)zyNTtwm{;vLC|kTf>F-yo(r!tI0vbGx#8QKF@m7Rok$ z1uGH7TCf%Dudwt}D7bgAa2J;U{AT7qv#$fsMTg~bmZnbYZPcI4-#SC+^l{2Xdt?PH zvP#y-`ejO@N*83n2CIgP8sx~vl14VcCR>mu+mNkg$PU@P(ko6vx4{6rsMU0`NA?xX z6TGjv2TynC3t2{kiWBg|^AUMt^w0f86=$`Bmst>0DLEhgi%Vf0N+<2G&S(kfX@fHw z0DZbhmC}VtwRU8Pmg?Z`t$WSYxho$`HxnoLl>9V@(X{+F$1*c9n33bzi{3y<5&ziH zEo7kr(lK9j-(|gbF=Wp!3FWPZFZz$pnR^4D|KikWo{kHCb{iaE> z#3DvZbrq7w2Q>vB5(^)Z46YNsmBq*Sz9p2Fr-Q94M>^Z3Qjq1C=&3L6s7!;AW<+TgSF+r&MXH zEI>jmKtkTKC<{IS@dH$_VZ#Sxg~Wm#5`Vyq^K#T6n8-JC?R(C-cjnF<_aDQU*4@nm zGD@E>7KVBO_(2`_@Dk?^c}(L?EH{WkZ#~)WIe@xR_&Gpf?0?2(!-z=(q36Sq=BY?8 zH~@H9AMyr_Ml;y7#FS)h!P$~puw+e5JkCh#$vs_CP2veqlvD&oRkPreCX_OCgywZw z&lj|!u3!sKONE`1E(mac-$7Oy$}3ovidbB*aPcp)ume$3{qV3k-KZxG-8n}`6So<`sXoVd(33CSC#CvOrL|Rv5tAQTN9o$|U6LRACT0CRO#k3_E zR#a$8(_-inIw}rT+zByPWos)syssPD<{=zzl@DF|a5SmzCT5l&r1GoFEBDfqEtWO` zD$)v_p|P&ecr9TezKGRLvV|fX?~G0@r1EzkRWi$YD!G`A?Qm;=1Pt~(7nOjw^OpIqk zCYIN=r`RyJu%g(*-Y<-0|MV`!z&3+=(J92C)5wd?Apa{L0}jA8d&HqW@(9?2sW#1ybN~Y~^{+l0v`=^*#Kk)^& z%Eqr7VKOzSUo#OhtMU^HStfegr%XHBb)N~_@4M!S{naG}&(YWcY6k5rKM)yeVjUKT zfHO*}ZolReOvwJqFRY%YF)TIYo&r_Qw2UeztCn%C9o%Fvg5<*-c}!Yb0C*S=%d;0o zo%ceI5u>0_GHf z8ip)}g-nbLDGWeef|Gx79+>=%%au`lvJH0?n;FO=qse=?jW_@2)??Hb2l6$UZZYW@ z6!8L?MIb(ekN~o7aoOZ#7MCRF=N8z7PLAO9V&t8?nAZbHzTr)@7Xzu40ujFoz0AoEQ1BvnDtizS57L7NJ*fzaAia1jLQm>JXE%+I;tagQd+-1Mz4`bv_v?6u zrqd}!E`M#ToI9|ZQDf?6Obo=nPnBt{raMM~y4<2p3gwzakMLPMLpbs(!Ojjb7@x^( zOP!9FR_3W=S{0w^p$%RpO%J^)^=$(e2^y43Pgj>!VzdoWVzGrqN3W5I2wt~%HNtu> zDOBTCS{zV}%F8mO;UC z4APkNnT=J>U2nEn+)@=Ns}%ECkA`mPd`6<7!fS|h80t(((rvrV_9k%AU*Wi&XVAK1 zQ{5I$|dQby<-UN~D49Uh3G*2o$-tt@8hvg;Zp9%0!1c1gUru{}|s7 ziXw{In7E%Xw!e`~4~4hT`E+7w zUUu%N)+~Z@Edk2auI0p1mv?A6ww$=wbyG29_IjcYafQd1lFj+8t|X5c>f>(Nn-V{= z71$xp4WG>QFIYAyQNBQZ$2h?lWnYq}OobmxJQ}_*wl06YmzN<0DK!a6P}M=mfF`#J z$s0l6o+FTRWu5hgAuYqf1PcXhJPb@2Bl}=8xHW=O0KwB-A3#s=V(&OWR;-T>!$9zR L^e{j}Ok?RU)9w^+ delta 349 zcmez6^520kpO=@50SKzqC6hlWZRBHOW=dq5EX4dwCND8Jl}iB#bQOwIORN-vQ%e*| zGEx;l;*&L4Ojy8-EEd1XI&61Y*ccfYCL6HJPu5{ifye+k96*f__2=2O;i8+>IZiV% znr!~eWx~uDwONC&l##Jx@;v@ajMFw33WzW=wr_3|6lY{yI(eSZ8OGIC6tELm)ohKvlgtc(m*93{*t zObgg+ShF}LACXFD_3T)QfZF|f-mY%Wm z&{_^S5=clu=xc;*0SAa84wmu>dq|LOGF*8Ds?5vps--w-e3T8p*qIS_KnLR?@)aOzj&y-uImC**|P?+lm&LQdK>XV4rJa>^cZhRtCir|l7^Zq|jIu}7UTa|}sD z*&Zhcc91!Nv&6tTlEit8mZG?Ti#JvCAU?Q>OSlKbNt`DsVi03V)}T*Q&EOHDJ+{^HC}?K! z7#SOc@CF1L#|J?5>`4hvVB@BQ4We%;=3$K9l#EGsADv@|VD}U<%WZ~6d$>y(AXNNoeweYGwoM%32F<|oTq+{uxR1`xsC~%_7X?%qRcAH_ zVBUh!ePobgFkXe>p9ct}RkST*gykLi^ZW+X0akBH9cf$Hk>;f>w1M7%>QLd`Qjp}v zW+lJx3PKWpFTw~^9Klgofw=b;KcKd7J=wO}Q;l^t9r?I#&z>M(m^f-%e$euq_A!G! zh+LnoftC&dEEtH6@JXG+zGd;F%fuyD+w|BJ>qMVF9SP&Wg+~M1S`6cq_}&_A5kHK3 zZQ?cpay8)ECblgXv?{h*fgy)zDU1ls-teqX8!V(CXAVV`D2n~p|8F5ir`dV!*Zxpz ztP>Y|6!tc=Z(Hn@*btg!%~)~uB`~$1_qtC6Bo&6>`2q+5aLU;XPzM3qz~+YBk$t0s zR-r@JkY9XV`UnL|psq%?qg=a#mVwU=rK4HroHJebrrBEU6I%mZXo?_y?c)fTO>^?87 z7)l{k&d4RS`(^wgDs*enh|p7Dr!#Cl`P@@AcP}}FPP5;VcP6{ebeg-08a)dV@F>>q zxn6cRrK8KcKcy}pG{kC|3n<0bGUKIgh)`Q6bkXw(&9NUcmwNZCg@|F?U-7Oqg66Wn zvOAVNjtX77A=6Qw{V=RB$!mqmM z{$ZxoY%H$17>KsqCGQhT-CO!!dwRgG;lh=Z4BM2`F!4 zdW6G^+!&ufas2It`7k_?;*bU~6#4;|-{9bL*tbE2uDRcX-aiDOBKAx9WjIey z<=iIa-u#zAqa2O{go@<`^ah_k2_q!I?E7H24a4XC6oY80s>%tu7NOiiKLjx5!eX~| zr@Ea>C%D6PfKao&5=CTC< delta 2046 zcmZux&2Jl35Z|}E_O3tUbsfhaNt`$ztBQ&dvQp$+AuMO_sv$8ViD-4FA2 z(+_ZzLLwp515}SQ#Nq-%TnHEb1~~PA)a6nkaqNX72$h+al9mWt@3-@QGjC?z%AR3GvOr7q~M92GSgrivHP5inGsynHk_<^NXVLllHJvF)Kn&*(1)VIV$9|U3JFHF(LQaOD;++nGVnb zu+y{%$Fi2zQfY~nfjRbsNm@0qQ|TZb0(OQDKRqo%sI)>yK=T|#7^PK^j?*zK@KJ%|CwBh>GgW6ZCmv^FUr5A z4nZSX4&WP!6}Yb4AtnBa^3g2vHI3y_Jpd3Y{%t=@x1Ek{IhGqVg0|-}aoRwe5ac|q{N3mat9mGV zeyDaD!D^_kd2Kh;Xq&kW#|o33cBgK8O;N8<^*WXt#+cQhcH6b!3~e`qnqv0duw3e~ zdT=YK3pb<{Muf?;vH8PjrI3Y$q9je!$8j~PM2Y@*@b9e7=D4B#a*VKX*JK)To5vR-m>Rg%;0y^*GdQc#e~10vEpCfC4FZ}c3)qU*(7Fkl3&h@^$EI&`y&9K^N%xc z891I{lv$1kA*Nx&A7y4M!g3ic(L78y8};RNmqO3mZp*vNPa6}FHfWmnj3U2dd`9}Y zk-bV1{Cf84;C}SI!-)o^b+3c3y8rd=!|Z*zh!+dBn+@i+-4#~CI5?23%zx@%74JJk z@617X2Lan1YLQ86k>r79dpGZooEi`_zq)L}AxJ@g*!j37~^F zRaND#oHcF^{s|fv?O})4_qFeP@5^_Sd&$uzr3C5Ie#+Gz@98>_7rvmk=03A6=>USOC+igP+ICW3^MecJ`lMVYbui?~Wt^Hr0{2sHDlEpgzt1 zrGzl9hdm;Z4%7YGjPSHH^-yNd@DeA;vt)v2{HXwKp`)xvCFNO$+DKe$Hmw=7Iy>kJ zWZa*Tbm(CDv*BOJFC1x!TX&Ad8S&?(6+l-H?B@2-N}{Avgkw5fk?NAQS^Q=?!gi{{ z7Ggv1QmlrM4`E5YkPeic$R&kj4kLq=F@CUf*ey;!k delta 362 zcmXAlyGjF55Qfie_Ih@Y#!D`%(R6AGwNeWk3sFcUjkY4_S%V8kve{IgRnbD5fH>G# z?Sfz}Dbn}~;uBa2zJfv;&&FxyA7=iakNGIym)RL(l*l@tcaQ3?Yz?x7h8G?LUaNBw zc&A=7?A2i_13UPr{#1S7z!je1D%ZFkj{6hb;AYnZ5-RbeAU;W8sB@v>=jB{TlnBxu z7r7-MQGonU_^l=2;+_89YZzmoZb$~aGE4Ym`mlhS)w|?ISBt11GFaY9BlUB_lmKQ| ziR=c69AW$UxR8)dvhPMrFu%x2hXl7$xl%z}RLM06E1nW;nBc_I=`Pi+rf`CXu*5A+ z;~C*3a3kTu*w6V7z;$}8+VT&x&QzG diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc index eacecc71554e440a600600887804544244762e14..51adc055674b8c89847a34715552307bc3feaa64 100644 GIT binary patch delta 44 ycmX>ta$1BtpO=@50SHPD%Wvf7WEA2mPAw@dD9O*yDZa&8o{^fGvssN%l@kCD#tifT delta 44 ycmX>ta$1BtpO=@50SKzqB{y<&G77PlXQZa)+~O)uEh#N1$nMvjy?&Cf9Q6Nr?fOd|XV-OpGjy zOpI)QS=g9>G>EnNIOiuu#?r~VxI5(>fvPkaZ}Dap#}^c(7NzE-CKjh^G8KUwQsgu_ zkw=)-709ffT**_z=sfuwk1}KHWGUXwj1H5}@h)dfn_R|skkNgz1-}MRB#}RaQF8M( NejX;q;K_#t!vLsnHp>72 delta 353 zcmX@FJX3`?pO=@50SKzqC6hmH(c+qu1njd>TLzasCiSsm(e3JWPyXlPd+o0E;VDcK`qY diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..497e3a9e45456f62aa6313bb78fdc159fa949d53 GIT binary patch literal 3123 zcmZuz%W@mX6`dDm1_SURiK0bCk|%LqNSTnljEkknp<W~ zH)In9uBfVHqeb>wP)q+nejtC*+pO{nabo-29zddGH>xjgzq?PLdwQCcmB>Px{_EX* zxMErVrozSKp>Pjb{u72-%r32j{+-gUoW!xocT2bO60hncoyt#qQ|FaI6(*taJ7u?u zlF0ae*{k|V-}phfQmrPd#t+N2YCTyuez&|-T~00=KPsHMwfay>hd9Cwa&C z{qkD1m2BA-x6ZHgpS`q`8=qKgg{?lb*eYK?bCa9Q-nRy8|H0m^y@9R$&$DvM<-pbM zNA-#J?iabz-orvFG+tqRlub*O^7?5Zn!4gORYwz1)G9reO^s47O`mchi>6LfYRoIv zOcaU|rC_(Is;p+@?tiws`=|Z=fuq;|m`Q#gYlz}-N?rBZn7_SBPbyXxhw0?;m}crt zGIf-yCY_2hr`=ynJ_`4c<>xTmN^E8&4zm-NIf=*Iq{G&j&w^)O;VBc+`k0Q$sW9quHkUkKN1fZAnzi}J(#(5Y#rOoW)5?i$2!kFdszn@Ol`=z&pU1H zxviXY_oemHHf8U;!y=mDrC~G9-rJi6+uLQ6XQhs$Y6MS}nDUQj`wvF6|11VS)HEw` zSOAf!_$ZU{xNHuyGS2dxOZk4xnz(LMT;kprP36gUQA?GTB?m59{x}xzHZj+54Z?tWANj)KSKa2UdzM8g-X8oD%!AKgk5Ge+7$hp=bcnek_{l~4c<>o|$%B2+{Og1J{OJK9R~?FCoH3rtBQA>3=s+GWy@$o&0d01B3B|#r znA}bgYh2V>c{^`oN#4ft#KYm_ME72ASKh$7@)nG5JMGW$zxBHdA2t5B>%oRSyZ+z} z9uF@}p@Rj{w3mso%w5d3OdU9ssZRbCMp@^e7?FnPGjBa_ZXb8f>|-DQ0dlCiDmnuZ zpS!0nb5-we*2pGGJ`3mWee29t{WFXCFT7Jvt;{_ZJg50qLAr2nb^-wCM(MP1A>({1 z1mX+Vo*}Tlo&Z78B#>-@%`kq1FkEn=4XC)vPU8G1tH->h>S&4p;)uSILx$q73WO;! zNED5Tzsf{i)MFxHWcZ#oV43a`lUmo4kBf=6@4OL!&H@`^m)wLIBiz0WPVK*2=N2LJ z59f)q-%Xn{rasd z6w`XRWA-cW!dVUh>w|?jLqLnkQmJ(pptfTk}|^vca16%VsdZZa0F=0}S?7h*_Cg>3v_n>WFz=ww-=Wz9@q5@17|6F(aDGv0wF?gqYgPMRCZYMM;PUr8nog6FmHivq3jmc{L^RQLj+v zSF?*999;(svg)nn{3%|hV_J2&4Y7uf;vV(B_WJ%QzFNA|tl}dy5B&CS32|H;mu3lZ zA4M~~y<3t|69nS7@IFSCzl8A|+~Rk>AKI(7?}oPTc#iXZ^qn90HkIhkXE)xu-?!pT zT*5?qc+$f(t+R@!sgBaL!oysW-%rygc+3_pL7K8ANA;CrT+`D>$N_HzQ~gwTrV_7~ z_&FvNL>@sB32G~$T`0Hskm~wm=)+MEpUinKobmNR*U@SugrXt@jXlq^Blr5otxZ8~ zgIhYFxP(IK5K7&?N3^W=6~wY0w+oo1Xd}r@ME#I<${I0j-xZR#Die?KHkp{y>lgco zB0n-ws9jW>$V@Jo4$F6Fn3qMX2JPe*>xaN5U1+hO?`VDNM`MRj1~rxFh6mZiy54-V z(~^xXZbnRv*({Hoghnm2*BWJ_?0k;rqUjP6A literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-310.pyc index 5204cbfd8dc725ca684448707aaf4f9d6c05e553..1a6a7bf72a13a01a201c039638166e371baa92da 100644 GIT binary patch delta 6536 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 delta 4999 zcmZ`7TWlQFb?(03etXwm$6kB=THA3PCypO+oVQ;Ic{Cp=6UwsQJGR%E*>&!W<2cM> zAmJsFHuM55MF_i6A889kv1qFnP(NA(s`{X6L7Jw3T9vA(QfUhXAqqX`u1OrXcr<6u zJ?GqW?mhQBuJ`Jf$@vFKC>IR+B>20%r7HcN`cSBb-0@I*=b}w@YA)HOxn(zzs6_3m zNAt>F%_sXbzw8$@hZ@j=a!}w-HKY~EMFMxJ#afA6B5=1_s+GxQ0{5upT7_JpRmzoG zSPl!CSB+>@a+OvsSBtSvjcPS=%|lm<<6<08V_LmjFYut+pvC0^J)|~jO)@VciABLH zRX1v#a;Lz{)J7ew0^l?(8KD0 zwq4#X@Q6C7?T~k9L-LRqSE)O-UGgq%x4c{1Bkv)SvQ^o8Zjs3QXtffjQDxVpgVxXu z=NJQQ$~McV(_n$#9y%;p`#uK{tY}0IUe_a7T&|)g1sTiNncyS61BJc2NA5ua?Ykr+;Em zqE70%=pvF~Tk@FFjI>OMgx?uL-PA+9)JOdn9oJ|9pal)@4YUv~q7I1qV$kHgCRsvD z1-0xtb%}r#-|`w8M`$^%pp{@I3@Wcrj?gMv4Nr8+hB2~+191Yz}lN&2;qPSzh-h94Fa{DcC6XaMxb?q z)vz4XiaN^|i^6`(ryDt@KoHFFM~YquZO3DDrP4+wmt{jMw-&!|D@PjJfed$gI+sZ+ zI&d;&caX}2gY8D

EZL;jcY-Tv$JA-<*J`RYWqfS*eiT&eZvrSLtB=h^`0J5-h>cHI^;dX4r8{g60?)@GXF1_7 zR`rE2UIXyj;nh1=0@VYA4Dylag~hXOvvjG07B7>0+09bc?~sg*3-1yMA6k+xKQ3im z^O9LM(@CW{DPL}EGRtY{MF>};%k<6Eog)uO_eqn4meKO_9UK`;;^#(Ta=CTWtBtd>G=c{Jdm_h0J2aj9emYld+YCmwISqX`2~YCd=d;xtpNK z=Y9DqvuY-BiRc3quw?Hga%!_#veajm!jh}0l#iNZravHEBDrzE2J$s#4QM=ON=w_# zYLG$xV15HY0$Of`ZxHym!R9s?I~L7q(_y-S7&2YRGEq>1cZgPB^yX`gonnl<5WGQn zi)i$sGhb)yGGX`mm{~is+t{ycRpAaeEOr*2X zMNrX98%{d&Eyhh|v)O{XJ!j9i8s3>hW~1!bhc%0DjUn@j95CSP4Jq!asNJu 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 LhEH&=1UCKz-t++{ delta 1171 zcmZ8gNoW&M8173lj~F{$Y?`f2+9tMTTna7~H|k1VP@{NIL5S1Ni;112@y)bu0ng%s z_^WMQKoAdt6(n9fNI?%ODlT}C0TmTbUOaep`TwcbV&HxG{^h;@d;kCDMf&`9bx>6U zRrovB8STG+N4?Ix{!Mn}E^D0`P|&>&m$eYyS8Fw8c0d`fGL+NaomCnKRV`OL{+wMf zyUl!`=7p1LTayzWvP8xZB`NxKTNs(CIEUM6bGOqpEtVC!JtT#d5k24v$H3a$>dEEq=j zJ6x6rAy%a^$7hnhgOu*-J4(zI*@x^E>5PyO3jrgcZ`{DzM@xesAUl2T}W?1mjo&M@vyQ)r|bLz@n zf8L#HCX<#1Py5sHxvQmfsS$GJ+}5eCXF8@Acj8228Z%tWOE?KdM_k)WI!Q%G-ISMh z(q6{NC_d(9y_}Qt@=jjyrd#j^oB^V7?R=4!E)ZvMzsBOsdRb!@Pp;_B5bz0R18;K^ z_+gghF}`MKT4O10@L@(6nb(K3d4r`{=4HbfVObvG!$TU&@llqCFU3daO;%t7pdEXi zl#0#qun2q{V@gOO`9~( z(H^IKG8K(w4{7C`+!pI3?UraR^0}be7OpQph~3%6h&)w}i928vQwVn=+yfA%tJPYg z(F|%qz1i@qRkdAVqW=FjxeXNf`4~z|GYP&nyuI-jqO?E++Qvi~P~>FIELd?M*Td(3 zExTrid?c@#?{(SMy2kRI=wefwL;>H!Xw$Du{%XNLr^_@Lvx}mR}RHhsI+$P0s?sMgi z1;5_Xu_bwx9MOojRAD&?{2iADt@VVA$x33~npEM zhM`Qwei+1k2>weGc8B{+mi}s1!s!>_*yUN$>Vp@rDGVuh!A^C|t4O#r1{n>q} zfoZT6sA>9BhJ^il!g$5!z4?yIZ<0%7pFEbDn0OQ%-zQ=Q{a0rRjEFBbRXuciS)O>9Sc z2f_mgI}s`Xq4kJc^ZojKoeQxG1WxQw+w*E-S?mVxbo@Zm<5R8L0v8V=pP1=Y#njx?+lZwYn=FMuXVF`W$cgTs#7tP;EuUb68-RJH3IE*%OBzs`T z5!7Pcgr=yySZ&liE>iL!hvJKlA`(XmvE>$x7l->pW`$#Upn z%heVvCh)5PKNYC$Io5pL<$e|S)Z40BhB|X~vMRkc!M`wN{g(jf*=Q_BQ-qQtF>V-o zjto;%?#xYgO&TTihDGUhQ>SO?Uxq=i84>ztG)n(4V<7q6HtBD6oc?NC^cOopf3|J< zlbxhL+9~>jk)~ITjQPFst-$%hr=bU5cb!QyPh?>PX97 zrLissCyYa8A8al_4fpOYRZV!$s`^kR)XNcLw%K&m%(tz1b>X2|@tUmd^4*XZn!g3W l)NHbr*wltqXJ8kwdOb6_Hc$6r>QcD3uT!1=MUB+8zX8S`3?Kji delta 2143 zcmZuyNo*WN6z%Hnnd#}-7ti7)8*!pZa99$Yn3&+~5g3RPLZT*NGMOq*+UZ$b-4?MK zYa%&9LJ<;CMdA<%+2R1Xa4|PF39(!_bLb0)Gtx>c`!{a?T9SN-?9 z{&?cvWASDzW-9Q!vAtNmo4XkwB;ViMInp5tRjBS5^{^F|a=f>suyP?zlq3)V!`xlSLLaD-Yucjlwv}f-o-7 z7z?msQK50BvqG_?OzAX1lh<{tpQfZrp=mZiGtlB}V9KCb+6UG_5hr<~uk0r)Dj8h) zMY}?XDP9ef22-#pz6BuyPzvw?ls6)55=((>WDrFOL*k3T7)grX11EQHK&^_P1NfTj zabL3=9xwH#uX99QLbQX$jR_E|&>na+7)?NP-xD7Pr^hs=)5y5Ou#c|xG3WzKD=MIi zgB|(Bx^QloHiYTl^FnIfI*eu@vGvpyxXg9z}Q@z)zIRl}4lKRXn@daLZ-6 z0UkvATEyM`qV7q6Jn8A58@YKT?1{n?rID^S#^>t$hgDfF6#zx9_G2o!JIOGN+hEj#Kpu8 z@lAY)91{29n>QZ@(;dQJfNpJNKRjMz4R*D~51bR*63xDs(fk~Ol;j$D_)?yn6<;Pg z!|S8bIGcIsMEDtSWnwCMzT?B89(F3OYfssXTcOjl^?HTR&4*7k>ujV|sWB^faMrur zx2+p$8Ec9k_;R!Vfw9QnqdLKsEZi?9!24B=^n{Rra-&mbHCxWu1DaRLDg zpw!P}(D`ZGW4ufuZQQ;zD_QRc-6r=K^|g7s#gVjpD^As?n|6aoaf~(DEg0i@Hg}Zs zCg-Qbr>V)Y(`do6@C{yhz1*nO8DERI7pEVpF|Q1H_cahoalTy~OmFO*1xL%AnPq&g z>v|MF*W0I+V(=50E4LsJ&nKP(>t58Ezv(~9Z~3tYj*V}|Met`?#pC(+ z34?(D59FJBf+z|l3!102l|^zyxp4cux}YxvsJfuFb*f#_x%eRS4!JJ&WzQXI6Ta*b z+P6rE(hf|gX>L~Gw?LCe%}fw=@Qv_-0lG}vSV}D`iz-;&1)B!NUJ$=#zax|4v%U+W zlpF12{4i_GLPjcZP;m%o9i#q-GhNC^s$Im%y*zZOCX*@oHUU;YfD~$V$ra`fI`mG& zN^s`R9&;dREe^Q@auJ(ja(%PfD+)g#)9dSw-Cz$_(l(g<7BqK4jOKUedzn#_M7^dH zj`q@!cr(98e3joo3~@KVm4t;+*xJFnSzcg%u4T7&l`#O`s5rao%&X9fSLu>k)D@ucM88Vrd~3jNy( jB&tRs_$1sHrkd1}!~JRXaFD3?RaO04)zrUKJ^trElvLEz diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc index 91ee617a580f55d246eacdc41a0c0f672e4ae6d5..35ca6c77e8d1198cb348f5d33b66bbb17f9e2903 100644 GIT binary patch delta 788 zcmZ9KOK;Oa5XX0H$FbK=nvgg2NrEa1Xe$o9S``qgdf^6@kT0o;m&nDBvbGDQIZ@6) zvIdbDmAb*2?0whlCx&o>3+igGuO*-WK5!e?tky~=hZ;)Fi zn3#u(J?+9nWKE5Kt{8X_xY2InMPYng07-^NOjEAc&;$}`A|Ih605n27%A|07Pg#WZ zI`4`$1lj_?VX2wMRr*{e&amU=9v7qqp3EvVijsaB6WVtM>|NmsEU@o|ef1Jg#yz&G zc9lx84s2W9gx~C|deR)hPSrJ@N%SB&cZdKbHQubrJ{Ae|n5?~?%aj)m4Xt`s8k!pLRrC-y`%%6nn{j zrVgSY@De&B4ru~9hlT09@OuKHd%DQ3>MdAi8~U}*f(Yce$h}OaX}HFn_%VC0Z_Q&+ zL4jBGt-m$z^9oMrF7a)aL@P|jtI%b4aQnuse?n&^=@d^ig`~KPh7?dRR%Tmy+?ru; z@n*xW?s~gReJ@N14IO`J;Cr;d=8YCR!6i`HFWgm&LSN&--c50_0_Ho>PO3jGk%=of7+E%sTm8b^a|LM8hGW^tMQ?2#B6fr*if(nYI>0Zt9bD;5*`J U4h@;WP2vU>;c??{1xro&57j`qA^-pY delta 644 zcmZvZL2uJA6vyo(O%ppQEA855Lmg|2s)%hMG>yX$5)!BvkR~BGM4F;%F;zvH6gxpe zbIu$FNC-Xv0>2#C1zZ04`T6hn{Oq^hNvD>&E%7N-H$ssUxvx>=GK-NT zBUp*>L*&;MU#_3_@E;A|l|5re*N*kmr^XNu8!8)b0@?tq;2VW?FpI);o{55tBe3M> z$_8GOzbh}yfs%-xd};QzrX^3z5&kK^n_r!*euOZ}E~;!)eycLvlY7=H&urRY6n36W6OoPMn0Mp@yS-fniKXBZ z-UYh{=mV}O1a;1yi7-pU^Mf1moqfYw14)U?$|`i8C%eiJkL8*DNHaBghpgfYa-Zz( zt%Fnp=%rL-ywImf#&^JX9_U{*UQ-*(Y6z&sLIySnF}m&2@2|=;GLj>@jw^CX`=$v| zs`3pTU`u|aT@T7G>htM*D^yt+PsZ_3;#Yy^WXv diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-310.pyc index 38839fccc816396dc400b2e77049834b68525413..90b2895be09df0699761b24a754718395aca4320 100644 GIT binary patch delta 670 zcmZ8f&ubGw6yAw(n{KnoX4}LcMY|dr4BG5LBr*2j4^VqiEP@!2xY?LYO+6{x2 z*RE5{m>0Au{7$?=Wq3J1P>cLFX$^kOuR%dunpCuhv4tw(!)5&|(!fYvN4McY>V+HoMvCXBbAH%v^I6GR zk^TgX%t!l@c)z-Q?ZEL%VT6gpyfC08IqMAnej}p6=S&_Ew)wzE?nIS=fc Fl|PMayEFg* delta 662 zcmYjP&1(}u6yF!tZL;YmP0}XGJ+ZjC=c7* z_uXLQdc~|R6U(#7(|t-^Q`d=*a@%Q-h%yNS8W6ru$&T#=yb*IE;sfIcB(ajJ!)-iDb+t44Z)&@AEy|QolW;>qR87`lb@bDDxPx!fkCLmBh+qv* z)4!mK-=~V3?m0W=mt00bUT82WAg-vOru2zejX>mCoEuKKezWO#O?Fv^Kfy}oE6!z0 r^KylTMe(0z!|^y}p5>b2o>I>jrJn7US~9I6LADxAHZ}wP%vS#a93QmS diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/cache.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/cache.py index f1a489d..c5f0330 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/cache.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/cache.py @@ -105,9 +105,9 @@ class CacheCommand(Command): Package index page cache location: {http_cache_location} Package index page cache size: {http_cache_size} Number of HTTP files: {num_http_files} - Wheels location: {wheels_cache_location} - Wheels size: {wheels_cache_size} - Number of wheels: {package_count} + Locally built wheels location: {wheels_cache_location} + Locally built wheels size: {wheels_cache_size} + Number of locally built wheels: {package_count} """ ) .format( @@ -140,7 +140,7 @@ class CacheCommand(Command): def format_for_human(self, files: List[str]) -> None: if not files: - logger.info("Nothing cached.") + logger.info("No locally built wheels cached.") return results = [] diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/completion.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/completion.py index c0fb4ca..deaa308 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/completion.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/completion.py @@ -43,6 +43,28 @@ COMPLETION_SCRIPTS = { end complete -fa "(__fish_complete_pip)" -c {prog} """, + "powershell": """ + if ((Test-Path Function:\\TabExpansion) -and -not ` + (Test-Path Function:\\_pip_completeBackup)) {{ + Rename-Item Function:\\TabExpansion _pip_completeBackup + }} + function TabExpansion($line, $lastWord) {{ + $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart() + if ($lastBlock.StartsWith("{prog} ")) {{ + $Env:COMP_WORDS=$lastBlock + $Env:COMP_CWORD=$lastBlock.Split().Length - 1 + $Env:PIP_AUTO_COMPLETE=1 + (& {prog}).Split() + Remove-Item Env:COMP_WORDS + Remove-Item Env:COMP_CWORD + Remove-Item Env:PIP_AUTO_COMPLETE + }} + elseif (Test-Path Function:\\_pip_completeBackup) {{ + # Fall back on existing tab expansion + _pip_completeBackup $line $lastWord + }} + }} + """, } @@ -76,6 +98,14 @@ class CompletionCommand(Command): dest="shell", help="Emit completion code for fish", ) + self.cmd_opts.add_option( + "--powershell", + "-p", + action="store_const", + const="powershell", + dest="shell", + help="Emit completion code for powershell", + ) self.parser.insert_option_group(0, self.cmd_opts) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/configuration.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/configuration.py index c6c74ed..e383732 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/configuration.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/configuration.py @@ -27,11 +27,17 @@ class ConfigurationCommand(Command): - list: List the active configuration (or from the file specified) - edit: Edit the configuration file in an editor - - get: Get the value associated with name - - set: Set the name=value - - unset: Unset the value associated with name + - get: Get the value associated with command.option + - set: Set the command.option=value + - unset: Unset the value associated with command.option - debug: List the configuration files and values defined under them + Configuration keys should be dot separated command and option name, + with the special prefix "global" affecting any command. For example, + "pip config set global.index-url https://example.org/" would configure + the index url for all commands, but "pip config set download.timeout 10" + would configure a 10 second timeout only for "pip download" commands. + If none of --user, --global and --site are passed, a virtual environment configuration file is used if one is active and the file exists. Otherwise, all modifications happen to the user file by @@ -43,9 +49,9 @@ class ConfigurationCommand(Command): %prog [] list %prog [] [--editor ] edit - %prog [] get name - %prog [] set name value - %prog [] unset name + %prog [] get command.option + %prog [] set command.option value + %prog [] unset command.option %prog [] debug """ @@ -225,6 +231,10 @@ class ConfigurationCommand(Command): try: subprocess.check_call([editor, fname]) + except FileNotFoundError as e: + if not e.filename: + e.filename = editor + raise except subprocess.CalledProcessError as e: raise PipError( "Editor Subprocess exited with exit code {}".format(e.returncode) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/debug.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/debug.py index d3f1f28..6fad1fe 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/debug.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/debug.py @@ -1,3 +1,4 @@ +import importlib.resources import locale import logging import os @@ -10,7 +11,6 @@ import pip._vendor from pip._vendor.certifi import where from pip._vendor.packaging.version import parse as parse_version -from pip import __file__ as pip_location from pip._internal.cli import cmdoptions from pip._internal.cli.base_command import Command from pip._internal.cli.cmdoptions import make_target_python @@ -35,11 +35,7 @@ def show_sys_implementation() -> None: def create_vendor_txt_map() -> Dict[str, str]: - vendor_txt_path = os.path.join( - os.path.dirname(pip_location), "_vendor", "vendor.txt" - ) - - with open(vendor_txt_path) as f: + with importlib.resources.open_text("pip._vendor", "vendor.txt") as f: # Purge non version specifying lines. # Also, remove any space prefix or suffixes (including comments). lines = [ @@ -47,7 +43,7 @@ def create_vendor_txt_map() -> Dict[str, str]: ] # Transform into "module" -> version dict. - return dict(line.split("==", 1) for line in lines) # type: ignore + return dict(line.split("==", 1) for line in lines) def get_module_from_module_name(module_name: str) -> ModuleType: @@ -67,6 +63,7 @@ def get_vendor_version_from_module(module_name: str) -> Optional[str]: if not version: # Try to find version in debundled module info. + assert module.__file__ is not None env = get_environment([os.path.dirname(module.__file__)]) dist = env.get_distribution(module_name) if dist: diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/download.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/download.py index 233b7e9..26a5080 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/download.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/download.py @@ -7,7 +7,7 @@ from pip._internal.cli import cmdoptions from pip._internal.cli.cmdoptions import make_target_python from pip._internal.cli.req_command import RequirementCommand, with_cleanup from pip._internal.cli.status_codes import SUCCESS -from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.operations.build.build_tracker import get_build_tracker from pip._internal.utils.misc import ensure_dir, normalize_path, write_output from pip._internal.utils.temp_dir import TempDirectory @@ -49,6 +49,7 @@ class DownloadCommand(RequirementCommand): self.cmd_opts.add_option(cmdoptions.no_build_isolation()) self.cmd_opts.add_option(cmdoptions.use_pep517()) self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) self.cmd_opts.add_option( @@ -95,7 +96,7 @@ class DownloadCommand(RequirementCommand): ignore_requires_python=options.ignore_requires_python, ) - req_tracker = self.enter_context(get_requirement_tracker()) + build_tracker = self.enter_context(get_build_tracker()) directory = TempDirectory( delete=not options.no_clean, @@ -108,7 +109,7 @@ class DownloadCommand(RequirementCommand): preparer = self.make_requirement_preparer( temp_build_dir=directory, options=options, - req_tracker=req_tracker, + build_tracker=build_tracker, session=session, finder=finder, download_dir=options.download_dir, @@ -121,6 +122,7 @@ class DownloadCommand(RequirementCommand): finder=finder, options=options, ignore_requires_python=options.ignore_requires_python, + use_pep517=options.use_pep517, py_version_info=options.python_version, ) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/index.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/index.py index 9d8aae3..b4bf0ac 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/index.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/index.py @@ -97,7 +97,6 @@ class IndexCommand(IndexGroupCommand): link_collector=link_collector, selection_prefs=selection_prefs, target_python=target_python, - use_deprecated_html5lib="html5lib" in options.deprecated_features_enabled, ) def get_available_package_versions(self, options: Values, args: List[Any]) -> None: diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/inspect.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/inspect.py new file mode 100644 index 0000000..a4e3599 --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/inspect.py @@ -0,0 +1,97 @@ +import logging +from optparse import Values +from typing import Any, Dict, List + +from pip._vendor.packaging.markers import default_environment +from pip._vendor.rich import print_json + +from pip import __version__ +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.metadata import BaseDistribution, get_environment +from pip._internal.utils.compat import stdlib_pkgs +from pip._internal.utils.urls import path_to_url + +logger = logging.getLogger(__name__) + + +class InspectCommand(Command): + """ + Inspect the content of a Python environment and produce a report in JSON format. + """ + + ignore_require_venv = True + usage = """ + %prog [options]""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--local", + action="store_true", + default=False, + help=( + "If in a virtualenv that has global access, do not list " + "globally-installed packages." + ), + ) + self.cmd_opts.add_option( + "--user", + dest="user", + action="store_true", + default=False, + help="Only output packages installed in user-site.", + ) + self.cmd_opts.add_option(cmdoptions.list_path()) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + logger.warning( + "pip inspect is currently an experimental command. " + "The output format may change in a future release without prior warning." + ) + + cmdoptions.check_list_path_option(options) + dists = get_environment(options.path).iter_installed_distributions( + local_only=options.local, + user_only=options.user, + skip=set(stdlib_pkgs), + ) + output = { + "version": "0", + "pip_version": __version__, + "installed": [self._dist_to_dict(dist) for dist in dists], + "environment": default_environment(), + # TODO tags? scheme? + } + print_json(data=output) + return SUCCESS + + def _dist_to_dict(self, dist: BaseDistribution) -> Dict[str, Any]: + res: Dict[str, Any] = { + "metadata": dist.metadata_dict, + "metadata_location": dist.info_location, + } + # direct_url. Note that we don't have download_info (as in the installation + # report) since it is not recorded in installed metadata. + direct_url = dist.direct_url + if direct_url is not None: + res["direct_url"] = direct_url.to_dict() + else: + # Emulate direct_url for legacy editable installs. + editable_project_location = dist.editable_project_location + if editable_project_location is not None: + res["direct_url"] = { + "url": path_to_url(editable_project_location), + "dir_info": { + "editable": True, + }, + } + # installer + installer = dist.installer + if dist.installer: + res["installer"] = installer + # requested + if dist.installed_with_dist_info: + res["requested"] = dist.requested + return res diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/install.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/install.py index 34e4c2f..2990764 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/install.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/install.py @@ -1,4 +1,5 @@ import errno +import json import operator import os import shutil @@ -7,6 +8,7 @@ from optparse import SUPPRESS_HELP, Values from typing import Iterable, List, Optional from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.rich import print_json from pip._internal.cache import WheelCache from pip._internal.cli import cmdoptions @@ -21,10 +23,11 @@ from pip._internal.exceptions import CommandError, InstallationError from pip._internal.locations import get_scheme from pip._internal.metadata import get_environment from pip._internal.models.format_control import FormatControl +from pip._internal.models.installation_report import InstallationReport +from pip._internal.operations.build.build_tracker import get_build_tracker from pip._internal.operations.check import ConflictDetails, check_install_conflicts from pip._internal.req import install_given_reqs from pip._internal.req.req_install import InstallRequirement -from pip._internal.req.req_tracker import get_requirement_tracker from pip._internal.utils.compat import WINDOWS from pip._internal.utils.distutils_args import parse_distutils_args from pip._internal.utils.filesystem import test_writable_dir @@ -85,6 +88,17 @@ class InstallCommand(RequirementCommand): self.cmd_opts.add_option(cmdoptions.pre()) self.cmd_opts.add_option(cmdoptions.editable()) + self.cmd_opts.add_option( + "--dry-run", + action="store_true", + dest="dry_run", + default=False, + help=( + "Don't actually install anything, just print what would be. " + "Can be used in combination with --ignore-installed " + "to 'resolve' the requirements." + ), + ) self.cmd_opts.add_option( "-t", "--target", @@ -189,7 +203,9 @@ class InstallCommand(RequirementCommand): self.cmd_opts.add_option(cmdoptions.no_build_isolation()) self.cmd_opts.add_option(cmdoptions.use_pep517()) self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) + self.cmd_opts.add_option(cmdoptions.config_settings()) self.cmd_opts.add_option(cmdoptions.install_options()) self.cmd_opts.add_option(cmdoptions.global_options()) @@ -222,12 +238,12 @@ class InstallCommand(RequirementCommand): default=True, help="Do not warn about broken dependencies", ) - self.cmd_opts.add_option(cmdoptions.no_binary()) self.cmd_opts.add_option(cmdoptions.only_binary()) self.cmd_opts.add_option(cmdoptions.prefer_binary()) self.cmd_opts.add_option(cmdoptions.require_hashes()) self.cmd_opts.add_option(cmdoptions.progress_bar()) + self.cmd_opts.add_option(cmdoptions.root_user_action()) index_opts = cmdoptions.make_option_group( cmdoptions.index_group, @@ -237,6 +253,20 @@ class InstallCommand(RequirementCommand): self.parser.insert_option_group(0, index_opts) self.parser.insert_option_group(0, self.cmd_opts) + self.cmd_opts.add_option( + "--report", + dest="json_report_file", + metavar="file", + default=None, + help=( + "Generate a JSON file describing what pip did to install " + "the provided requirements. " + "Can be used in combination with --dry-run and --ignore-installed " + "to 'resolve' the requirements. " + "When - is used as file name it writes to stdout." + ), + ) + @with_cleanup def run(self, options: Values, args: List[str]) -> int: if options.use_user_site and options.target_dir is not None: @@ -293,7 +323,7 @@ class InstallCommand(RequirementCommand): ) wheel_cache = WheelCache(options.cache_dir, options.format_control) - req_tracker = self.enter_context(get_requirement_tracker()) + build_tracker = self.enter_context(get_build_tracker()) directory = TempDirectory( delete=not options.no_clean, @@ -315,7 +345,7 @@ class InstallCommand(RequirementCommand): preparer = self.make_requirement_preparer( temp_build_dir=directory, options=options, - req_tracker=req_tracker, + build_tracker=build_tracker, session=session, finder=finder, use_user_site=options.use_user_site, @@ -340,6 +370,32 @@ class InstallCommand(RequirementCommand): reqs, check_supported_wheels=not options.target_dir ) + if options.json_report_file: + logger.warning( + "--report is currently an experimental option. " + "The output format may change in a future release " + "without prior warning." + ) + + report = InstallationReport(requirement_set.requirements_to_install) + if options.json_report_file == "-": + print_json(data=report.to_dict()) + else: + with open(options.json_report_file, "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + if options.dry_run: + would_install_items = sorted( + (r.metadata["name"], r.metadata["version"]) + for r in requirement_set.requirements_to_install + ) + if would_install_items: + write_output( + "Would install %s", + " ".join("-".join(item) for item in would_install_items), + ) + return SUCCESS + try: pip_req = requirement_set.get_requirement("pip") except KeyError: @@ -464,8 +520,8 @@ class InstallCommand(RequirementCommand): self._handle_target_dir( options.target_dir, target_temp_dir, options.upgrade ) - - warn_if_run_as_root() + if options.root_user_action == "warn": + warn_if_run_as_root() return SUCCESS def _handle_target_dir( diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/list.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/list.py index 57f05e0..a9b08a0 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/list.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/list.py @@ -1,7 +1,7 @@ import json import logging from optparse import Values -from typing import TYPE_CHECKING, Iterator, List, Optional, Sequence, Tuple, cast +from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast from pip._vendor.packaging.utils import canonicalize_name @@ -149,7 +149,6 @@ class ListCommand(IndexGroupCommand): return PackageFinder.create( link_collector=link_collector, selection_prefs=selection_prefs, - use_deprecated_html5lib="html5lib" in options.deprecated_features_enabled, ) def run(self, options: Values, args: List[str]) -> int: @@ -222,7 +221,7 @@ class ListCommand(IndexGroupCommand): def iter_packages_latest_infos( self, packages: "_ProcessedDists", options: Values - ) -> Iterator["_DistWithLatestInfo"]: + ) -> Generator["_DistWithLatestInfo", None, None]: with self._build_session(options) as session: finder = self._build_package_finder(options, session) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/show.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/show.py index d5540d6..212167c 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/show.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/show.py @@ -1,6 +1,6 @@ import logging from optparse import Values -from typing import Iterator, List, NamedTuple, Optional +from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional from pip._vendor.packaging.utils import canonicalize_name @@ -60,6 +60,7 @@ class _PackageInfo(NamedTuple): classifiers: List[str] summary: str homepage: str + project_urls: List[str] author: str author_email: str license: str @@ -67,7 +68,7 @@ class _PackageInfo(NamedTuple): files: Optional[List[str]] -def search_packages_info(query: List[str]) -> Iterator[_PackageInfo]: +def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None]: """ Gather details from installed distributions. Print distribution name, version, location, and installed files. Installed files requires a @@ -76,7 +77,7 @@ def search_packages_info(query: List[str]) -> Iterator[_PackageInfo]: """ env = get_default_environment() - installed = {dist.canonical_name: dist for dist in env.iter_distributions()} + installed = {dist.canonical_name: dist for dist in env.iter_all_distributions()} query_names = [canonicalize_name(name) for name in query] missing = sorted( [name for name, pkg in zip(query, query_names) if pkg not in installed] @@ -126,6 +127,7 @@ def search_packages_info(query: List[str]) -> Iterator[_PackageInfo]: classifiers=metadata.get_all("Classifier", []), summary=metadata.get("Summary", ""), homepage=metadata.get("Home-page", ""), + project_urls=metadata.get_all("Project-URL", []), author=metadata.get("Author", ""), author_email=metadata.get("Author-email", ""), license=metadata.get("License", ""), @@ -135,7 +137,7 @@ def search_packages_info(query: List[str]) -> Iterator[_PackageInfo]: def print_results( - distributions: Iterator[_PackageInfo], + distributions: Iterable[_PackageInfo], list_files: bool, verbose: bool, ) -> bool: @@ -168,6 +170,9 @@ def print_results( write_output("Entry-points:") for entry in dist.entry_points: write_output(" %s", entry.strip()) + write_output("Project-URLs:") + for project_url in dist.project_urls: + write_output(" %s", project_url) if list_files: write_output("Files:") if dist.files is None: diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/uninstall.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/uninstall.py index bb9e8e6..dea8077 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/uninstall.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/uninstall.py @@ -4,6 +4,7 @@ from typing import List from pip._vendor.packaging.utils import canonicalize_name +from pip._internal.cli import cmdoptions from pip._internal.cli.base_command import Command from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root from pip._internal.cli.status_codes import SUCCESS @@ -53,7 +54,7 @@ class UninstallCommand(Command, SessionCommandMixin): action="store_true", help="Don't ask for confirmation of uninstall deletions.", ) - + self.cmd_opts.add_option(cmdoptions.root_user_action()) self.parser.insert_option_group(0, self.cmd_opts) def run(self, options: Values, args: List[str]) -> int: @@ -100,6 +101,6 @@ class UninstallCommand(Command, SessionCommandMixin): ) if uninstall_pathset: uninstall_pathset.commit() - - warn_if_run_as_root() + if options.root_user_action == "warn": + warn_if_run_as_root() return SUCCESS diff --git a/sbsheriff/Lib/site-packages/pip/_internal/commands/wheel.py b/sbsheriff/Lib/site-packages/pip/_internal/commands/wheel.py index d5b20dc..9dd6c82 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/commands/wheel.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/commands/wheel.py @@ -9,8 +9,8 @@ from pip._internal.cli import cmdoptions from pip._internal.cli.req_command import RequirementCommand, with_cleanup from pip._internal.cli.status_codes import SUCCESS from pip._internal.exceptions import CommandError +from pip._internal.operations.build.build_tracker import get_build_tracker from pip._internal.req.req_install import InstallRequirement -from pip._internal.req.req_tracker import get_requirement_tracker from pip._internal.utils.misc import ensure_dir, normalize_path from pip._internal.utils.temp_dir import TempDirectory from pip._internal.wheel_builder import build, should_build_for_wheel_command @@ -26,10 +26,8 @@ class WheelCommand(RequirementCommand): recompiling your software during every install. For more details, see the wheel docs: https://wheel.readthedocs.io/en/latest/ - Requirements: setuptools>=0.8, and wheel. - - 'pip wheel' uses the bdist_wheel setuptools extension from the wheel - package to build individual wheels. + 'pip wheel' uses the build system interface as described here: + https://pip.pypa.io/en/stable/reference/build-system/ """ @@ -59,6 +57,7 @@ class WheelCommand(RequirementCommand): self.cmd_opts.add_option(cmdoptions.no_build_isolation()) self.cmd_opts.add_option(cmdoptions.use_pep517()) self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) self.cmd_opts.add_option(cmdoptions.constraints()) self.cmd_opts.add_option(cmdoptions.editable()) self.cmd_opts.add_option(cmdoptions.requirements()) @@ -75,6 +74,7 @@ class WheelCommand(RequirementCommand): help="Don't verify if built wheel is valid.", ) + self.cmd_opts.add_option(cmdoptions.config_settings()) self.cmd_opts.add_option(cmdoptions.build_options()) self.cmd_opts.add_option(cmdoptions.global_options()) @@ -110,7 +110,7 @@ class WheelCommand(RequirementCommand): options.wheel_dir = normalize_path(options.wheel_dir) ensure_dir(options.wheel_dir) - req_tracker = self.enter_context(get_requirement_tracker()) + build_tracker = self.enter_context(get_build_tracker()) directory = TempDirectory( delete=not options.no_clean, @@ -123,7 +123,7 @@ class WheelCommand(RequirementCommand): preparer = self.make_requirement_preparer( temp_build_dir=directory, options=options, - req_tracker=req_tracker, + build_tracker=build_tracker, session=session, finder=finder, download_dir=options.wheel_dir, diff --git a/sbsheriff/Lib/site-packages/pip/_internal/configuration.py b/sbsheriff/Lib/site-packages/pip/_internal/configuration.py index a8092d1..8fd46c9 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/configuration.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/configuration.py @@ -142,13 +142,19 @@ class Configuration: def get_value(self, key: str) -> Any: """Get a value from the configuration.""" + orig_key = key + key = _normalize_name(key) try: return self._dictionary[key] except KeyError: - raise ConfigurationError(f"No such key - {key}") + # disassembling triggers a more useful error message than simply + # "No such key" in the case that the key isn't in the form command.option + _disassemble_key(key) + raise ConfigurationError(f"No such key - {orig_key}") def set_value(self, key: str, value: Any) -> None: """Modify a value in the configuration.""" + key = _normalize_name(key) self._ensure_have_load_only() assert self.load_only @@ -167,11 +173,13 @@ class Configuration: def unset_value(self, key: str) -> None: """Unset a value in the configuration.""" + orig_key = key + key = _normalize_name(key) self._ensure_have_load_only() assert self.load_only if key not in self._config[self.load_only]: - raise ConfigurationError(f"No such key - {key}") + raise ConfigurationError(f"No such key - {orig_key}") fname, parser = self._get_parser_to_modify() diff --git a/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc index 9d40144a94fd617d7b40c8b345980636815597f6..62f1b4804d26b47e24089862a001eb73957b37b1 100644 GIT binary patch delta 20 acmZ3$wt$U0pO=@50SHPD%WvcsWd;B(CIl7$ delta 20 acmZ3$wt$U0pO=@50SKzqB{y=5G6Mi9iUWE8 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-310.pyc index a7f20e66efb621bf422d021f5077750a53ad905b..d854ae9d7cbf9fff4ede7f8a4c493553fea5a180 100644 GIT binary patch delta 203 zcmX@e_kfQ#pO=@50SHPD%O@Y5$h(t^6T}08;<$+y++?{^xl@=^SkgFBcv5&ofjiR=6dQoRONG9iLR1nUfNql3Gxl%mOh2OtMV2W|bCVDdGn5 zibOz!D2Nc7oXl#?$Ub>K>kLNm$rfw|7IHvg4h9xRF@6>n0Y(;PCPpSErhiP#On;eJ knEo)aiu^8O1uD^Gyv3QDT9TNYlUQ7=$yp>bc@EoB0M=tH7ytkO delta 182 zcmaFBcaV=apO=@50SKzqC6lL2u=HFpBZBum~`+Ff%a%;eRk@68Tre3Y6Alyv3QDT9TNYlUQ7= M$yp>lc{kfq0CF-USpWb4 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc index 8ffe43b25d0984392c16eb454e7e40c61431ebd3..7502080eb5ae090a70c3b65ea45160a69075cb1d 100644 GIT binary patch delta 174 zcmcb_`H_=1pO=@50SHPD%O~HQ$h(e<1ITdz;$n-5N7cmHQ`u9PQaI8$QaDq%T3Dhu zQaFMcG`TnaV`5UgC6Jtvnw%YAhR`@i#UN)5if|~n;gPy&B#1? s0&^83|K$BF;z~uVKyi?*#Uen0gMo#SkBx~1Xvu#tX5#xd*@I;z0Ij+kga7~l diff --git a/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc index 61bfa792e668dd348c69d456ed869b089c8becfa..9c9b669c8cc996dbf5abc604a08d3de8415316e6 100644 GIT binary patch delta 1583 zcmZ`(&2Jk;6rY)0@2+>(>+dv9lh`RO!KDc;1%xV~36ZD>Q6$tJAVOG45`?!`wI^=gy%hmvZLbGui|H1(yO1@2wrh6tU9${N9^+-|zYNOAi;lZYpIH z`1-$=8=sbb_CBJv1?&nO|FP=P7Y|Kga>lJ4izm7LP~Wn6LKv|`=MHy4lH^R-!YPp* z##7t_i8~=l^9)E*6IxlG1Bu7;!r=vx78&6PXNQ$YiNtmdUgT5oBFis`^fVeCyPM`E z5a+mcmsDp?@=T+&sxD~rG^5_oqU9*l*b|NY+IGL$<~1&Q{$@jmM9#h>5Xi5=@qbX) z^l42Gb#+I-eAr^$g-{zL!i0P;BrVc121aOb(x?9NI(a~2nK`sV<4w0~_qZ15vGji&Icu1u-> zx;)JFzU;|vOEiL-6rc5*QutAFl#A$m9_2>Kjjs+wC-9?8P1c*fs5QEsop!SUlKfb5 z(DeOgXBREOvz`>ax)iko5!87-s8^FR4MmW7gaSg5Y!DK8{$95awQKs_c0CYV*)czI zjTM!%@H%qN9D<9;9Q%?PG!#QtEhiRVx(vK+x|&XH&9-djGM!q~g~OE1eO8b-YdMcs#mPd{f^IF2QI_FOJu;V;&hv|HzJN9{ zpvfqaEdksZeo)v4S^6bMc#J`z%6R!cm z>41f-g?mFe8?rzP^dJ$^BYMP+Dc8PZ11&H@?T9|0RekfTRrO)&>LHADWjuVhDqoMO z!Loc8ELNGk13$6vswv+``aF+iWM4rz&qyDYG#-+5y!rs)xvVN6`yP((5|Sc}F__~i zYMfe{dgM+OM(a4aeAT?Vo4$FNLtB_~q;Ge-ZFvQGoIQzki8Mcuqh`l#$7V?l0V_3X zdj+ZUXksdhG6%qe<6|lo(Wz%J4I+C6_&3wpUo2sl{>&}rW^z`}W_d>0sRxHK``JwP XB%fil49idC%Lr)gKW@}(*{lBmAN5yj delta 1058 zcmZ8gO=}ZD7~YxPY&N^eCfOvlDQ#n8ZAj@?C}>5kN@KO;C$kHJnwlO1G{~(j+4zk|bPKibKNb%wvSmdtOqRKDPY3|}z>aNOtZ8CMJgM%n#g~eoSG0bc} z6k_~)$Wb+x;6FoSQI?dR9yq+L7aUujO)aWw$W%?k#5V4{)4!kxzze7Kvc;Mk)D0?( zK5f?-^;rlUk+pWcK`PXHCen4!52}sEX~Y)w0$(`pI(0V(IDTN9aYUlRs&$`M+@@D+ z)ZM`6AB|Zn0bQj5Cit8_lJ4sg$YBYkPCBxHbm)ua`EB#=1SAQawLOnA5nijho75u% z10I><=nnsC5;V^*Tcu1d87jcLU<&{x{@Oa9Sp;+NRx!$B(NR?9-z=eT4+rb?EdLZu z^P_0a$jR`cDfK;$t~^|V+zSACfJuNUfO8UxA@+ATVfJK`TKa4jBIW=FuVo{Wd)#Tq zatLknH+E$S{6$sZxdjpVBQ_;Me_r(hIxw${6Ok)Vs7GJ4*zz`?iLYK=2GSzbcUip^ z)SF&0B=lO7ZB+x-m7^#F*bD&t8>j6;8oS0n$MgSx3z)3Mf5dO#qQkx9;$8|u4GBV9 zYc?Bf49@Vy7zR@H1J+Zgs}oGe;7v1l+&!KC3DC71a99$cKYv<+p=ij~v5FD?)!o=U mak9>cV>qUbQ$X3^!uCn$l7mt17L+IeK%G8?dl&H4)bwvkt=_x< diff --git a/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc index 1cb76f5353a9c580d8adaf5f1a707e4713e1c502..15eb59a896f38b31ee22925addd41d200e3f43d3 100644 GIT binary patch delta 195 zcmX@e^MHpppO=@50SHPD%P03NOR|`uN zM+!$UgC_Up0LHIO0k;H_Gg6bY^Vfw?w%J+M67VC8Y#RerF delta 144 zcmaFBbC8EOpO=@50SKzqC6l8U@-lL<0XYspTx>E~oKa1fDTO_aErlb6vxOy!BZWPf zL6d892;)~Ke!pa9peh((o}9%Z%gbEE3lu040ujQK4cUYzuVK+(WS)GLrHoNzvJb1G dga}ZIgMo#SkClmwiIM3)7&Gzxo7~BI9RMCh8WjKl diff --git a/sbsheriff/Lib/site-packages/pip/_internal/distributions/base.py b/sbsheriff/Lib/site-packages/pip/_internal/distributions/base.py index 149fff5..75ce2dc 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/distributions/base.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/distributions/base.py @@ -31,6 +31,9 @@ class AbstractDistribution(metaclass=abc.ABCMeta): @abc.abstractmethod def prepare_distribution_metadata( - self, finder: PackageFinder, build_isolation: bool + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, ) -> None: raise NotImplementedError() diff --git a/sbsheriff/Lib/site-packages/pip/_internal/distributions/installed.py b/sbsheriff/Lib/site-packages/pip/_internal/distributions/installed.py index be5962f..edb38aa 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/distributions/installed.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/distributions/installed.py @@ -15,6 +15,9 @@ class InstalledDistribution(AbstractDistribution): return self.req.satisfied_by def prepare_distribution_metadata( - self, finder: PackageFinder, build_isolation: bool + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, ) -> None: pass diff --git a/sbsheriff/Lib/site-packages/pip/_internal/distributions/sdist.py b/sbsheriff/Lib/site-packages/pip/_internal/distributions/sdist.py index bdaf403..4c25647 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/distributions/sdist.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/distributions/sdist.py @@ -22,7 +22,10 @@ class SourceDistribution(AbstractDistribution): return self.req.get_dist() def prepare_distribution_metadata( - self, finder: PackageFinder, build_isolation: bool + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, ) -> None: # Load pyproject.toml, to determine whether PEP 517 is to be used self.req.load_pyproject_toml() @@ -43,7 +46,18 @@ class SourceDistribution(AbstractDistribution): self.req.isolated_editable_sanity_check() # Install the dynamic build requirements. self._install_build_reqs(finder) - + # Check if the current environment provides build dependencies + should_check_deps = self.req.use_pep517 and check_build_deps + if should_check_deps: + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + conflicting, missing = self.req.build_env.check_requirements( + pyproject_requires + ) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + if missing: + self._raise_missing_reqs(missing) self.req.prepare_metadata() def _prepare_build_backend(self, finder: PackageFinder) -> None: @@ -125,3 +139,12 @@ class SourceDistribution(AbstractDistribution): ), ) raise InstallationError(error_message) + + def _raise_missing_reqs(self, missing: Set[str]) -> None: + format_string = ( + "Some build dependencies for {requirement} are missing: {missing}." + ) + error_message = format_string.format( + requirement=self.req, missing=", ".join(map(repr, sorted(missing))) + ) + raise InstallationError(error_message) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/distributions/wheel.py b/sbsheriff/Lib/site-packages/pip/_internal/distributions/wheel.py index 340b0f3..03aac77 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/distributions/wheel.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/distributions/wheel.py @@ -26,6 +26,9 @@ class WheelDistribution(AbstractDistribution): return get_wheel_distribution(wheel, canonicalize_name(self.req.name)) def prepare_distribution_metadata( - self, finder: PackageFinder, build_isolation: bool + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, ) -> None: pass diff --git a/sbsheriff/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc index fdee81ae9df799f9d7ac29aba9eacbd766081cb0..cf282410ba99b96285bcfd9eac650d37c33e1d16 100644 GIT binary patch delta 19 ZcmaFN_?VG9pO=@50SHPD%TMIK0RS>J1u_5t delta 19 ZcmaFN_?VG9pO=@50SKzqB`0#<001vF1eO2* diff --git a/sbsheriff/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-310.pyc index 19e0b61f204e84fdba12f4c0c5b21c7411ab043b..30d5ee428215216fad90042500b3621a160e6b4d 100644 GIT binary patch delta 8027 zcma($TW}o5aXWjvdwYlD;XynI0w9*)13Zv8zTY4T5&$0(1yKYjQYTu={P{7vQ&{bPAZjD9673#qg1(E zp+qU&vxleRIAC3G&rEkuPft&G&+yhw@~6*}cwxzsr~-fEZ?|X8K6oqM+W2HhQK*tq zD50uDQbc~$TSpW7O^HTQ5&4a#s^m9T`7TMtp&fFnb2X_Ng6x`8o2yIJNnCesy}qWL zYfH7|R-{(QF2iZhSt(26VP|EoBh?{s(^-{Uom!n+lUgI&5oc|#Gu0{asIxAYNF^j* z<#grNr`Ah6=4{Ayr@AG+#7X8hrZ!4E?rh3!PHmQWwNu`b+nU;%+m_lUJ8GQmxgDt; zfY;JGXJ>9#YFBP|YIkl=Y7bFZJ^vF}!%}ByZf|NYQSvJ5N$q9fseNq!G)Wy`@v+{q zgJXwMeXN=Fv;GmaSxF7hde%=HSPScKRz@`1NSm%}sl!JUx{NkoSIV@R9k~`t9i_`z z2W_A#khIWNAUOskZFI$Tg|3hk_enwRtXonU)S@ea>i)T2)-htx4!R0@kJHs`VBVx_ z=vwG~fObk%`eBZBGyy$>v^>|)JJvN&#;l?FHUm5cMdu z`so0)23QS9IvY{x!}Ksq&?9UGsCERmgB}GH8|blS1#q->*`)W;`>*S%FGY^i({d9Y zkgI(ZRy#-^gptQ)1+@cnH!`vo+6$@}^aOnfC~TPeBprgOhuCtM`W&=}=_zQR0>#o) z9a0i!CLW9qk1{Kl&gQM+I4>4lW)()ne};ZU$enkzcL`|`FBzRRE8*z*hMO5>Id)s& z>%`w0rG`Dw>Efx3>MMvz)F(B!)VFy zsrsCHmvbgorHe%;n@M}wLVn}rJWUp_7PCoLYLmRYc|8){{XdAx z45`N4LVhq2_QRtrO&NFn&;{o4)o8pm2+(+bxU!YLkz?LyfhIzHHxAQr>jO9hy|ev#=dG`$GNhMSsj&O-naCdbpj z`w?^s9!qSTQw811ub;m#UfJ~#7;$3&8cp#xF)L~Uit4&o#IIx9%TwkBg=(*oX+m{s zyrR@2A&M8Re6=Z^nx0Wou91>DRy7r-5gMIVr$a<3;eoD7KcXti!Ayp^ zu9ePLTu{2-j3UXJW-TLnIkLA1t~EtNI{|8>&*0<%W4 z4oiw7@%y{ytai@Ij#ydG%DPs*;8{n9A2^P3X1pJ#7PsRs?3~{LlLkj&!;E~X2_A?q zoQL7+#C;R$1`9l^2h26m_5X10z1F3Do06L+YG=@!G=jA{2YgP%dkIA4YUnE8V; zNWq_UCNxn=;jI)R(`ER2%2*J)piN1$Qi5Ws2VfA#FropChR!tv?gtK}i&tuT&!ZJ4 zW`ed1KYlnfn&vL^1{1okGe{VYAI^c7f%W|G0~I8K%PgjOI>&c{2(SyP>ysRR1itgF zBHC-)oBt9z-8g`l8iiFxi3Vu|l87ya>c3TUZZS)3Lvzhr$O0~|)a#tVN1Uy1R(V>S zYIuzt5O*7_9dr>JG~q;M9G1@8=)m?kcR)vP^v5s~h>G%2aia0ZRlbq{6#1E0*VIm$ z#nGnKaef+l5@G%T4rIj>O?#^5ZLj!YQ+?atqo_Innr6TzMm0@cPU5hsQI%i5^Kp|- zNLKu2*;;a0tY}`D39>2p!MNk`EQ*z~=ShV=zpA3Nlg(fJ7$-0R#7t9-lX}9RK$2?a zKtj%YcG?3$=Uv}KZ^jjhmz#fL_}VCEBf?pJ>M`_P$-|E#b_}`0KqtMq9$FCAN;oo! z;P()e5lB@d#j6lMvO-meIMC8To)PC;E?38n`;T-@5 z6A`{B6KxW|Xj_?>6CyFxf!_eI91g48I#Y>~I;}1w&b2g_br|V|pNle?0@oKMrQ$t> zhFFMcvZU0g4y7if12~sqKY9Ys-*K?K8?0bfrHl$PX8sU|8G~?ubq!U96prf;4D^D; zaMqwLZ3QdNq#eh$;r0@o35|%F_ND=2@mj;ki2lM~niVm(a=GXiVPGxF!P!k%znE-a z9>pRJ!<2hMOt&{2^5hb4C?hi8U5{NO&k;|V(w|iz1BR(dH7_(nbAybinCFlRi!sb| z6aH7No&`=O`mMo*9bdOjm2sg9!X?@U^;n9!VC?afXCY*ck!$d;VyT3RF7A5L&I!W5 z4rK6o89wuj7Ji&VE@FJkjLqWeL>DGkuq9>|JDaCvcEzq#LCGGc07iEACo6n&yZGA` zTme&pate<;OFW3-fs&qzD$iFq#Ggmy(BJqs0D!jWwzuolKCc>@646PuV&R<17SVvjm=UpiCyE~{hse2JG>Q#-!rj~&4cuAXv3@R}c8J;F3T?#U@Fd2>9)E|a3 zd8tX>8mf^F92ttZv6|vp8l4Q6jHy~^=~Hzj;GKqo4{0XNk}gVwc^ zQLmvCEt#bVt-2YStSVJW&C8cAm8#?K2+7=p#-D_7{uF|z5xfRq zLLc`=x_5yi%x05BV{oBcjWl?FfI?c@f+YWs${iA{AB;L8!r8HZ0$$gXMGXU+}dN#;9*l25lzunIDD>GFsp+e+F2gyu$;+4}x=n zE;Q|>fd`iFn=?g1kn0R6XI#el?U_jfVMZW~e;K>w!ID5ad6i_bF-f`y(5;UGk@{rR zz#^vx${e^WlV}L9teUFT5>>5}l@D~1=qFlOys);t{2kyy-(K*y1X{iDlM?5$Mk)la z0ddG2;Kod+Iy0CKF9HB*m|-xDjKpY^R>7-)Nlm6hIE~RIkXs@&0>QLep00`QCs`3{ z5-2BJtI&{VvsJpa4hniKED~ZvXUnM#pujwHJdaHbvx6Co@iTvjtMKcCpGl?CS?8|l_ZrfC36!a`7IIN@CF=}^J$m)B%RQM<6vUpkHscOA-n(p4plbeL4c5z-uJNk zuMo(xa*;W!N8thpr8!i2-1E{GUKZ8erJb{sGeVHx*YfEc^L2P38E1>Oh5t1WOo_L; zljVgL=ikMdrJ3cLO>E*};?n9rKn!{LE(CMR%{>*p0Ru0f(b1pK=#Bc?aMI-1FN1(@ zaF)i1rr}G7C?v05l(FGWBzOzKoLCtpnxM#(i=KBi9D!@q>o^OZ9#c0UTJX049hT{R zL7f+ZZY;*+`C2O;+E`zPB1Ycv;E0XE+Z0uA>TtS4gYr@fcdDV7M?-Lvl|c?)aEwp*J9j?XIIfabk=`<- z^KSu(`2Lnx$oIwRt^3LrK0p@o&Q;4DFBS{jgFAWU-XI^j;AYO5^*e6;m`mV2<9EM% z1&5DFBRyaY5dKd@JAizzM4`%X-Gl*|kfXdC~wTR*EQF^GaW%DBiUJY%( z8Vr$V8GOh?h05Fy4`*|%Fz)epkX~vW4U$klcHr*$(aRav4&G{cCw34!xL}^ZMu=U> zaOstcHnq-1Ph7C4KR{o+3|uB`sY=Aj?QN^{7$mG3$Yi*=s%qTRTI0Wzcu0f3_+710 ze0BR~@~(Jid-=?wa~K0z!I{I#)~~khbRM3K+V9m_)mdSg%~RjMO3N5+wV{B zd}GHALOR5%U0ZilBK8L;8?6BDD`Sqdi0oY?5o18jov-Zr8QCm(iH!D8^{dHE!JaQ< z@FP7JSe{)e^8M??i+gs}y@yl1k5j3^JKzW6pZ4rzr?Fd(H2~%t83+j;<9~;QrXR{U zZb1Drr1KG=jDQ36^y64Fz=gqaVAH|>7OKJj8EBS?(%uVQ^Or0q{9lrkl)GCj>3Qw! zyEu(BP36M;uh_9rx*s3G7qQvrseNd2_$hI1q7`ebz8STW3kdJ%`*slWq3GFf-H-k_ zcss<~XXf*3vfzp=gU`GLp1qLG-&Xn0Vbl-7Z3yrWky7rK)CMCX{|5la#OwRVw*3;Y zL}-}*JA4QEf8gM+5PXbaA;S=;%Kr=c#ZUAGkvg!i3&St$kDQITi&q=%!5dztkSp%D z#hVA7Apa=#^;+Zu@mTL#@}Br|Z|9~Q&XPy47J)p@a*NR;gKJi$D)~3;_)z@3cZ(&p zlKSCV{OZbP+HPT-!>eqcNFKD?7o7^3of=UF`VHSCzIm|aQQT~J&*25QVtQA(i6c7^ z$o;NIOeU}A5c>s!HUv^PxIxU{-Z@L5D~46kaj3r^(coR+&jCxE4|3#h0QZ;3_q}B0 zd5@=%@(&S6i~KQSpCb5?c=6Ep#86)osSy|Z))=+eStnlXTS1nJ@AkEmdhvc=CutD( z`c{!fv9f<9X%c&Z6pe*e}o+QhFuS$R=D8vJJk@50{5z?BRuV)P7x?;#W*WAQ_X$T^w^QX2Tu<49UL0q7jgJ&2rw1~&uGsec0*ClDf~r5Uq$d81ad>(Kzkgpsq^n zJKTOySL>IN_{N%6wOzXhq4@JC)PRtC@2Oh!Q?*L_9Q))?jee%agEqb|8_=%luhahr D3HIF>g1Bt)0wtT(@a|b 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 l!DNcgnZ^)QC|PKtNNy+hpE#%%cS||h%jt Optional[str]: return None -class _NotHTML(Exception): +class _NotAPIContent(Exception): def __init__(self, content_type: str, request_desc: str) -> None: super().__init__(content_type, request_desc) self.content_type = content_type self.request_desc = request_desc -def _ensure_html_header(response: Response) -> None: - """Check the Content-Type header to ensure the response contains HTML. - - Raises `_NotHTML` if the content type is not text/html. +def _ensure_api_header(response: Response) -> None: """ - content_type = response.headers.get("Content-Type", "") - if not content_type.lower().startswith("text/html"): - raise _NotHTML(content_type, response.request.method) + Check the Content-Type header to ensure the response contains a Simple + API Response. + + Raises `_NotAPIContent` if the content type is not a valid content-type. + """ + content_type = response.headers.get("Content-Type", "Unknown") + + content_type_l = content_type.lower() + if content_type_l.startswith( + ( + "text/html", + "application/vnd.pypi.simple.v1+html", + "application/vnd.pypi.simple.v1+json", + ) + ): + return + + raise _NotAPIContent(content_type, response.request.method) class _NotHTTP(Exception): pass -def _ensure_html_response(url: str, session: PipSession) -> None: - """Send a HEAD request to the URL, and ensure the response contains HTML. +def _ensure_api_response(url: str, session: PipSession) -> None: + """ + Send a HEAD request to the URL, and ensure the response contains a simple + API Response. Raises `_NotHTTP` if the URL is not available for a HEAD request, or - `_NotHTML` if the content type is not text/html. + `_NotAPIContent` if the content type is not a valid content type. """ scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url) if scheme not in {"http", "https"}: @@ -99,31 +114,37 @@ def _ensure_html_response(url: str, session: PipSession) -> None: resp = session.head(url, allow_redirects=True) raise_for_status(resp) - _ensure_html_header(resp) + _ensure_api_header(resp) -def _get_html_response(url: str, session: PipSession) -> Response: - """Access an HTML page with GET, and return the response. +def _get_simple_response(url: str, session: PipSession) -> Response: + """Access an Simple API response with GET, and return the response. This consists of three parts: 1. If the URL looks suspiciously like an archive, send a HEAD first to - check the Content-Type is HTML, to avoid downloading a large file. - Raise `_NotHTTP` if the content type cannot be determined, or - `_NotHTML` if it is not HTML. + check the Content-Type is HTML or Simple API, to avoid downloading a + large file. Raise `_NotHTTP` if the content type cannot be determined, or + `_NotAPIContent` if it is not HTML or a Simple API. 2. Actually perform the request. Raise HTTP exceptions on network failures. - 3. Check the Content-Type header to make sure we got HTML, and raise - `_NotHTML` otherwise. + 3. Check the Content-Type header to make sure we got a Simple API response, + and raise `_NotAPIContent` otherwise. """ if is_archive_file(Link(url).filename): - _ensure_html_response(url, session=session) + _ensure_api_response(url, session=session) logger.debug("Getting page %s", redact_auth_from_url(url)) resp = session.get( url, headers={ - "Accept": "text/html", + "Accept": ", ".join( + [ + "application/vnd.pypi.simple.v1+json", + "application/vnd.pypi.simple.v1+html; q=0.1", + "text/html; q=0.01", + ] + ), # We don't want to blindly returned cached data for # /simple/, because authors generally expecting that # twine upload && pip install will function, but if @@ -145,9 +166,16 @@ def _get_html_response(url: str, session: PipSession) -> Response: # The check for archives above only works if the url ends with # something that looks like an archive. However that is not a # requirement of an url. Unless we issue a HEAD request on every - # url we cannot know ahead of time for sure if something is HTML - # or not. However we can check after we've downloaded it. - _ensure_html_header(resp) + # url we cannot know ahead of time for sure if something is a + # Simple API response or not. However we can check after we've + # downloaded it. + _ensure_api_header(resp) + + logger.debug( + "Fetched page %s as %s", + redact_auth_from_url(url), + resp.headers.get("Content-Type", "Unknown"), + ) return resp @@ -155,33 +183,14 @@ def _get_html_response(url: str, session: PipSession) -> Response: def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]: """Determine if we have any encoding information in our headers.""" if headers and "Content-Type" in headers: - content_type, params = cgi.parse_header(headers["Content-Type"]) - if "charset" in params: - return params["charset"] + m = email.message.Message() + m["content-type"] = headers["Content-Type"] + charset = m.get_param("charset") + if charset: + return str(charset) return None -def _determine_base_url(document: HTMLElement, page_url: str) -> str: - """Determine the HTML document's base URL. - - This looks for a ```` tag in the HTML document. If present, its href - attribute denotes the base URL of anchor tags in the document. If there is - no such tag (or if it does not have a valid href attribute), the HTML - file's URL is used as the base URL. - - :param document: An HTML document representation. The current - implementation expects the result of ``html5lib.parse()``. - :param page_url: The URL of the HTML document. - - TODO: Remove when `html5lib` is dropped. - """ - for base in document.findall(".//base"): - href = base.get("href") - if href is not None: - return href - return page_url - - def _clean_url_path_part(part: str) -> str: """ Clean a "part" of a URL path (i.e. after splitting on "@" characters). @@ -271,7 +280,7 @@ def _create_link_from_element( class CacheablePageContent: - def __init__(self, page: "HTMLPage") -> None: + def __init__(self, page: "IndexContent") -> None: assert page.cache_link_parsing self.page = page @@ -283,67 +292,59 @@ class CacheablePageContent: class ParseLinks(Protocol): - def __call__( - self, page: "HTMLPage", use_deprecated_html5lib: bool - ) -> Iterable[Link]: + def __call__(self, page: "IndexContent") -> Iterable[Link]: ... -def with_cached_html_pages(fn: ParseLinks) -> ParseLinks: +def with_cached_index_content(fn: ParseLinks) -> ParseLinks: """ - Given a function that parses an Iterable[Link] from an HTMLPage, cache the - function's result (keyed by CacheablePageContent), unless the HTMLPage + Given a function that parses an Iterable[Link] from an IndexContent, cache the + function's result (keyed by CacheablePageContent), unless the IndexContent `page` has `page.cache_link_parsing == False`. """ @functools.lru_cache(maxsize=None) - def wrapper( - cacheable_page: CacheablePageContent, use_deprecated_html5lib: bool - ) -> List[Link]: - return list(fn(cacheable_page.page, use_deprecated_html5lib)) + def wrapper(cacheable_page: CacheablePageContent) -> List[Link]: + return list(fn(cacheable_page.page)) @functools.wraps(fn) - def wrapper_wrapper(page: "HTMLPage", use_deprecated_html5lib: bool) -> List[Link]: + def wrapper_wrapper(page: "IndexContent") -> List[Link]: if page.cache_link_parsing: - return wrapper(CacheablePageContent(page), use_deprecated_html5lib) - return list(fn(page, use_deprecated_html5lib)) + return wrapper(CacheablePageContent(page)) + return list(fn(page)) return wrapper_wrapper -def _parse_links_html5lib(page: "HTMLPage") -> Iterable[Link]: +@with_cached_index_content +def parse_links(page: "IndexContent") -> Iterable[Link]: """ - Parse an HTML document, and yield its anchor elements as Link objects. - - TODO: Remove when `html5lib` is dropped. - """ - document = html5lib.parse( - page.content, - transport_encoding=page.encoding, - namespaceHTMLElements=False, - ) - - url = page.url - base_url = _determine_base_url(document, url) - for anchor in document.findall(".//a"): - link = _create_link_from_element( - anchor.attrib, - page_url=url, - base_url=base_url, - ) - if link is None: - continue - yield link - - -@with_cached_html_pages -def parse_links(page: "HTMLPage", use_deprecated_html5lib: bool) -> Iterable[Link]: - """ - Parse an HTML document, and yield its anchor elements as Link objects. + Parse a Simple API's Index Content, and yield its anchor elements as Link objects. """ - if use_deprecated_html5lib: - yield from _parse_links_html5lib(page) + content_type_l = page.content_type.lower() + if content_type_l.startswith("application/vnd.pypi.simple.v1+json"): + data = json.loads(page.content) + for file in data.get("files", []): + file_url = file.get("url") + if file_url is None: + continue + + # The Link.yanked_reason expects an empty string instead of a boolean. + yanked_reason = file.get("yanked") + if yanked_reason and not isinstance(yanked_reason, str): + yanked_reason = "" + # The Link.yanked_reason expects None instead of False + elif not yanked_reason: + yanked_reason = None + + yield Link( + _clean_link(urllib.parse.urljoin(page.url, file_url)), + comes_from=page.url, + requires_python=file.get("requires-python"), + yanked_reason=yanked_reason, + hashes=file.get("hashes", {}), + ) return parser = HTMLLinkParser(page.url) @@ -363,12 +364,13 @@ def parse_links(page: "HTMLPage", use_deprecated_html5lib: bool) -> Iterable[Lin yield link -class HTMLPage: - """Represents one page, along with its URL""" +class IndexContent: + """Represents one response (or page), along with its URL""" def __init__( self, content: bytes, + content_type: str, encoding: Optional[str], url: str, cache_link_parsing: bool = True, @@ -381,6 +383,7 @@ class HTMLPage: have this set to False, for example. """ self.content = content + self.content_type = content_type self.encoding = encoding self.url = url self.cache_link_parsing = cache_link_parsing @@ -417,7 +420,7 @@ class HTMLLinkParser(HTMLParser): return None -def _handle_get_page_fail( +def _handle_get_simple_fail( link: Link, reason: Union[str, Exception], meth: Optional[Callable[..., None]] = None, @@ -427,19 +430,22 @@ def _handle_get_page_fail( meth("Could not fetch URL %s: %s - skipping", link, reason) -def _make_html_page(response: Response, cache_link_parsing: bool = True) -> HTMLPage: +def _make_index_content( + response: Response, cache_link_parsing: bool = True +) -> IndexContent: encoding = _get_encoding_from_headers(response.headers) - return HTMLPage( + return IndexContent( response.content, + response.headers["Content-Type"], encoding=encoding, url=response.url, cache_link_parsing=cache_link_parsing, ) -def _get_html_page( +def _get_index_content( link: Link, session: Optional[PipSession] = None -) -> Optional["HTMLPage"]: +) -> Optional["IndexContent"]: if session is None: raise TypeError( "_get_html_page() missing 1 required keyword argument: 'session'" @@ -464,39 +470,44 @@ def _get_html_page( # final segment if not url.endswith("/"): url += "/" + # TODO: In the future, it would be nice if pip supported PEP 691 + # style respones in the file:// URLs, however there's no + # standard file extension for application/vnd.pypi.simple.v1+json + # so we'll need to come up with something on our own. url = urllib.parse.urljoin(url, "index.html") logger.debug(" file: URL is directory, getting %s", url) try: - resp = _get_html_response(url, session=session) + resp = _get_simple_response(url, session=session) except _NotHTTP: logger.warning( "Skipping page %s because it looks like an archive, and cannot " "be checked by a HTTP HEAD request.", link, ) - except _NotHTML as exc: + except _NotAPIContent as exc: logger.warning( - "Skipping page %s because the %s request got Content-Type: %s." - "The only supported Content-Type is text/html", + "Skipping page %s because the %s request got Content-Type: %s. " + "The only supported Content-Types are application/vnd.pypi.simple.v1+json, " + "application/vnd.pypi.simple.v1+html, and text/html", link, exc.request_desc, exc.content_type, ) except NetworkConnectionError as exc: - _handle_get_page_fail(link, exc) + _handle_get_simple_fail(link, exc) except RetryError as exc: - _handle_get_page_fail(link, exc) + _handle_get_simple_fail(link, exc) except SSLError as exc: reason = "There was a problem confirming the ssl certificate: " reason += str(exc) - _handle_get_page_fail(link, reason, meth=logger.info) + _handle_get_simple_fail(link, reason, meth=logger.info) except requests.ConnectionError as exc: - _handle_get_page_fail(link, f"connection error: {exc}") + _handle_get_simple_fail(link, f"connection error: {exc}") except requests.Timeout: - _handle_get_page_fail(link, "timed out") + _handle_get_simple_fail(link, "timed out") else: - return _make_html_page(resp, cache_link_parsing=link.cache_link_parsing) + return _make_index_content(resp, cache_link_parsing=link.cache_link_parsing) return None @@ -559,11 +570,11 @@ class LinkCollector: def find_links(self) -> List[str]: return self.search_scope.find_links - def fetch_page(self, location: Link) -> Optional[HTMLPage]: + def fetch_response(self, location: Link) -> Optional[IndexContent]: """ Fetch an HTML page containing package links. """ - return _get_html_page(location, session=self.session) + return _get_index_content(location, session=self.session) def collect_sources( self, diff --git a/sbsheriff/Lib/site-packages/pip/_internal/index/package_finder.py b/sbsheriff/Lib/site-packages/pip/_internal/index/package_finder.py index 223d06d..9bf247f 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/index/package_finder.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/index/package_finder.py @@ -3,6 +3,7 @@ # The following comment should be removed at some point in the future. # mypy: strict-optional=False +import enum import functools import itertools import logging @@ -94,6 +95,16 @@ def _check_link_requires_python( return True +class LinkType(enum.Enum): + candidate = enum.auto() + different_project = enum.auto() + yanked = enum.auto() + format_unsupported = enum.auto() + format_invalid = enum.auto() + platform_mismatch = enum.auto() + requires_python_mismatch = enum.auto() + + class LinkEvaluator: """ @@ -143,19 +154,20 @@ class LinkEvaluator: self.project_name = project_name - def evaluate_link(self, link: Link) -> Tuple[bool, Optional[str]]: + def evaluate_link(self, link: Link) -> Tuple[LinkType, str]: """ Determine whether a link is a candidate for installation. - :return: A tuple (is_candidate, result), where `result` is (1) a - version string if `is_candidate` is True, and (2) if - `is_candidate` is False, an optional string to log the reason - the link fails to qualify. + :return: A tuple (result, detail), where *result* is an enum + representing whether the evaluation found a candidate, or the reason + why one is not found. If a candidate is found, *detail* will be the + candidate's version string; if one is not found, it contains the + reason the link fails to qualify. """ version = None if link.is_yanked and not self._allow_yanked: reason = link.yanked_reason or "" - return (False, f"yanked for reason: {reason}") + return (LinkType.yanked, f"yanked for reason: {reason}") if link.egg_fragment: egg_info = link.egg_fragment @@ -163,42 +175,46 @@ class LinkEvaluator: else: egg_info, ext = link.splitext() if not ext: - return (False, "not a file") + return (LinkType.format_unsupported, "not a file") if ext not in SUPPORTED_EXTENSIONS: - return (False, f"unsupported archive format: {ext}") + return ( + LinkType.format_unsupported, + f"unsupported archive format: {ext}", + ) if "binary" not in self._formats and ext == WHEEL_EXTENSION: - reason = "No binaries permitted for {}".format(self.project_name) - return (False, reason) + reason = f"No binaries permitted for {self.project_name}" + return (LinkType.format_unsupported, reason) if "macosx10" in link.path and ext == ".zip": - return (False, "macosx10 one") + return (LinkType.format_unsupported, "macosx10 one") if ext == WHEEL_EXTENSION: try: wheel = Wheel(link.filename) except InvalidWheelFilename: - return (False, "invalid wheel filename") + return ( + LinkType.format_invalid, + "invalid wheel filename", + ) if canonicalize_name(wheel.name) != self._canonical_name: - reason = "wrong project name (not {})".format(self.project_name) - return (False, reason) + reason = f"wrong project name (not {self.project_name})" + return (LinkType.different_project, reason) supported_tags = self._target_python.get_tags() if not wheel.supported(supported_tags): # Include the wheel's tags in the reason string to # simplify troubleshooting compatibility issues. - file_tags = wheel.get_formatted_file_tags() + file_tags = ", ".join(wheel.get_formatted_file_tags()) reason = ( - "none of the wheel's tags ({}) are compatible " - "(run pip debug --verbose to show compatible tags)".format( - ", ".join(file_tags) - ) + f"none of the wheel's tags ({file_tags}) are compatible " + f"(run pip debug --verbose to show compatible tags)" ) - return (False, reason) + return (LinkType.platform_mismatch, reason) version = wheel.version # This should be up by the self.ok_binary check, but see issue 2700. if "source" not in self._formats and ext != WHEEL_EXTENSION: reason = f"No sources permitted for {self.project_name}" - return (False, reason) + return (LinkType.format_unsupported, reason) if not version: version = _extract_version_from_fragment( @@ -207,14 +223,17 @@ class LinkEvaluator: ) if not version: reason = f"Missing project version for {self.project_name}" - return (False, reason) + return (LinkType.format_invalid, reason) match = self._py_version_re.search(version) if match: version = version[: match.start()] py_version = match.group(1) if py_version != self._target_python.py_version: - return (False, "Python version is incorrect") + return ( + LinkType.platform_mismatch, + "Python version is incorrect", + ) supports_python = _check_link_requires_python( link, @@ -222,13 +241,12 @@ class LinkEvaluator: ignore_requires_python=self._ignore_requires_python, ) if not supports_python: - # Return None for the reason text to suppress calling - # _log_skipped_link(). - return (False, None) + reason = f"{version} Requires-Python {link.requires_python}" + return (LinkType.requires_python_mismatch, reason) logger.debug("Found link %s, version: %s", link, version) - return (True, version) + return (LinkType.candidate, version) def filter_unallowed_hashes( @@ -580,7 +598,6 @@ class PackageFinder: link_collector: LinkCollector, target_python: TargetPython, allow_yanked: bool, - use_deprecated_html5lib: bool, format_control: Optional[FormatControl] = None, candidate_prefs: Optional[CandidatePreferences] = None, ignore_requires_python: Optional[bool] = None, @@ -605,12 +622,11 @@ class PackageFinder: self._ignore_requires_python = ignore_requires_python self._link_collector = link_collector self._target_python = target_python - self._use_deprecated_html5lib = use_deprecated_html5lib self.format_control = format_control # These are boring links that have already been logged somehow. - self._logged_links: Set[Link] = set() + self._logged_links: Set[Tuple[Link, LinkType, str]] = set() # Don't include an allow_yanked default value to make sure each call # site considers whether yanked releases are allowed. This also causes @@ -622,8 +638,6 @@ class PackageFinder: link_collector: LinkCollector, selection_prefs: SelectionPreferences, target_python: Optional[TargetPython] = None, - *, - use_deprecated_html5lib: bool, ) -> "PackageFinder": """Create a PackageFinder. @@ -648,7 +662,6 @@ class PackageFinder: allow_yanked=selection_prefs.allow_yanked, format_control=selection_prefs.format_control, ignore_requires_python=selection_prefs.ignore_requires_python, - use_deprecated_html5lib=use_deprecated_html5lib, ) @property @@ -690,6 +703,14 @@ class PackageFinder: def set_prefer_binary(self) -> None: self._candidate_prefs.prefer_binary = True + def requires_python_skipped_reasons(self) -> List[str]: + reasons = { + detail + for _, result, detail in self._logged_links + if result == LinkType.requires_python_mismatch + } + return sorted(reasons) + def make_link_evaluator(self, project_name: str) -> LinkEvaluator: canonical_name = canonicalize_name(project_name) formats = self.format_control.get_allowed_formats(canonical_name) @@ -719,12 +740,13 @@ class PackageFinder: no_eggs.append(link) return no_eggs + eggs - def _log_skipped_link(self, link: Link, reason: str) -> None: - if link not in self._logged_links: + def _log_skipped_link(self, link: Link, result: LinkType, detail: str) -> None: + entry = (link, result, detail) + if entry not in self._logged_links: # Put the link at the end so the reason is more visible and because # the link string is usually very long. - logger.debug("Skipping link: %s: %s", reason, link) - self._logged_links.add(link) + logger.debug("Skipping link: %s: %s", detail, link) + self._logged_links.add(entry) def get_install_candidate( self, link_evaluator: LinkEvaluator, link: Link @@ -733,16 +755,15 @@ class PackageFinder: If the link is a candidate for install, convert it to an InstallationCandidate and return it. Otherwise, return None. """ - is_candidate, result = link_evaluator.evaluate_link(link) - if not is_candidate: - if result: - self._log_skipped_link(link, reason=result) + result, detail = link_evaluator.evaluate_link(link) + if result != LinkType.candidate: + self._log_skipped_link(link, result, detail) return None return InstallationCandidate( name=link_evaluator.project_name, link=link, - version=result, + version=detail, ) def evaluate_links( @@ -766,11 +787,11 @@ class PackageFinder: "Fetching project page and analyzing links: %s", project_url, ) - html_page = self._link_collector.fetch_page(project_url) - if html_page is None: + index_response = self._link_collector.fetch_response(project_url) + if index_response is None: return [] - page_links = list(parse_links(html_page, self._use_deprecated_html5lib)) + page_links = list(parse_links(index_response)) with indent_log(): package_links = self.evaluate_links( diff --git a/sbsheriff/Lib/site-packages/pip/_internal/locations/__init__.py b/sbsheriff/Lib/site-packages/pip/_internal/locations/__init__.py index ac0c166..60afe0a 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/locations/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/locations/__init__.py @@ -4,14 +4,14 @@ import os import pathlib import sys import sysconfig -from typing import Any, Dict, Iterator, List, Optional, Tuple +from typing import Any, Dict, Generator, List, Optional, Tuple from pip._internal.models.scheme import SCHEME_KEYS, Scheme from pip._internal.utils.compat import WINDOWS from pip._internal.utils.deprecation import deprecated from pip._internal.utils.virtualenv import running_under_virtualenv -from . import _distutils, _sysconfig +from . import _sysconfig from .base import ( USER_CACHE_DIR, get_major_minor_version, @@ -60,6 +60,12 @@ def _should_use_sysconfig() -> bool: _USE_SYSCONFIG = _should_use_sysconfig() +if not _USE_SYSCONFIG: + # Import distutils lazily to avoid deprecation warnings, + # but import it soon enough that it is in memory and available during + # a pip reinstall. + from . import _distutils + # Be noisy about incompatibilities if this platforms "should" be using # sysconfig, but is explicitly opting out and using distutils instead. if _USE_SYSCONFIG_DEFAULT and not _USE_SYSCONFIG: @@ -73,7 +79,7 @@ def _looks_like_bpo_44860() -> bool: See . """ - from distutils.command.install import INSTALL_SCHEMES # type: ignore + from distutils.command.install import INSTALL_SCHEMES try: unix_user_platlib = INSTALL_SCHEMES["unix_user"]["platlib"] @@ -98,7 +104,7 @@ def _looks_like_red_hat_lib() -> bool: This is the only way I can see to tell a Red Hat-patched Python. """ - from distutils.command.install import INSTALL_SCHEMES # type: ignore + from distutils.command.install import INSTALL_SCHEMES return all( k in INSTALL_SCHEMES @@ -110,7 +116,7 @@ def _looks_like_red_hat_lib() -> bool: @functools.lru_cache(maxsize=None) def _looks_like_debian_scheme() -> bool: """Debian adds two additional schemes.""" - from distutils.command.install import INSTALL_SCHEMES # type: ignore + from distutils.command.install import INSTALL_SCHEMES return "deb_system" in INSTALL_SCHEMES and "unix_local" in INSTALL_SCHEMES @@ -169,9 +175,9 @@ def _looks_like_msys2_mingw_scheme() -> bool: ) -def _fix_abiflags(parts: Tuple[str]) -> Iterator[str]: +def _fix_abiflags(parts: Tuple[str]) -> Generator[str, None, None]: ldversion = sysconfig.get_config_var("LDVERSION") - abiflags: str = getattr(sys, "abiflags", None) + abiflags = getattr(sys, "abiflags", None) # LDVERSION does not end with sys.abiflags. Just return the path unchanged. if not ldversion or not abiflags or not ldversion.endswith(abiflags): @@ -452,6 +458,8 @@ def get_platlib() -> str: if _USE_SYSCONFIG: return new + from . import _distutils + old = _distutils.get_platlib() if _looks_like_deb_system_dist_packages(old): return old diff --git a/sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc index 9ee5a06881924f27dfc64f0e34424492a47dd594..2720df92af9aaf3a6cecbca44932af8185778ebc 100644 GIT binary patch delta 3701 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 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc index 134eb62e238ad5e1c81958ee8d77fd965712b85d..190f57de76fca1ac9952f95b9b96a8cb5ae41829 100644 GIT binary patch delta 605 zcmY+Cy^9k;7{=$_Y(6);*?eyHl3XsAL_Gx?D=W3Iu(7caUrvTI?}Q8PTx7HHP7xw! z&_WPo3oR^i-GPEa3QG(B3iHqCI0=X|%sjv6otcNXn6JI_zB9J%98+WZvpslOfA2JB zAAvDq$ew2e5WIqgamIk%XGfOFL_(ND<5?9{1=s_21jmdFN(4zvYE5BEYZ}u^%^)MQ zn1jD}l7S`jnAeUT5}UG zZrnDtmAkZYJJeCGv#0y;gz9F~f=Rp7RY#X8agXiw;{{wVVu90W5>2B~FyV&>gU8EX z@WzB2%Y)QI1G>u}nRg~c%e(eIz=!y=a|-A2)xth}iQg7Z;alvujhk0iY0hap;Cz+i zd?cTY!-#XVLLtXb1)m&_055QcYFchc#s`_Rcc=`7jj57|at2m${CS3ym>!A2O(${2Q$Nm7KwATRp(x-QwK5Z)F$x4lP*?FIr*?k$0+JdKtV)ztD_CKzXver%h5vUPT{9kfmR;sL`j)GD%`~uKxuydXVrU|aOpLK< zV$&p;m=?Bd-_z@+jcv>Gx=u|8JJ$HRYckB3*QlX4Ob>e?6nyQg&0D~&dQg|VxzZj5 z6n+MZR8FzlrY38`r^UR^+Gb5vsB)E0WhSOEb*Q_j;m)HBem!43k5!%tj#%n4X342) zPeaORW8va1hjJkGsK0P=i``)5a@uCMZ^uX#54IY?p&i=g&H>36VmNqv^n5ls zdtLm7r)45<9C%iKs-8;dmjApD4qTKs!3n_o;!k)DUyAeS1a6C8(e=T1{=HXKF23}^ nxqo@eICPIkqvO%=@UAu<(`+&xm*3(m@UFP$2+u8^ByS!7-eGb- diff --git a/sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc index 02f94a7f670f87443821dff6d09452b7cf109566..21682644ec4d418d61587cceda2eb7a8e595b312 100644 GIT binary patch delta 1663 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 ZV>$HJz1UkV##K_j0epv;ybJwh{2#t?cH{s6 delta 572 zcmZusO>fgc5Zzfjj^nI1ZW2Nq%EtkL+DZ}P28y_HKyax9!V?Sx(ZEM$2TM()$ zdgV}A;+*~l&YbuczHmSs_!Gcv0l|SCY4*LHc~5V@bWa%1ecvN^Uf&LPNM!l z8a5%%NXBd;FCD!AVoK7*AnHFS85|Hv7MBGG{~e%LI7DkMI;Zwqh(ZCoWGnb)Vm|rs z5FBvY2vxhGh z^))l89=TV*s^;z(oa()M^M-F6hGyQwkF2y*#<)nPd&yjC6;_|!?Wdb&$plgVi| str: return "{}.{}".format(*sys.version_info) +def change_root(new_root: str, pathname: str) -> str: + """Return 'pathname' with 'new_root' prepended. + + If 'pathname' is relative, this is equivalent to os.path.join(new_root, pathname). + Otherwise, it requires making 'pathname' relative and then joining the + two, which is tricky on DOS/Windows and Mac OS. + + This is borrowed from Python's standard library's distutils module. + """ + if os.name == "posix": + if not os.path.isabs(pathname): + return os.path.join(new_root, pathname) + else: + return os.path.join(new_root, pathname[1:]) + + elif os.name == "nt": + (drive, path) = os.path.splitdrive(pathname) + if path[0] == "\\": + path = path[1:] + return os.path.join(new_root, path) + + else: + raise InstallationError( + f"Unknown platform: {os.name}\n" + "Can not change root path prefix on unknown platform." + ) + + def get_src_prefix() -> str: if running_under_virtualenv(): src_prefix = os.path.join(sys.prefix, "src") diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/__init__.py b/sbsheriff/Lib/site-packages/pip/_internal/metadata/__init__.py index cc037c1..8cd0fda 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/metadata/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/metadata/__init__.py @@ -1,7 +1,18 @@ -from typing import List, Optional +import contextlib +import functools +import os +import sys +from typing import TYPE_CHECKING, List, Optional, Type, cast + +from pip._internal.utils.misc import strtobool from .base import BaseDistribution, BaseEnvironment, FilesystemWheel, MemoryWheel, Wheel +if TYPE_CHECKING: + from typing import Protocol +else: + Protocol = object + __all__ = [ "BaseDistribution", "BaseEnvironment", @@ -11,9 +22,49 @@ __all__ = [ "get_default_environment", "get_environment", "get_wheel_distribution", + "select_backend", ] +def _should_use_importlib_metadata() -> bool: + """Whether to use the ``importlib.metadata`` or ``pkg_resources`` backend. + + By default, pip uses ``importlib.metadata`` on Python 3.11+, and + ``pkg_resourcess`` otherwise. This can be overridden by a couple of ways: + + * If environment variable ``_PIP_USE_IMPORTLIB_METADATA`` is set, it + dictates whether ``importlib.metadata`` is used, regardless of Python + version. + * On Python 3.11+, Python distributors can patch ``importlib.metadata`` + to add a global constant ``_PIP_USE_IMPORTLIB_METADATA = False``. This + makes pip use ``pkg_resources`` (unless the user set the aforementioned + environment variable to *True*). + """ + with contextlib.suppress(KeyError, ValueError): + return bool(strtobool(os.environ["_PIP_USE_IMPORTLIB_METADATA"])) + if sys.version_info < (3, 11): + return False + import importlib.metadata + + return bool(getattr(importlib.metadata, "_PIP_USE_IMPORTLIB_METADATA", True)) + + +class Backend(Protocol): + Distribution: Type[BaseDistribution] + Environment: Type[BaseEnvironment] + + +@functools.lru_cache(maxsize=None) +def select_backend() -> Backend: + if _should_use_importlib_metadata(): + from . import importlib + + return cast(Backend, importlib) + from . import pkg_resources + + return cast(Backend, pkg_resources) + + def get_default_environment() -> BaseEnvironment: """Get the default representation for the current environment. @@ -21,9 +72,7 @@ def get_default_environment() -> BaseEnvironment: Environment instance should be built from ``sys.path`` and may use caching to share instance state accorss calls. """ - from .pkg_resources import Environment - - return Environment.default() + return select_backend().Environment.default() def get_environment(paths: Optional[List[str]]) -> BaseEnvironment: @@ -33,9 +82,7 @@ def get_environment(paths: Optional[List[str]]) -> BaseEnvironment: given import paths. The backend must build a fresh instance representing the state of installed distributions when this function is called. """ - from .pkg_resources import Environment - - return Environment.from_paths(paths) + return select_backend().Environment.from_paths(paths) def get_directory_distribution(directory: str) -> BaseDistribution: @@ -44,9 +91,7 @@ def get_directory_distribution(directory: str) -> BaseDistribution: This returns a Distribution instance from the chosen backend based on the given on-disk ``.dist-info`` directory. """ - from .pkg_resources import Distribution - - return Distribution.from_directory(directory) + return select_backend().Distribution.from_directory(directory) def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistribution: @@ -57,6 +102,4 @@ def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistributio :param canonical_name: Normalized project name of the given wheel. """ - from .pkg_resources import Distribution - - return Distribution.from_wheel(wheel, canonical_name) + return select_backend().Distribution.from_wheel(wheel, canonical_name) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc index fc2751198589d90ea7e0279519d2ef4be183a263..983aed3a92d34fa81b2dd2db234f0d096b0ff99c 100644 GIT binary patch literal 4008 zcmcIn&2t;K6$h5fPmvU@B$g#P38o)$=-TqQX{W90c4Eu2tBEaZD!FNPG_wL1ptRC{ zumC8V8T%w(J3aIth}0X)3ld++zaywz$D zc!q!dIQn~wkbmG{_Nl<&b7;Cv2@yolgapNZ8c;X(0?+*~1ts|JC4O2C%4sF2q}8CB z)`D7E59$=xl#)g|7tBH57v-dxwt`mL4%+E_FrRjUPI@W0M2Re`U&7o9?6VLoP?CA_ zy{i^gj|xcrESInjJgL{l!Dl!8S`53dL+T7RT4ZxQCT#r$jk zga%76Zo{}EF2TBGu^_9mB3G8k5^-OA@t$}ezFZX_$Q6*Z`o6d<7D4i%xFRo!rLnXk zmcYT^rAOzh&mG@+1vK1@s~XO-ZGS;1u# zJV$+@m_1%w%S1*d?D6PGX2MpKG((j|u>15u+iK9(py@um4Ecr{&y?PHe*!-n-;_<| zuqx;hIiV-?OX5NF_{1kCB}%r*ZK9W-Q%dmfD`=*6SQn)uqCOG+HW6irw8kskW$q<8 zY=YM-C#4hgN|pcFBLo032U0PUv!Rv@`fP76P6xR%N!(jarQw1bzPHD61z!e7`=OFL zAF4=d5RMI7Z8R7>_eX3D*9|s^2e_lYaJ!6cjm$xwvCmd--~Q1J#xvnIIj01*LFmG=! z+}hX*pKY&)8&9^L{&wf_#{KZg`p&%v_jc}qR#2p+xxr%N&c&FBBf|}t1fF)FU4RrU z1k1$@rsO_X0^(8Qp$c=yd%@8)1n{aGUT06wqcO&28cn$>%pPzP9bACvcx!Ma7Xt9u zPx2m50G3P}o|*49nEi@9an{f6!hdIitwOGI zW0b8;lH*(8s_DdUiTVL-{jdJoo!w^uh~C`>x_YtuKpyXEldH6+;(ab;s3E4~et%c@ zCcVdTZ&$}g-W&j3@O`Ow0ry*Q5+fDRiryQ1w9;h zPyvnjwt9ceZp|~)Jhy(zn48_It%YI6QyGS~5r%0lh6(nYVfcq3Pl_+940;_O+xal$ zS(XFR5I;H$3xY;u9lXWshd8_jub)8ESb`g*NjucZfaR+xf1%^A23MpHC4_=_BbtWsi6^E`R z>iakckL3=eZsBaNkYfM5B?}4A*mek=tRF(6n}2P9ln zum8mf;0&lj3@R+Bbg1pe$Ka!aB$!i#To33M3Cz-=HqI4TJ^BzX2dDT><7esuSXh7# zM!A4U5>Pj-SeUn1DN#LC#QrdgFqg5cqIaZthkF_rPoXJ) zfySwD8vah>HGL+6rk?pf;yuxOG2YHWcLrSX6z`rhfZSo5P||qAmh-ShdMPk?tZK;gUHrhV!@3@s})>| z1>aW8XaISt&_xQVN};2Q@{0AyUV)p%>hxx@3O}ZRF4I^?#l6T!>bUTSkwVV1mAr@6 z+A37)B!LROj4JTv;HsUiCu$fXXUl?r9h;Wmx0}mZ7iG?n8DpnZY-@Lm8^W)VYu$CE kMrv?#snM&n>0R}FuT6cg=Cxa$#YVY9+l}SMLSwo9A0uUDtN;K2 delta 901 zcmZWnJ#W)c6n*d6v7Oj)zJQRXRlA_d0(C-Spkm=eLPDU5%}bQ#y|hv7IJ$N~6{)%~ zup)0v4HFDZ`~lby`~&|31_lJ|-22i-L0Gz1&*xshbI$dBxA~{xC)H|&;qzjtPg;s2bcI<=>X9rB0Z+TdjB~=;Y`6lm)Htq%IJJ z`Dm18h4W;RjgoOcKjC|A2TE82i;_*rp;XR)@&~sqP}vm514Nb&$CJRgi;-T!B)Jr1 z^Mr9WV`pN{kkR<~!SVSnnAq^17w-M>vk@fYSdFv5D5{gAgC3|fnZiJ&P{XFemTK6a zMj80@34><7V;yY)&9#A%(oLT22#pk_Nk2PG2R#2|w>N%W!P-&=M;ZJ~%-Ec3Av={D zd`}C}R|f{vv3)^W8A1~G^j(1fa-(r*(n+Tlom@;C80R7?0^IzK+s(h(o(-3=5E%Iv z_v^z8yWTwOWU|$GeNdzd@i){Th$gnT^Og%e{?L2KR;9|LVO*|KnDL4LYRl?CdNXG z;|YyC4r+y!9ZyE%1E75Xl2(}e{Zy@Nlv-ISs@uI@KZ<(2#a}dVN_x1^r5lK7WeUsr d7tU^+$Z4eR(DJ3UAa%Ab9N~LwUejB1{{nTHu=@Z2 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2516521e4a69bc08b06bf246ea8afd924bc2b145 GIT binary patch literal 2187 zcmZuyOK%%D5GMDnhaXAPG|3?`&=iS)$Z0P{&>BWv%W2x!P7pgSx=mb*uL&%>G7Z z`sV@j4Gfh7VT93`Bs8Rn6?CgJmUBDy5xjuivUg-GiqQ_HJI$K?hBc()NaEWfsJmY&q zA-QU{05g=#olBmM;8uiceCb@a_DXY^MlovEp33Yc?`bp>`B~ui1%tCdOGf4K=c2RY zXPExUJ(OvWV*F2kICo&I!cg--3UW+N$T4MR0XO3WDF>(o(!?xA=ZrX^3rCiUA~AN9}Ma z`u(=*p3T-px2=T6xb$`*G^(A8{C)?}E)lq&oaWU1&P$c0i}}b@aMFSN;h&+!7La)= zKY@?26E%3xHy@-f3>${}69}W4XsRtN3TDCAVK#GKJHHV@4ym?VpLkaQ)l;W->AG4rv_lf+D zRbUS(++!%v^F0poCj_+Jf)>sa*}DX11R(JWPlkn8P*zsS1;l0)T)I216xOi~sX?JL0Z>1YwB``)jP6i^e`X)rKa-RmfZ+&H zVfRbjy_)v4UjRHu;E?w4ba2es9M^~GZVJ`de9#qo><)Fm`M`M47DW0*BQRB=M5=U@ z_PE4oON^%RCN0Zch6aSat5tTeH7PS`yeQ9k%8aeFl;~!|k=M&jy&bqq8Mixv+Asl6 zVXH_7W%^FYRn(hPQ7W`hXHD=P2-OWBRqD`r8c>T?t$@~PU|Ijp+wi61+mL)6olWv| zDb9LPtdKn4(i7v3R-Tmq1OxAvg=E=+r48Ef%#L-*fM`6*~m z*;`$Tp|N1>m%qis@Okk_K)rY4TOTy*Lf-_tr#dTVP^ z+5Uj*P87$+h6!Aj$3mML3iD`$UA*DTYq%XcoEpZuY)he=z*HC;JT&fp6c4%aPxU9@ z-NC!dh}WiIYJgOs)i-Qs9%F04aA*~1@NU)tYF~xO18+IF0tExgn~k}!UcMNMlV|iI zS<4(WGn2(+@|a5OOUBcq9Pc6CYhc~wn>U^R0M^_%i2wiq literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc index f0f36a83df8e4abee319aa3476019dbc6bef221f..c76a06c7b8f5a6179c8d23dc587bd7235ec3b8e1 100644 GIT binary patch literal 25948 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 W;lu+Ih0N#pZ~XMcYZJvyrT+u>k1nPF delta 6286 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 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc index ac5e2d5c75374b9ece58983471be68a5dc9c1238..971f3ae98bc23984ac40a9542172e5d567e6a3bd 100644 GIT binary patch delta 4068 zcmaJ^U2I%O6~1%t{(E=5zh3XI?e)LCvAy{#gfwXqH+7PtB(w^oa8-KQ?2Mh8+`GG- zd!5$CVcR-VD^(zp5f7zQO&&rBKb5KgZ#~o=T&RqY;!pVL+ zbIzGFXU?2+=Ira|{&Y6cN+e#pc z^e#KD$L)lkAPQBeW+m-zy<3h0R?1H6X*mvB89S?I?VO&I^N^Ldd-Q@Fhpk?_s2A;$ zUb4%2S<)g_pWUzb%W>2iuq%3{V-M|uS_9??f&-bLfqs6D2S+2i`SJ)uw7 zllr7x)vNX%eGgHXc6*9V-y!z2999_&>gBcX9{EFTx9_F|zQh6C_%A^jY>w2w%>igJ4p z{1rHw5dR7uBm<%xnjV=3LY43t_`0w1y~svg+oZ3A9+DYxEId}Jp|rLs<`K3{^0n|{ zO={G56hytQC6iec56K*U2=(sYseCMQH7`wjgmX7ylu((!!z1j0Xo)-_4o6?;YzVEJ zb{too*jOsnPr%fR@x`X$G`QJzPa^vXfaTujE;DAGV{V<+-Fj_Pq?+bKC^d{Q0^o%W zgSHxm!9z$IMN;sRz2w5__TeOOsnxRh0c6V4YB)NKa1{dEaa2GK)p@| zAfg1wKrj=?XgyK*XeEtLichp$EDX#ODD{lE6PxI;$b5i?Y2-#=mFQ6xqEQy3F&3sO za6%Z{lGDZFKuNH0QJGg|6r()E@fIq^GE%#@Q8A{Gnv&Estj4HDN(Lw$m1TjHr#+IC zlR|l*6lkxc^w1(Jz$R%hvqZ}`0(vjZife}S(SD$m)?~sUGe9dqDT7QO>zBq3(jlM> z0Htze@X8SA9;PEe8K!&a*eN!Gs-*ZRhzIC6owyOy$0Wr+?If*&_&C)d{ieM5Q>No` z^U@;bniqgfbNSS*_{>2+9lW4{r1gY21)kn=Sr|$3y3gR?;Dc|(1B6rsOU#lvaW64N zz9=3hCV=v3qL|vbR*WW}gVb9|UL=Zmn0x{--Ca&-E5WywceGXV8lj3f+})oFd|SI7 zT2WR)t5`9D=fxYTuaX||QL1p{S==`d098V*?c>kD@V@Fr%;tOx4CkJ@Jn!4<2mMiM zHrz(bZXcuKV0u<8rpJr2E}TUjU0$s27|UjR-n1CciJzw@pPk1YQV5vF{3{3;nbk1A zh~uv#V4d)Y;U(;~)G=K4vdce@yv<`@!s&#V$rOnyPG>GpOBbtLIuG}`PyBi^j)D@T zgOTNmzh!FT&0wN~Ddj3F$`!Iou9FqQ6D#Dp>S`-0x(DbgFCcExsB%H!a<2eS!)hn|D2y3IJM=2?KXdf`RZE3wboZi$yMn^TTkw=4#gY^^@O467Y^YODNXC>e{1(l3ULMQ!i{f1_te0$a`G;Hec!x7_R@}7z=O%K29&d zs~9NCZ9>T%G6#Le83h{w$S(D~7xrHT2lkT&$SS?d3B0oDGA_#l6c5W;drhQ&oF8E9 zI{^Uol^(J@xwXpF{?9sbbFd^17EUfm7lh=);+uhf@Y1K?kmpW+J=RD*Oho-Txr5c~szpLVKdAPbI_)#WlY?LX}Zd>mG z%|R=ZL9tZsA1H6TtL?JTXT4WGOQyxA<;s)NsJBsLgtHeHP0lc8qzjO`)9e1>C~LDO zWz7co=0ov(-#nTf1n;N%yQ}J2kMx)}7yofA;O`;1R16JDL=~WY3|deE?op z!>T(D9R6~P`jJ&Y-t!3Z5^R);zy@u`-6bADhV-z5qeTQ+cd+L1E`()-lF|Xhgyv<0 zZy{jp^H&h$ZDIOxOg;W4!Yu$VY%|BHFEB5B&L8maBTq%Z-wXU*gxd(4S13pFUBH8# zhL3YVfozK?IihOt$@UU8w>FO9cZ#S{_`r8YlmDWbP+w0^kk4TUCG-LPbJz_N#p0!FL89Bggd~DFN@Etackx^7hxujw~WF z98T@nMEqx{Nd7Jg!*3;IRSR-VIet(4YIsjcri)zr$TBjLCm)N#$QL@*%&w9B6I6rl zeYUl*0DZv_ za=wdzhdgRAbSUmJFpvluj=E EKVQO=jQ{`u delta 4148 zcmZt}S!^4}b!V5iNQ$ILO4PZQL`n1^+l}40a^h6J;;J-f0j zM-G$7Xn`U|;SK^cNZr~l9sRsoIzty z;z@hR(GA_%Vr+qNigwt;&WJJMj2fd()u=jS#w%maxH0Zb7!yQc+T9x4dXE^}o>yp^ zW^O7p!!k>nu^q-)+6m*%CDqsgqa4k{D9=V#75yP_^7z6UFq%vbPygd0U)I$NP?sZ?|U>6`8z3%OVEyWQu}{c0F&D26ZO7Hx+OmMK$5wt6pCenv&O}dX zFACYYQPR1@<&u=VY3B1peJ|P)irY916G6^lzDZ5rtlO67Q;UBcm+u#?3v}r*r0;(8emX+PxOkA6CWpkoGTX>8QO=G72P4`tomzo0i8s{e|XL)3)f# zI6bAqtI4i1uG=8dYR>BJjFc<6^@cg;wSmW6m4d>iS_@O`T4U<`b*nXF*=+KlNe!!Y z6wvcJOt2Q7v+le41qQ;nJKvmK6|iE)x0~KvtL1W^t(fw{dd(In)uo|(bWpQh2j}UI zY0tRaVRTg*nqxJ6#+#;XFRW=14?DkerU<_J=a=xSX+g^KP40X17T9wNeb@z{rUvTd zE`AcwhiZ_pnlmm00T0ycGokO%?Lq1pYBl_Z>$DDB7BA(d$w~1}Zmc5fg^Y zg(Ssn{^E8Suqr=_bky^Zgmrcl2@=R~#i`fC|MHU}-IY0H$qj^tn#fg z2N`)7w%ah#mu+0p6z96=^w$8bMfpLbpans)-s0|6i!v?`GRRK*VXm+ zNdovaSbH1SUlr4(UU1>L(pR2a)-MlI7HKTtwdKnVqhdn^2;!Dk$B2Ii=k|%elzQ7L zpew%!AW?W4@OWndys7xgB3U9g)J5eIxvMU!_lVc&Yl|x8x1>cRt>Q=5(PBtDth}1M zq51Kw~9fko~ALKCuPrCk5cdkk0;RjL6!+#Ogi6*7pQmS25Eo_|d4V{IG!I*19c%TB;Hn-Xuhknv4_ zqcKU&Oj^ebx+l(e|F(^G^8p0d^FZRsD9Ow+zmD7sb;oSM0r|}F!katUf)Zh2ymRc7 zf+$`ZEnt+*4hjk4$Z5g#E)S(6l+$vd1aS*BNp&)dMx}aLK=QcfWu0=Z_raqNd+w7V z8F*{;;VqOPcaN#d^P<&zq=dTH6$p%eJ}&;$JA5WogDYjaV?Fu}JRTaFjm1brRY?|{ z5rZeCqEpoWrs64hUoSo8l9lQMUE=A!3LxHMVE%*W8hpbg3Gud0X3<`xWB-$)siur}}%f;$L)hG5NW5|ggOjXe*K zw@ZQApHPZK)!^ysA!^?;uH}fDga_UQtw$>)3rRIrB>m-bltTwH(A?W0JEkPd$d(Ad zBqBzZK2F8&iHOk&jZ#joQ^l=8onR|8_|+q5oys$?AG>-+(DeO8FS9|KNX8ZXCT}@9;#I3x(Az81u1N5 z>R6_{&qP)qj>^=7^3nU~KYBOW9~5MEt?z?8>DHCPA@flB`S1qu;+w-2^0{Ec?`Gr< zqWnW#abI+dZ0(gfFL^hyof;{Te+V|RPwdk7Z&}{_ePoppik@8O=BjvG?;&4^`}*#7 zt?r~3~mX3NKCO(EI{Cqei zBMYObpOm$7x?JYCptdW>Fvqm)$>lH(gE}43peTBb2XWh-odv)0n^ESskAT+!4gZ8Ata str: + return field.lower().replace("-", "_") + + +def msg_to_json(msg: Message) -> Dict[str, Any]: + """Convert a Message object into a JSON-compatible dictionary.""" + + def sanitise_header(h: Union[Header, str]) -> str: + if isinstance(h, Header): + chunks = [] + for bytes, encoding in decode_header(h): + if encoding == "unknown-8bit": + try: + # See if UTF-8 works + bytes.decode("utf-8") + encoding = "utf-8" + except UnicodeDecodeError: + # If not, latin1 at least won't fail + encoding = "latin1" + chunks.append((bytes, encoding)) + return str(make_header(chunks)) + return str(h) + + result = {} + for field, multi in METADATA_FIELDS: + if field not in msg: + continue + key = json_name(field) + if multi: + value: Union[str, List[str]] = [ + sanitise_header(v) for v in msg.get_all(field) + ] + else: + value = sanitise_header(msg.get(field)) + if key == "keywords": + # Accept both comma-separated and space-separated + # forms, for better compatibility with old data. + if "," in value: + value = [v.strip() for v in value.split(",")] + else: + value = value.split() + result[key] = value + + payload = msg.get_payload() + if payload: + result["description"] = payload + + return result diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/base.py b/sbsheriff/Lib/site-packages/pip/_internal/metadata/base.py index 1a5a781..151fd6d 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/metadata/base.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/metadata/base.py @@ -1,5 +1,6 @@ import csv import email.message +import functools import json import logging import pathlib @@ -8,11 +9,14 @@ import zipfile from typing import ( IO, TYPE_CHECKING, + Any, Collection, Container, + Dict, Iterable, Iterator, List, + NamedTuple, Optional, Tuple, Union, @@ -31,13 +35,13 @@ from pip._internal.models.direct_url import ( DirectUrlValidationError, ) from pip._internal.utils.compat import stdlib_pkgs # TODO: Move definition here. -from pip._internal.utils.egg_link import ( - egg_link_path_from_location, - egg_link_path_from_sys_path, -) +from pip._internal.utils.egg_link import egg_link_path_from_sys_path from pip._internal.utils.misc import is_local, normalize_path +from pip._internal.utils.packaging import safe_extra from pip._internal.utils.urls import url_to_path +from ._json import msg_to_json + if TYPE_CHECKING: from typing import Protocol else: @@ -45,7 +49,7 @@ else: DistributionVersion = Union[LegacyVersion, Version] -InfoPath = Union[str, pathlib.PurePosixPath] +InfoPath = Union[str, pathlib.PurePath] logger = logging.getLogger(__name__) @@ -94,7 +98,35 @@ def _convert_installed_files_path( return str(pathlib.Path(*info, *entry)) +class RequiresEntry(NamedTuple): + requirement: str + extra: str + marker: str + + class BaseDistribution(Protocol): + @classmethod + def from_directory(cls, directory: str) -> "BaseDistribution": + """Load the distribution from a metadata directory. + + :param directory: Path to a metadata directory, e.g. ``.dist-info``. + """ + raise NotImplementedError() + + @classmethod + def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution": + """Load the distribution from a given wheel. + + :param wheel: A concrete wheel definition. + :param name: File name of the wheel. + + :raises InvalidWheel: Whenever loading of the wheel causes a + :py:exc:`zipfile.BadZipFile` exception to be thrown. + :raises UnsupportedWheel: If the wheel is a valid zip, but malformed + internally. + """ + raise NotImplementedError() + def __repr__(self) -> str: return f"{self.raw_name} {self.version} ({self.location})" @@ -148,14 +180,7 @@ class BaseDistribution(Protocol): The returned location is normalized (in particular, with symlinks removed). """ - egg_link = egg_link_path_from_location(self.raw_name) - if egg_link: - location = egg_link - elif self.location: - location = self.location - else: - return None - return normalize_path(location) + raise NotImplementedError() @property def info_location(self) -> Optional[str]: @@ -286,6 +311,10 @@ class BaseDistribution(Protocol): return cleaned_line return "" + @property + def requested(self) -> bool: + return self.is_file("REQUESTED") + @property def editable(self) -> bool: return bool(self.editable_project_location) @@ -316,21 +345,19 @@ class BaseDistribution(Protocol): """Check whether an entry in the info directory is a file.""" raise NotImplementedError() - def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]: - """Iterate through a directory in the info directory. + def iter_distutils_script_names(self) -> Iterator[str]: + """Find distutils 'scripts' entries metadata. - Each item yielded would be a path relative to the info directory. - - :raise FileNotFoundError: If ``name`` does not exist in the directory. - :raise NotADirectoryError: If ``name`` does not point to a directory. + If 'scripts' is supplied in ``setup.py``, distutils records those in the + installed distribution's ``scripts`` directory, a file for each script. """ raise NotImplementedError() def read_text(self, path: InfoPath) -> str: """Read a file in the info directory. - :raise FileNotFoundError: If ``name`` does not exist in the directory. - :raise NoneMetadataError: If ``name`` exists in the info directory, but + :raise FileNotFoundError: If ``path`` does not exist in the directory. + :raise NoneMetadataError: If ``path`` exists in the info directory, but cannot be read. """ raise NotImplementedError() @@ -338,6 +365,17 @@ class BaseDistribution(Protocol): def iter_entry_points(self) -> Iterable[BaseEntryPoint]: raise NotImplementedError() + def _metadata_impl(self) -> email.message.Message: + raise NotImplementedError() + + @functools.lru_cache(maxsize=1) + def _metadata_cached(self) -> email.message.Message: + # When we drop python 3.7 support, move this to the metadata property and use + # functools.cached_property instead of lru_cache. + metadata = self._metadata_impl() + self._add_egg_info_requires(metadata) + return metadata + @property def metadata(self) -> email.message.Message: """Metadata of distribution parsed from e.g. METADATA or PKG-INFO. @@ -347,7 +385,18 @@ class BaseDistribution(Protocol): :raises NoneMetadataError: If the metadata file is available, but does not contain valid metadata. """ - raise NotImplementedError() + return self._metadata_cached() + + @property + def metadata_dict(self) -> Dict[str, Any]: + """PEP 566 compliant JSON-serializable representation of METADATA or PKG-INFO. + + This should return an empty dict if the metadata file is unavailable. + + :raises NoneMetadataError: If the metadata file is available, but does + not contain valid metadata. + """ + return msg_to_json(self.metadata) @property def metadata_version(self) -> Optional[str]: @@ -426,7 +475,7 @@ class BaseDistribution(Protocol): ) def iter_declared_entries(self) -> Optional[Iterator[str]]: - """Iterate through file entires declared in this distribution. + """Iterate through file entries declared in this distribution. For modern .dist-info distributions, this is the files listed in the ``RECORD`` metadata file. For legacy setuptools distributions, this @@ -441,6 +490,76 @@ class BaseDistribution(Protocol): or self._iter_declared_entries_from_legacy() ) + def _iter_requires_txt_entries(self) -> Iterator[RequiresEntry]: + """Parse a ``requires.txt`` in an egg-info directory. + + This is an INI-ish format where an egg-info stores dependencies. A + section name describes extra other environment markers, while each entry + is an arbitrary string (not a key-value pair) representing a dependency + as a requirement string (no markers). + + There is a construct in ``importlib.metadata`` called ``Sectioned`` that + does mostly the same, but the format is currently considered private. + """ + try: + content = self.read_text("requires.txt") + except FileNotFoundError: + return + extra = marker = "" # Section-less entries don't have markers. + for line in content.splitlines(): + line = line.strip() + if not line or line.startswith("#"): # Comment; ignored. + continue + if line.startswith("[") and line.endswith("]"): # A section header. + extra, _, marker = line.strip("[]").partition(":") + continue + yield RequiresEntry(requirement=line, extra=extra, marker=marker) + + def _iter_egg_info_extras(self) -> Iterable[str]: + """Get extras from the egg-info directory.""" + known_extras = {""} + for entry in self._iter_requires_txt_entries(): + if entry.extra in known_extras: + continue + known_extras.add(entry.extra) + yield entry.extra + + def _iter_egg_info_dependencies(self) -> Iterable[str]: + """Get distribution dependencies from the egg-info directory. + + To ease parsing, this converts a legacy dependency entry into a PEP 508 + requirement string. Like ``_iter_requires_txt_entries()``, there is code + in ``importlib.metadata`` that does mostly the same, but not do exactly + what we need. + + Namely, ``importlib.metadata`` does not normalize the extra name before + putting it into the requirement string, which causes marker comparison + to fail because the dist-info format do normalize. This is consistent in + all currently available PEP 517 backends, although not standardized. + """ + for entry in self._iter_requires_txt_entries(): + if entry.extra and entry.marker: + marker = f'({entry.marker}) and extra == "{safe_extra(entry.extra)}"' + elif entry.extra: + marker = f'extra == "{safe_extra(entry.extra)}"' + elif entry.marker: + marker = entry.marker + else: + marker = "" + if marker: + yield f"{entry.requirement} ; {marker}" + else: + yield entry.requirement + + def _add_egg_info_requires(self, metadata: email.message.Message) -> None: + """Add egg-info requires.txt information to the metadata.""" + if not metadata.get_all("Requires-Dist"): + for dep in self._iter_egg_info_dependencies(): + metadata["Requires-Dist"] = dep + if not metadata.get_all("Provides-Extra"): + for extra in self._iter_egg_info_extras(): + metadata["Provides-Extra"] = extra + class BaseEnvironment: """An environment containing distributions to introspect.""" @@ -470,8 +589,8 @@ class BaseEnvironment: """ raise NotImplementedError() - def iter_distributions(self) -> Iterator["BaseDistribution"]: - """Iterate through installed distributions.""" + def iter_all_distributions(self) -> Iterator[BaseDistribution]: + """Iterate through all installed distributions without any filtering.""" for dist in self._iter_distributions(): # Make sure the distribution actually comes from a valid Python # packaging distribution. Pip's AdjacentTempDirectory leaves folders @@ -501,6 +620,11 @@ class BaseEnvironment: ) -> Iterator[BaseDistribution]: """Return a list of installed distributions. + This is based on ``iter_all_distributions()`` with additional filtering + options. Note that ``iter_installed_distributions()`` without arguments + is *not* equal to ``iter_all_distributions()``, since some of the + configurations exclude packages by default. + :param local_only: If True (default), only return installations local to the current virtualenv, if in a virtualenv. :param skip: An iterable of canonicalized project names to ignore; @@ -510,7 +634,7 @@ class BaseEnvironment: :param user_only: If True, only report installations in the user site directory. """ - it = self.iter_distributions() + it = self.iter_all_distributions() if local_only: it = (d for d in it if d.local) if not include_editables: diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py new file mode 100644 index 0000000..5e7af9f --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py @@ -0,0 +1,4 @@ +from ._dists import Distribution +from ._envs import Environment + +__all__ = ["Distribution", "Environment"] diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0bd65c86b153ba3646bf4a12e47da141383bc06 GIT binary patch literal 318 zcmYjM%}T^D5Kh`{741HQ7cV_%?;;|&-o(q|r36B{$<|@>N0JtOB%i~#=+%?2;K|8? z;J|$Iee=x>j9ahI2*&hzu{&V>%Hn?%DDE-iC4wZ9YGP->Jie*``#p=pAA5pa4gu#Ul*>B#u5wD3Jg<{y zMmwG9ypA(&T}Ib7SBxL`@z}fAqz`ixiEz}Cv4~`Q8u{Sj^KgW4L?YUv^NN0TMHgf|A}@)>tC{&N@v4_LKw#~^WR!Hv>$%PL%8dU7N)XIZApsW!#1*JD`U&y;2IR9R>y zGUIbAnJOx6T&^a=LOL$E;|yZxHOw3wkTp`0+k*qfOW`dY9Gt0Ys&ctf?2?9^NLETI z7>D1Y&?TE7V1@vgTUL_IR0+o)y(j?}6Bu~>dSiilm z-B(4G%L0C+_`(=%Adaofr>_I^7OwxTAKe?ju+rG^b7$1)__17!twSXzMjdh?Q#+GJ zO{Zf!xj22JCS$9d{J7%TF+Y@cT&Zd=^(dh`_b$r2x32hJiZY?V!)jT_B`@R-g&Se( zL}%L<%{C;>|7K?rTsK>^5l>B@HcFw{uHsa8DsGVK4U%5Nc6N1byV2|qBGV-;K{ZI~ zBu&X_n%2EEEwq^Dbnd6=k8_@{G~F~6I)gX?4Jv8evTj*t4CP?1)Al9`f1*&l1DY6? z;!J`#jCwm^)Y=KXrVfRV<5IT7T&ku2%mptoW<+$}0xMhm7ZmzSh3%+nwBt88MWY!=#dgHiI1*v zA%_fIlEYpS}Bg$M5Q=V2D6sC06t{6uo^GU9be@B^Fp%-mn*&~jDhU&B&*}okIgq7sSGPS(`-8CV9s+$}H3-cu)N!LX ze1~3x8cdn$G}jrYg3&EYROoM+ckrrX!t_#Ow4mB(3>Ur(&ZDCUjS-&x`a}ZD%Z-43 zrQyt|k=JvJib{gbno>>tpyCUzaz4p1txNW7>1L?qr^8R~GECMS$(tej0R=MBr|q~w zIs~UY<(UIuG`5<#_wBM;u17CBF7=5AuEA^2GQK3lms`!o!0FexBLG9T-Q+w literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93319e5b5d640402056b2e507920aa38cb9814c7 GIT binary patch literal 8380 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py new file mode 100644 index 0000000..e087980 --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py @@ -0,0 +1,43 @@ +import importlib.metadata +from typing import Any, Optional, Protocol, cast + + +class BasePath(Protocol): + """A protocol that various path objects conform. + + This exists because importlib.metadata uses both ``pathlib.Path`` and + ``zipfile.Path``, and we need a common base for type hints (Union does not + work well since ``zipfile.Path`` is too new for our linter setup). + + This does not mean to be exhaustive, but only contains things that present + in both classes *that we need*. + """ + + @property + def name(self) -> str: + raise NotImplementedError() + + @property + def parent(self) -> "BasePath": + raise NotImplementedError() + + +def get_info_location(d: importlib.metadata.Distribution) -> Optional[BasePath]: + """Find the path to the distribution's metadata directory. + + HACK: This relies on importlib.metadata's private ``_path`` attribute. Not + all distributions exist on disk, so importlib.metadata is correct to not + expose the attribute as public. But pip's code base is old and not as clean, + so we do this to avoid having to rewrite too many things. Hopefully we can + eliminate this some day. + """ + return getattr(d, "_path", None) + + +def get_dist_name(dist: importlib.metadata.Distribution) -> str: + """Get the distribution's project name. + + The ``name`` attribute is only available in Python 3.10 or later. We are + targeting exactly that, but Mypy does not know this. + """ + return cast(Any, dist).name diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py new file mode 100644 index 0000000..fbf9a93 --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py @@ -0,0 +1,206 @@ +import email.message +import importlib.metadata +import os +import pathlib +import zipfile +from typing import ( + Collection, + Dict, + Iterable, + Iterator, + Mapping, + Optional, + Sequence, + cast, +) + +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import InvalidWheel, UnsupportedWheel +from pip._internal.metadata.base import ( + BaseDistribution, + BaseEntryPoint, + DistributionVersion, + InfoPath, + Wheel, +) +from pip._internal.utils.misc import normalize_path +from pip._internal.utils.packaging import safe_extra +from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file + +from ._compat import BasePath, get_dist_name + + +class WheelDistribution(importlib.metadata.Distribution): + """An ``importlib.metadata.Distribution`` read from a wheel. + + Although ``importlib.metadata.PathDistribution`` accepts ``zipfile.Path``, + its implementation is too "lazy" for pip's needs (we can't keep the ZipFile + handle open for the entire lifetime of the distribution object). + + This implementation eagerly reads the entire metadata directory into the + memory instead, and operates from that. + """ + + def __init__( + self, + files: Mapping[pathlib.PurePosixPath, bytes], + info_location: pathlib.PurePosixPath, + ) -> None: + self._files = files + self.info_location = info_location + + @classmethod + def from_zipfile( + cls, + zf: zipfile.ZipFile, + name: str, + location: str, + ) -> "WheelDistribution": + info_dir, _ = parse_wheel(zf, name) + paths = ( + (name, pathlib.PurePosixPath(name.split("/", 1)[-1])) + for name in zf.namelist() + if name.startswith(f"{info_dir}/") + ) + files = { + relpath: read_wheel_metadata_file(zf, fullpath) + for fullpath, relpath in paths + } + info_location = pathlib.PurePosixPath(location, info_dir) + return cls(files, info_location) + + def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]: + # Only allow iterating through the metadata directory. + if pathlib.PurePosixPath(str(path)) in self._files: + return iter(self._files) + raise FileNotFoundError(path) + + def read_text(self, filename: str) -> Optional[str]: + try: + data = self._files[pathlib.PurePosixPath(filename)] + except KeyError: + return None + try: + text = data.decode("utf-8") + except UnicodeDecodeError as e: + wheel = self.info_location.parent + error = f"Error decoding metadata for {wheel}: {e} in {filename} file" + raise UnsupportedWheel(error) + return text + + +class Distribution(BaseDistribution): + def __init__( + self, + dist: importlib.metadata.Distribution, + info_location: Optional[BasePath], + installed_location: Optional[BasePath], + ) -> None: + self._dist = dist + self._info_location = info_location + self._installed_location = installed_location + + @classmethod + def from_directory(cls, directory: str) -> BaseDistribution: + info_location = pathlib.Path(directory) + dist = importlib.metadata.Distribution.at(info_location) + return cls(dist, info_location, info_location.parent) + + @classmethod + def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: + try: + with wheel.as_zipfile() as zf: + dist = WheelDistribution.from_zipfile(zf, name, wheel.location) + except zipfile.BadZipFile as e: + raise InvalidWheel(wheel.location, name) from e + except UnsupportedWheel as e: + raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") + return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location)) + + @property + def location(self) -> Optional[str]: + if self._info_location is None: + return None + return str(self._info_location.parent) + + @property + def info_location(self) -> Optional[str]: + if self._info_location is None: + return None + return str(self._info_location) + + @property + def installed_location(self) -> Optional[str]: + if self._installed_location is None: + return None + return normalize_path(str(self._installed_location)) + + def _get_dist_name_from_location(self) -> Optional[str]: + """Try to get the name from the metadata directory name. + + This is much faster than reading metadata. + """ + if self._info_location is None: + return None + stem, suffix = os.path.splitext(self._info_location.name) + if suffix not in (".dist-info", ".egg-info"): + return None + return stem.split("-", 1)[0] + + @property + def canonical_name(self) -> NormalizedName: + name = self._get_dist_name_from_location() or get_dist_name(self._dist) + return canonicalize_name(name) + + @property + def version(self) -> DistributionVersion: + return parse_version(self._dist.version) + + def is_file(self, path: InfoPath) -> bool: + return self._dist.read_text(str(path)) is not None + + def iter_distutils_script_names(self) -> Iterator[str]: + # A distutils installation is always "flat" (not in e.g. egg form), so + # if this distribution's info location is NOT a pathlib.Path (but e.g. + # zipfile.Path), it can never contain any distutils scripts. + if not isinstance(self._info_location, pathlib.Path): + return + for child in self._info_location.joinpath("scripts").iterdir(): + yield child.name + + def read_text(self, path: InfoPath) -> str: + content = self._dist.read_text(str(path)) + if content is None: + raise FileNotFoundError(path) + return content + + def iter_entry_points(self) -> Iterable[BaseEntryPoint]: + # importlib.metadata's EntryPoint structure sasitfies BaseEntryPoint. + return self._dist.entry_points + + def _metadata_impl(self) -> email.message.Message: + # From Python 3.10+, importlib.metadata declares PackageMetadata as the + # return type. This protocol is unfortunately a disaster now and misses + # a ton of fields that we need, including get() and get_payload(). We + # rely on the implementation that the object is actually a Message now, + # until upstream can improve the protocol. (python/cpython#94952) + return cast(email.message.Message, self._dist.metadata) + + def iter_provided_extras(self) -> Iterable[str]: + return ( + safe_extra(extra) for extra in self.metadata.get_all("Provides-Extra", []) + ) + + def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: + contexts: Sequence[Dict[str, str]] = [{"extra": safe_extra(e)} for e in extras] + for req_string in self.metadata.get_all("Requires-Dist", []): + req = Requirement(req_string) + if not req.marker: + yield req + elif not extras and req.marker.evaluate({"extra": ""}): + yield req + elif any(req.marker.evaluate(context) for context in contexts): + yield req diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py new file mode 100644 index 0000000..d5fcfdb --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py @@ -0,0 +1,180 @@ +import functools +import importlib.metadata +import os +import pathlib +import sys +import zipfile +import zipimport +from typing import Iterator, List, Optional, Sequence, Set, Tuple + +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name + +from pip._internal.metadata.base import BaseDistribution, BaseEnvironment +from pip._internal.models.wheel import Wheel +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.filetypes import WHEEL_EXTENSION + +from ._compat import BasePath, get_dist_name, get_info_location +from ._dists import Distribution + + +def _looks_like_wheel(location: str) -> bool: + if not location.endswith(WHEEL_EXTENSION): + return False + if not os.path.isfile(location): + return False + if not Wheel.wheel_file_re.match(os.path.basename(location)): + return False + return zipfile.is_zipfile(location) + + +class _DistributionFinder: + """Finder to locate distributions. + + The main purpose of this class is to memoize found distributions' names, so + only one distribution is returned for each package name. At lot of pip code + assumes this (because it is setuptools's behavior), and not doing the same + can potentially cause a distribution in lower precedence path to override a + higher precedence one if the caller is not careful. + + Eventually we probably want to make it possible to see lower precedence + installations as well. It's useful feature, after all. + """ + + FoundResult = Tuple[importlib.metadata.Distribution, Optional[BasePath]] + + def __init__(self) -> None: + self._found_names: Set[NormalizedName] = set() + + def _find_impl(self, location: str) -> Iterator[FoundResult]: + """Find distributions in a location.""" + # Skip looking inside a wheel. Since a package inside a wheel is not + # always valid (due to .data directories etc.), its .dist-info entry + # should not be considered an installed distribution. + if _looks_like_wheel(location): + return + # To know exactly where we find a distribution, we have to feed in the + # paths one by one, instead of dumping the list to importlib.metadata. + for dist in importlib.metadata.distributions(path=[location]): + normalized_name = canonicalize_name(get_dist_name(dist)) + if normalized_name in self._found_names: + continue + self._found_names.add(normalized_name) + info_location = get_info_location(dist) + yield dist, info_location + + def find(self, location: str) -> Iterator[BaseDistribution]: + """Find distributions in a location. + + The path can be either a directory, or a ZIP archive. + """ + for dist, info_location in self._find_impl(location): + if info_location is None: + installed_location: Optional[BasePath] = None + else: + installed_location = info_location.parent + yield Distribution(dist, info_location, installed_location) + + def find_linked(self, location: str) -> Iterator[BaseDistribution]: + """Read location in egg-link files and return distributions in there. + + The path should be a directory; otherwise this returns nothing. This + follows how setuptools does this for compatibility. The first non-empty + line in the egg-link is read as a path (resolved against the egg-link's + containing directory if relative). Distributions found at that linked + location are returned. + """ + path = pathlib.Path(location) + if not path.is_dir(): + return + for child in path.iterdir(): + if child.suffix != ".egg-link": + continue + with child.open() as f: + lines = (line.strip() for line in f) + target_rel = next((line for line in lines if line), "") + if not target_rel: + continue + target_location = str(path.joinpath(target_rel)) + for dist, info_location in self._find_impl(target_location): + yield Distribution(dist, info_location, path) + + def _find_eggs_in_dir(self, location: str) -> Iterator[BaseDistribution]: + from pip._vendor.pkg_resources import find_distributions + + from pip._internal.metadata import pkg_resources as legacy + + with os.scandir(location) as it: + for entry in it: + if not entry.name.endswith(".egg"): + continue + for dist in find_distributions(entry.path): + yield legacy.Distribution(dist) + + def _find_eggs_in_zip(self, location: str) -> Iterator[BaseDistribution]: + from pip._vendor.pkg_resources import find_eggs_in_zip + + from pip._internal.metadata import pkg_resources as legacy + + try: + importer = zipimport.zipimporter(location) + except zipimport.ZipImportError: + return + for dist in find_eggs_in_zip(importer, location): + yield legacy.Distribution(dist) + + def find_eggs(self, location: str) -> Iterator[BaseDistribution]: + """Find eggs in a location. + + This actually uses the old *pkg_resources* backend. We likely want to + deprecate this so we can eventually remove the *pkg_resources* + dependency entirely. Before that, this should first emit a deprecation + warning for some versions when using the fallback since importing + *pkg_resources* is slow for those who don't need it. + """ + if os.path.isdir(location): + yield from self._find_eggs_in_dir(location) + if zipfile.is_zipfile(location): + yield from self._find_eggs_in_zip(location) + + +@functools.lru_cache(maxsize=None) # Warn a distribution exactly once. +def _emit_egg_deprecation(location: Optional[str]) -> None: + deprecated( + reason=f"Loading egg at {location} is deprecated.", + replacement="to use pip for package installation.", + gone_in=None, + ) + + +class Environment(BaseEnvironment): + def __init__(self, paths: Sequence[str]) -> None: + self._paths = paths + + @classmethod + def default(cls) -> BaseEnvironment: + return cls(sys.path) + + @classmethod + def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment: + if paths is None: + return cls(sys.path) + return cls(paths) + + def _iter_distributions(self) -> Iterator[BaseDistribution]: + finder = _DistributionFinder() + for location in self._paths: + yield from finder.find(location) + for dist in finder.find_eggs(location): + # _emit_egg_deprecation(dist.location) # TODO: Enable this. + yield dist + # This must go last because that's how pkg_resources tie-breaks. + yield from finder.find_linked(location) + + def get_distribution(self, name: str) -> Optional[BaseDistribution]: + matches = ( + distribution + for distribution in self.iter_all_distributions() + if distribution.canonical_name == canonicalize_name(name) + ) + return next(matches, None) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/metadata/pkg_resources.py b/sbsheriff/Lib/site-packages/pip/_internal/metadata/pkg_resources.py index d39f0ba..bf79ba1 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/metadata/pkg_resources.py @@ -2,7 +2,6 @@ import email.message import email.parser import logging import os -import pathlib import zipfile from typing import Collection, Iterable, Iterator, List, Mapping, NamedTuple, Optional @@ -12,7 +11,8 @@ from pip._vendor.packaging.utils import NormalizedName, canonicalize_name from pip._vendor.packaging.version import parse as parse_version from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel -from pip._internal.utils.misc import display_path +from pip._internal.utils.egg_link import egg_link_path_from_location +from pip._internal.utils.misc import display_path, normalize_path from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file from .base import ( @@ -73,7 +73,7 @@ class Distribution(BaseDistribution): self._dist = dist @classmethod - def from_directory(cls, directory: str) -> "Distribution": + def from_directory(cls, directory: str) -> BaseDistribution: dist_dir = directory.rstrip(os.sep) # Build a PathMetadata object, from path to metadata. :wink: @@ -93,14 +93,7 @@ class Distribution(BaseDistribution): return cls(dist) @classmethod - def from_wheel(cls, wheel: Wheel, name: str) -> "Distribution": - """Load the distribution from a given wheel. - - :raises InvalidWheel: Whenever loading of the wheel causes a - :py:exc:`zipfile.BadZipFile` exception to be thrown. - :raises UnsupportedWheel: If the wheel is a valid zip, but malformed - internally. - """ + def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: try: with wheel.as_zipfile() as zf: info_dir, _ = parse_wheel(zf, name) @@ -124,6 +117,17 @@ class Distribution(BaseDistribution): def location(self) -> Optional[str]: return self._dist.location + @property + def installed_location(self) -> Optional[str]: + egg_link = egg_link_path_from_location(self.raw_name) + if egg_link: + location = egg_link + elif self.location: + location = self.location + else: + return None + return normalize_path(location) + @property def info_location(self) -> Optional[str]: return self._dist.egg_info @@ -149,14 +153,8 @@ class Distribution(BaseDistribution): def is_file(self, path: InfoPath) -> bool: return self._dist.has_metadata(str(path)) - def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]: - name = str(path) - if not self._dist.has_metadata(name): - raise FileNotFoundError(name) - if not self._dist.isdir(name): - raise NotADirectoryError(name) - for child in self._dist.metadata_listdir(name): - yield pathlib.PurePosixPath(path, child) + def iter_distutils_script_names(self) -> Iterator[str]: + yield from self._dist.metadata_listdir("scripts") def read_text(self, path: InfoPath) -> str: name = str(path) @@ -173,8 +171,7 @@ class Distribution(BaseDistribution): name, _, value = str(entry_point).partition("=") yield EntryPoint(name=name.strip(), value=value.strip(), group=group) - @property - def metadata(self) -> email.message.Message: + def _metadata_impl(self) -> email.message.Message: """ :raises NoneMetadataError: if the distribution reports `has_metadata()` True but `get_metadata()` returns None. @@ -217,6 +214,10 @@ class Environment(BaseEnvironment): def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment: return cls(pkg_resources.WorkingSet(paths)) + def _iter_distributions(self) -> Iterator[BaseDistribution]: + for dist in self._ws: + yield Distribution(dist) + def _search_distribution(self, name: str) -> Optional[BaseDistribution]: """Find a distribution matching the ``name`` in the environment. @@ -224,7 +225,7 @@ class Environment(BaseEnvironment): match the behavior of ``pkg_resources.get_distribution()``. """ canonical_name = canonicalize_name(name) - for dist in self.iter_distributions(): + for dist in self.iter_all_distributions(): if dist.canonical_name == canonical_name: return dist return None @@ -250,7 +251,3 @@ class Environment(BaseEnvironment): except pkg_resources.DistributionNotFound: return None return self._search_distribution(name) - - def _iter_distributions(self) -> Iterator[BaseDistribution]: - for dist in self._ws: - yield Distribution(dist) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-310.pyc index b74b0ddc63e4849ca4ae406846eef8b561e0db43..f4357798563eced158df56fbbf1a1d0905ea8184 100644 GIT binary patch delta 19 ZcmZo=YGvZi=jG*M0D{uP@)Nm#0RSaI1eyQ< delta 19 YcmZo=YGvZi=jG*M0D@|D$%)**03tyH{r~^~ diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-310.pyc index 3ee31f64e51f68f8b2d23c07d4613c96759c4ea5..01745ee2d17ae06f0e0cb165c184ac020bed3387 100644 GIT binary patch delta 20 ZcmZqWZsq3A=jG*M0D{uP@*BCUSOF@e1W^D0 delta 20 ZcmZqWZsq3A=jG*M0D@|D$&K7qtN7%g5Z?Fp?RtN*i?LHXb_i(*R9c{+NlH^1XaY@BT0upB)PoBosoxqoa!qQDf4mami|?%Vj9dSV)176Or&wE(N&X1jRUI`;X60T{chv8ZNp9X zQ3&!bn}D~1LD=Kx8iRW0yxBF4JUi@C5kG$#fNmQpHg2M&l%+r5+6Mpp`dc;EY zA+q-)bc{ERWrh#O$CON;z>lj5v_%4D{eE$YsY%Li#98Ph3$j`7yhz^Edd`IY+nX2i zXX+``!%_Ig&-we%rsy2C7q0n(_7fyd!!3X0f%{Q(3{1)vcR1(&aFcJ^g5Tkm_c!+* zWK|bt`m$gKX%SbGZ6G3|% z(1dCHPT_@cDteMEI!WzM@zqlVCIKht<$XE4k4g9;yjhtgt)3}Ub146p;vB^;P>2h} zc!q@hTvNe`U=*h~xs%BA5mRL{A4Wh=YDFf_B}q$dCI1erORc6{ z>cktcQTk*``%(hxAOY>98biQ+-ZD{^k*DZl>xQX)@NT(SqRC`}mQhh%Dj?`~@g)?$ zf-B`Wj@^wC*-E#P7FUwEIp63%ssqTkK3JQvZCmoW7BU8ewG^!i(#=~{tJj{ B9=QMj delta 1800 zcmZ`)&u<$=6yBNL9q+Dx#IcjcP6DDpi8g{1lQv07p`mS38X*fviG-!baXf3VakJK} z6SdS*q$Y=QD3=j%1R*XxfP{Li)T-jZg#rf-XgMJM1Fj^c@ZQ)?l{EEgzIpTJo0<2% zdAt5$a(gP_$K#F$zpEqJ^3R#?6XVuK9ELN{f@=VtRv=s}P)-WEP4VGLu6qVIpqZZO z8Ci|9P9N#?7N?aMx4E-r7MK^|QSe)y;n@|M)qrn#CWpRa@EDJ88JncwfUmDNLvP=-ZB9Vt}STdFwkzA;wW??r@aLDGMcX-j03nVGy<<)X*1MZ zu1k=2odH?1qtO7>Wfmih$d>)0W5ZAdF(>cGhU9&_FW;ms(j?s2)H{~BsdIM2gv=xP zgEnuU-id7Qxnf*Koav!OI3-8{SkxetIJ*zqk?%W4-ivgj7zU%MwX_<@Q3DxjAV>{_ zsF|Fo2xwj$1CGlC2%vSvcub3%L>!m*oZ)v?fE6SFC^2>)w)1gvu^gOVt@vZbreEaM za?{oG`MetwJ-BTWp%)-DR!f&WF^OXnVM2~ZhuEuVo|ON^GbgY*XQ2h70G0;nF$yUf z+mzCWRHy$kgFav;-C>Mw(}?pAO*~HqqarTEOx0l4xK<-pjd54 zqcs8G%NsH8=nM`|0|5Ogv{h_VXzg2rL9WTe@e89Jx>9TgnbQZ*PlE5N{4zf2zJ{|Z zTeUZyEnY{^5h%j00K=p%hZBEJyn$X-p+uk@-DJ?-9~f?U4gF_iu4icqDRV9n1L&Fq zfVEFU7aA+RUl&hG?YjK2=fY@*uToQIJt?(MMTi8?q=^}j&Ala>CwQ7?U`Ka28<< zz}3a0DGc0o1itY~-*)Aw8X7@g3;{1TH1LHGn7F|5KJW^bVB!w6pik3eYM?p4dref{epyZ*|5I%gU zn^%Midl@PFY92FgpZ5V;H3U^kAK{0@}M3mm%Hh;}JyF5{ diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-310.pyc index 578e0aa357e71b2c8b1ef4470b33a85cfd88dfb4..40a286c2e4a896d274b932ff6ff2941117d8f505 100644 GIT binary patch delta 20 acmdlax=EBfpO=@50SHPD%Wvdf&IJH783geF delta 20 acmdlax=EBfpO=@50SKzqB{y;}=K=sPeFRki diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-310.pyc index 5bf32a1f6b705d69f0fd10a0f26161e625949ae7..3b0e579ee6eab8375beb341c0ee7c78f43848101 100644 GIT binary patch delta 20 acmX@dd5)7ipO=@50SHPD%Wvd9%mM&4!v!Y* delta 20 acmX@dd5)7ipO=@50SKzqB{y;(W&r>)Cj^TC diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e591b75c0072eca76e8e790e55e57b52a16c89de GIT binary patch literal 1740 zcmZ`(OK%%D5GJ|Q?&{UFid`USix|BGN>Mr27KV``28srS4mJuD3l+qANhxdZLnbLV z7L-e6pt<(k6tIu^9sL))_S9PsJ@t~#>`JK&xD+@Va)-ljz8Oy0?Y0Pv+3ydMFF^YP z7n{R_#S@t383;)v%}7oonzM-IUgS~SV;RpIQKQnm%+G@;sC1r%c{6HK@->kS>0c7* zFIm)*!4c_)e}X^K_nh}tapCwunphVesk50X64j^fu2kcAmRX^S^Hi5bt_lm=Z6VH; zHfdQ10n6Sug|Ts#9m2s>D>O>b@8$?#@dTzh1ffVoC5f1%%2WIv88gYGcgdrM@+DVX zHdLTO)f_YU#-%TVOTMIld2^r1P&VOATecvQ_B#}@1zd+}T59XI(i)l2|3Nbe0|@JZ zI?kss4JKhh7eoM`;FAs^xNUKpk3MtUsBEm8aO4fq9r*jFeEQ|+I|Iawj;u~!j1JWK z$k2y3End7zgZF)R1sa2m(8iKlD+0Hai8l)AOro#hPH{?l7b~9 zc#kX?(8`DN?P0ki%O8uZj3tCHE_cSI-syAKy|EiLQzIlmhO%s83YD=+x-eHZma&c9 z`|mb|dSP{J`YrtdV0VEn;UFC2$7PwhZV4Gkfl!g9#i{GgAWOo`rqe7%e-mZF+SsVO z_FNzKYp0H9@X`4OXjc+nOOhFV2k-H;GF9?x(Z#*3&598#Ao#`fKy0zl4>{+d=l|8| z^%$q~hqq;Hqw3Z^5(?+n19i+7=FRMYkkpc&$(UA8DSSmv=mA+$%a%m)*Bp3n3>|%Z z!v|Ij`nU_zdEQ$Tau^o zDvi%TV?g>-6!<7>4cXV*ARfXr?}1>9(H7;DzvWH;@A>`zhd1nZ@SzoPu7q$cA>d8U zGSoXloXz5_{-QbFfo)Esf7ed3*chm%=cUw`Bjn20h)3lh>uF!LJb@U0)Gyt9oS?WREPQYrA$NCgnQbmjNz^0;V lWxeh*19(R`*OgnxffwF}(1m+72m4rr70fNtVeq3p?_W?o$%+5~ literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-310.pyc index 562a769cc6776552a5b7e61db15b7a3a51892d1b..9219012447ee656489272792d312b641166f1898 100644 GIT binary patch delta 4021 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 P?)5a{rxF99o<8M2PJ2F4 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-310.pyc index 02d233472a82f3272c91da7c98d31e04bcf7b604..99caa12722f62e6f9c19d0785d6b1dc96d10f317 100644 GIT binary patch delta 20 acmZqWXyxF}=jG*M0D{uP@*BB-F#`ZAHU!B4 delta 20 ZcmZqWXyxF}=jG*M0D@|D$&K8Y&$Iq*OKIWztEM?$xBoe{N~Z?TiF7rpLIc~s?6(O6Nq z^$XG^r%-|t?RW&((1vZ&RxFSl(TJcovp{eQSDW0!Rqx5&ha&c4tfEgs;f~nk(04#v z(4sbdAZO%~aB4$db=GM~d2vI@4B!ixTzp0)2g(iz9#Tg>iHIPU6jJijo7^%qN2{6F z!tt85X4T|HVLEzFSQq;Oi?UU7SiV?knme3Z{F(AF_Aev;>_T#n&H3^9RF8lU#()lF zm1UqIyY5);m3`Bx^`Uxrc}~9TyYmKhT-9>zf8LSxsAEGe`s0w6S^ogmWHu0mf;Hyv3TCmy%jhqz&Y) zWGpfOQbocbLIy^? zmorO|Ap^r=5pHG?3y?xo0|O>&@VVI+nE+)pnUPFFD76G>0y*H8cpA`o@wxfMCGiDC zscET2MX4$AC5h?wleh5wmp6kO4!7YJXK`skL4Hw5YD&oDOZ+X;<{&j7mlauo2vES? uVoA!+&ndE*Tqs~6%g@Hh^q&ienV7i#Nr@J*0~Kg;7de0wJ5D|(FbM$PJ5v1s diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/direct_url.py b/sbsheriff/Lib/site-packages/pip/_internal/models/direct_url.py index 92060d4..e75feda 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/models/direct_url.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/models/direct_url.py @@ -74,14 +74,10 @@ class VcsInfo: vcs: str, commit_id: str, requested_revision: Optional[str] = None, - resolved_revision: Optional[str] = None, - resolved_revision_type: Optional[str] = None, ) -> None: self.vcs = vcs self.requested_revision = requested_revision self.commit_id = commit_id - self.resolved_revision = resolved_revision - self.resolved_revision_type = resolved_revision_type @classmethod def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["VcsInfo"]: @@ -91,8 +87,6 @@ class VcsInfo: vcs=_get_required(d, str, "vcs"), commit_id=_get_required(d, str, "commit_id"), requested_revision=_get(d, str, "requested_revision"), - resolved_revision=_get(d, str, "resolved_revision"), - resolved_revision_type=_get(d, str, "resolved_revision_type"), ) def _to_dict(self) -> Dict[str, Any]: @@ -100,8 +94,6 @@ class VcsInfo: vcs=self.vcs, requested_revision=self.requested_revision, commit_id=self.commit_id, - resolved_revision=self.resolved_revision, - resolved_revision_type=self.resolved_revision_type, ) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/installation_report.py b/sbsheriff/Lib/site-packages/pip/_internal/models/installation_report.py new file mode 100644 index 0000000..965f095 --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_internal/models/installation_report.py @@ -0,0 +1,53 @@ +from typing import Any, Dict, Sequence + +from pip._vendor.packaging.markers import default_environment + +from pip import __version__ +from pip._internal.req.req_install import InstallRequirement + + +class InstallationReport: + def __init__(self, install_requirements: Sequence[InstallRequirement]): + self._install_requirements = install_requirements + + @classmethod + def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]: + assert ireq.download_info, f"No download_info for {ireq}" + res = { + # PEP 610 json for the download URL. download_info.archive_info.hash may + # be absent when the requirement was installed from the wheel cache + # and the cache entry was populated by an older pip version that did not + # record origin.json. + "download_info": ireq.download_info.to_dict(), + # is_direct is true if the requirement was a direct URL reference (which + # includes editable requirements), and false if the requirement was + # downloaded from a PEP 503 index or --find-links. + "is_direct": bool(ireq.original_link), + # requested is true if the requirement was specified by the user (aka + # top level requirement), and false if it was installed as a dependency of a + # requirement. https://peps.python.org/pep-0376/#requested + "requested": ireq.user_supplied, + # PEP 566 json encoding for metadata + # https://www.python.org/dev/peps/pep-0566/#json-compatible-metadata + "metadata": ireq.get_dist().metadata_dict, + } + if ireq.user_supplied and ireq.extras: + # For top level requirements, the list of requested extras, if any. + res["requested_extras"] = list(sorted(ireq.extras)) + return res + + def to_dict(self) -> Dict[str, Any]: + return { + "version": "0", + "pip_version": __version__, + "install": [ + self._install_req_to_dict(ireq) for ireq in self._install_requirements + ], + # https://peps.python.org/pep-0508/#environment-markers + # TODO: currently, the resolver uses the default environment to evaluate + # environment markers, so that is what we report here. In the future, it + # should also take into account options such as --python-version or + # --platform, perhaps under the form of an environment_override field? + # https://github.com/pypa/pip/issues/11198 + "environment": default_environment(), + } diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/link.py b/sbsheriff/Lib/site-packages/pip/_internal/models/link.py index 6069b27..8fd1c3d 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/models/link.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/models/link.py @@ -4,7 +4,16 @@ import os import posixpath import re import urllib.parse -from typing import TYPE_CHECKING, Dict, List, NamedTuple, Optional, Tuple, Union +from typing import ( + TYPE_CHECKING, + Dict, + List, + Mapping, + NamedTuple, + Optional, + Tuple, + Union, +) from pip._internal.utils.filetypes import WHEEL_EXTENSION from pip._internal.utils.hashes import Hashes @@ -17,12 +26,14 @@ from pip._internal.utils.models import KeyBasedCompareMixin from pip._internal.utils.urls import path_to_url, url_to_path if TYPE_CHECKING: - from pip._internal.index.collector import HTMLPage + from pip._internal.index.collector import IndexContent logger = logging.getLogger(__name__) -_SUPPORTED_HASHES = ("sha1", "sha224", "sha384", "sha256", "sha512", "md5") +# Order matters, earlier hashes have a precedence over later hashes for what +# we will pick to use. +_SUPPORTED_HASHES = ("sha512", "sha384", "sha256", "sha224", "sha1", "md5") class Link(KeyBasedCompareMixin): @@ -31,6 +42,7 @@ class Link(KeyBasedCompareMixin): __slots__ = [ "_parsed_url", "_url", + "_hashes", "comes_from", "requires_python", "yanked_reason", @@ -40,14 +52,15 @@ class Link(KeyBasedCompareMixin): def __init__( self, url: str, - comes_from: Optional[Union[str, "HTMLPage"]] = None, + comes_from: Optional[Union[str, "IndexContent"]] = None, requires_python: Optional[str] = None, yanked_reason: Optional[str] = None, cache_link_parsing: bool = True, + hashes: Optional[Mapping[str, str]] = None, ) -> None: """ :param url: url of the resource pointed to (href of the link) - :param comes_from: instance of HTMLPage where the link was found, + :param comes_from: instance of IndexContent where the link was found, or string. :param requires_python: String containing the `Requires-Python` metadata field, specified in PEP 345. This may be specified by @@ -64,6 +77,8 @@ class Link(KeyBasedCompareMixin): should be cached. PyPI index urls should generally have this set to False, for example. + :param hashes: A mapping of hash names to digests to allow us to + determine the validity of a download. """ # url can be a UNC windows share @@ -74,6 +89,7 @@ class Link(KeyBasedCompareMixin): # Store the url as a private attribute to prevent accidentally # trying to set a new value. self._url = url + self._hashes = hashes if hashes is not None else {} self.comes_from = comes_from self.requires_python = requires_python if requires_python else None @@ -171,16 +187,26 @@ class Link(KeyBasedCompareMixin): @property def hash(self) -> Optional[str]: + for hashname in _SUPPORTED_HASHES: + if hashname in self._hashes: + return self._hashes[hashname] + match = self._hash_re.search(self._url) if match: return match.group(2) + return None @property def hash_name(self) -> Optional[str]: + for hashname in _SUPPORTED_HASHES: + if hashname in self._hashes: + return hashname + match = self._hash_re.search(self._url) if match: return match.group(1) + return None @property diff --git a/sbsheriff/Lib/site-packages/pip/_internal/models/wheel.py b/sbsheriff/Lib/site-packages/pip/_internal/models/wheel.py index e091612..35c7037 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/models/wheel.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/models/wheel.py @@ -58,7 +58,10 @@ class Wheel: :raises ValueError: If none of the wheel's file tags match one of the supported tags. """ - return min(tags.index(tag) for tag in self.file_tags if tag in tags) + try: + return next(i for i, t in enumerate(tags) if t in self.file_tags) + except StopIteration: + raise ValueError() def find_most_preferred_tag( self, tags: List[Tag], tag_to_priority: Dict[Tag, int] diff --git a/sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-310.pyc index 931d2edb6faac6ad9a3f0efb4caf2e835e9a929a..568fb291768663c66838d4851e1e0745b3654a4f 100644 GIT binary patch delta 19 Zcmey#_>+-4pO=@50SHPD%TMHf2LLr=1#|!a delta 19 Zcmey#_>+-4pO=@50SKzqB`0#f0{}8(1lRxo diff --git a/sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-310.pyc index a1a947214346a2b978b4c7982ac4c5d5ff13bc8f..dba037b99764f69ce8b9168c59b516f8cf2b111e 100644 GIT binary patch delta 20 acmaE9_0ozvpO=@50SHPD%Wve4lLY`j_yuzS delta 20 acmaE9_0ozvpO=@50SKzqB{y=%$pQd8Tm;tu diff --git a/sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-310.pyc index 0f5d09735acb3134fd9401ab0b997b2ea0d8aa2f..9fd7eb38dbbaf4a5db74fb8d9f7ab76cbca32789 100644 GIT binary patch delta 83 zcmew)_Ct&}pO=@50SHPD%O@vJj1qBYND)X8Y+*N;&M-0&+qJd{duE^88@Tix?R^*F- z2AR%91yQ8MOxw}0DA7`;ov17-w36wes48l-mT5N{5p`P6bUtc`CT)rqZS9FsI+~eY zG$zLBxM`w z%qlQ?oK-V-7V>Ls1e}o7!D$@1Io4z?aNnDMzD&SpH*##0je&iFjq^Ig#RKkv+h!Bs zo?Ow`B%6Amv8jEXEx`TM z9vDnNB=?QJA!~`5Sbbxk>}PSW(I;26&`^Kb53l^=b$7NCzMU*2_j+8u46B8?)Z$`& zD@tv_<9L0Or}pZR7~14Xr?)QGg?trKQzK4fXv)_>%h%B$LOpd(mpss}1z$7hnvr4jtkpXMUWp%;bCAZYi?hIK`f4UuVPQ9C-E8#av9}xhc)J3(I zKU0n&h#f$Q6o~^x5rCiA@8VzLfyIy za##IWXpzh6kHSOPL#KFr;eAZ_0P!K>BSiB#TBvZfZ&6%RKNM%k+8`~yLiVnsLlHL+ z_!06ZAoTv*nm}U>k!`Y!s*AuAlnk+i;D`;xCgO$KcfflLPmHtlFC9~db_VcQUzN@; zZsCl(h))rCrvGbzj^T@4h`{_tHOq7JsKTYx?sV8rx6?`e>`E;j-6;7c&JGdp3~rWV yayBbAi$)bOiokBC*6n)gSd$4(lE zkcL{9(nwTjMeA}}6*XGZ+D+>srm@yz=^4?W4XwSjc`RDAr2{`57j4=W6Ldm!Xh(ZN zIw_{;l$fT|VusETgPSL3`Rpm7b1dXOi+GvOw~cL^Rao_bO&7FV<1wrAF07XLIaqaB z%+A2-B5P>33;9jf0_QxtH4aw$KfA;xSO@InahZsBw@Yl2O@VuXP4gDR;t}`3ondFe zz4)rZX4%{WgU#JH=@LZqYyqMLh?YlRkydHVfqq*suENNc0J(8OhQ=xR$UHKStf6%R z%|9ha_RyB~+#1^VwH`EvWWz{I^=J9vntU4eC3a!;cXo?luq89zyUVv2mxZ;%bNL)D zJMwv$E#ClUX&npOJwRt_t`3b_{i~yOuMwD1HTVu$>HeN;E;q@AnQ?0uEQkXRJWr`Q2&dloxBA`Veb$4Ug3NqcXR&# zZ4zI;gXvR)HiD~KJnq~8d7yr(bjS_$d*vbAA*-HW zehm{|N4$Y}8!_=19aLED8x-%VAF5rlIr^je3^{%eo%azRAg&;80+Qh0t9^{dCPH5_ zMs*v3-%xHLE+Ot9`Ur-2;%pAyDU1wvnV-3~3GIyFr%viuSGIA-4&p8%K!@gUjCASMx5y>RXvdf#U{;YHCc^K zkPKLQ;b?z zqmgvyrmzJw zXxeSIV{hdZ6af0Ph9Qd~i?N2WkAaaPW%30PCq)6qDhZ#&s>-O$0{^nqB9D-e0KNG5 r)QZfK_;^ibKR>_CdZHYxEDGtsfU%M~$igTz`H!3~qsV40`BjVnQm|8~ delta 293 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 k_{k87t6>rsbE9p|LA6zlYKgDW526y1z5oCK diff --git a/sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-310.pyc index c9c814be67d9d4c186cc0fee05d7f601ba0ece0e..fa38ca7c22223ae3f94628efb77ec7ade403b4b3 100644 GIT binary patch delta 75 zcmZ3=y@p#mpO=@50SHPD%O}6&XJB{?;vfT%tOF1iH%!#dWlP~q;Y?$mI75Mj(>*nB N bool: @contextmanager -def suppressed_cache_errors() -> Iterator[None]: +def suppressed_cache_errors() -> Generator[None, None, None]: """If we can't access the cache then we can just skip caching and process requests as if caching wasn't enabled. """ diff --git a/sbsheriff/Lib/site-packages/pip/_internal/network/download.py b/sbsheriff/Lib/site-packages/pip/_internal/network/download.py index 35bc970..79b82a5 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/network/download.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/network/download.py @@ -1,6 +1,6 @@ """Download files with progress indicators. """ -import cgi +import email.message import logging import mimetypes import os @@ -81,12 +81,13 @@ def parse_content_disposition(content_disposition: str, default_filename: str) - Parse the "filename" value from a Content-Disposition header, and return the default filename if the result is empty. """ - _type, params = cgi.parse_header(content_disposition) - filename = params.get("filename") + m = email.message.Message() + m["content-type"] = content_disposition + filename = m.get_param("filename") if filename: # We need to sanitize the filename to prevent directory traversal # in case the filename contains ".." path parts. - filename = sanitize_content_filename(filename) + filename = sanitize_content_filename(str(filename)) return filename or default_filename diff --git a/sbsheriff/Lib/site-packages/pip/_internal/network/lazy_wheel.py b/sbsheriff/Lib/site-packages/pip/_internal/network/lazy_wheel.py index c9e44d5..2d1ddaa 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/network/lazy_wheel.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/network/lazy_wheel.py @@ -5,7 +5,7 @@ __all__ = ["HTTPRangeRequestUnsupported", "dist_from_wheel_url"] from bisect import bisect_left, bisect_right from contextlib import contextmanager from tempfile import NamedTemporaryFile -from typing import Any, Dict, Iterator, List, Optional, Tuple +from typing import Any, Dict, Generator, List, Optional, Tuple from zipfile import BadZipfile, ZipFile from pip._vendor.packaging.utils import canonicalize_name @@ -135,11 +135,11 @@ class LazyZipOverHTTP: self._file.__enter__() return self - def __exit__(self, *exc: Any) -> Optional[bool]: - return self._file.__exit__(*exc) + def __exit__(self, *exc: Any) -> None: + self._file.__exit__(*exc) @contextmanager - def _stay(self) -> Iterator[None]: + def _stay(self) -> Generator[None, None, None]: """Return a context manager keeping the position. At the end of the block, seek back to original position. @@ -177,8 +177,8 @@ class LazyZipOverHTTP: def _merge( self, start: int, end: int, left: int, right: int - ) -> Iterator[Tuple[int, int]]: - """Return an iterator of intervals to be fetched. + ) -> Generator[Tuple[int, int], None, None]: + """Return a generator of intervals to be fetched. Args: start (int): Start of needed interval diff --git a/sbsheriff/Lib/site-packages/pip/_internal/network/session.py b/sbsheriff/Lib/site-packages/pip/_internal/network/session.py index cbe743b..e512ac7 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/network/session.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/network/session.py @@ -15,11 +15,23 @@ import subprocess import sys import urllib.parse import warnings -from typing import Any, Dict, Iterator, List, Mapping, Optional, Sequence, Tuple, Union +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Generator, + List, + Mapping, + Optional, + Sequence, + Tuple, + Union, +) from pip._vendor import requests, urllib3 -from pip._vendor.cachecontrol import CacheControlAdapter -from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.cachecontrol import CacheControlAdapter as _BaseCacheControlAdapter +from pip._vendor.requests.adapters import DEFAULT_POOLBLOCK, BaseAdapter +from pip._vendor.requests.adapters import HTTPAdapter as _BaseHTTPAdapter from pip._vendor.requests.models import PreparedRequest, Response from pip._vendor.requests.structures import CaseInsensitiveDict from pip._vendor.urllib3.connectionpool import ConnectionPool @@ -37,6 +49,12 @@ from pip._internal.utils.glibc import libc_ver from pip._internal.utils.misc import build_url_from_netloc, parse_netloc from pip._internal.utils.urls import url_to_path +if TYPE_CHECKING: + from ssl import SSLContext + + from pip._vendor.urllib3.poolmanager import PoolManager + + logger = logging.getLogger(__name__) SecureOrigin = Tuple[str, str, Optional[Union[int, str]]] @@ -233,6 +251,48 @@ class LocalFSAdapter(BaseAdapter): pass +class _SSLContextAdapterMixin: + """Mixin to add the ``ssl_context`` constructor argument to HTTP adapters. + + The additional argument is forwarded directly to the pool manager. This allows us + to dynamically decide what SSL store to use at runtime, which is used to implement + the optional ``truststore`` backend. + """ + + def __init__( + self, + *, + ssl_context: Optional["SSLContext"] = None, + **kwargs: Any, + ) -> None: + self._ssl_context = ssl_context + super().__init__(**kwargs) + + def init_poolmanager( + self, + connections: int, + maxsize: int, + block: bool = DEFAULT_POOLBLOCK, + **pool_kwargs: Any, + ) -> "PoolManager": + if self._ssl_context is not None: + pool_kwargs.setdefault("ssl_context", self._ssl_context) + return super().init_poolmanager( # type: ignore[misc] + connections=connections, + maxsize=maxsize, + block=block, + **pool_kwargs, + ) + + +class HTTPAdapter(_SSLContextAdapterMixin, _BaseHTTPAdapter): + pass + + +class CacheControlAdapter(_SSLContextAdapterMixin, _BaseCacheControlAdapter): + pass + + class InsecureHTTPAdapter(HTTPAdapter): def cert_verify( self, @@ -266,6 +326,7 @@ class PipSession(requests.Session): cache: Optional[str] = None, trusted_hosts: Sequence[str] = (), index_urls: Optional[List[str]] = None, + ssl_context: Optional["SSLContext"] = None, **kwargs: Any, ) -> None: """ @@ -318,13 +379,14 @@ class PipSession(requests.Session): secure_adapter = CacheControlAdapter( cache=SafeFileCache(cache), max_retries=retries, + ssl_context=ssl_context, ) self._trusted_host_adapter = InsecureCacheControlAdapter( cache=SafeFileCache(cache), max_retries=retries, ) else: - secure_adapter = HTTPAdapter(max_retries=retries) + secure_adapter = HTTPAdapter(max_retries=retries, ssl_context=ssl_context) self._trusted_host_adapter = insecure_adapter self.mount("https://", secure_adapter) @@ -374,7 +436,7 @@ class PipSession(requests.Session): # Mount wildcard ports for the same host. self.mount(build_url_from_netloc(host) + ":", self._trusted_host_adapter) - def iter_secure_origins(self) -> Iterator[SecureOrigin]: + def iter_secure_origins(self) -> Generator[SecureOrigin, None, None]: yield from SECURE_ORIGINS for host, port in self.pip_trusted_origins: yield ("*", host, "*" if port is None else port) @@ -403,7 +465,7 @@ class PipSession(requests.Session): continue try: - addr = ipaddress.ip_address(origin_host) + addr = ipaddress.ip_address(origin_host or "") network = ipaddress.ip_network(secure_host) except ValueError: # We don't have both a valid address or a valid network, so @@ -449,6 +511,8 @@ class PipSession(requests.Session): def request(self, method: str, url: str, *args: Any, **kwargs: Any) -> Response: # Allow setting a default timeout on a session kwargs.setdefault("timeout", self.timeout) + # Allow setting a default proxies on a session + kwargs.setdefault("proxies", self.proxies) # Dispatch the actual request return super().request(method, url, *args, **kwargs) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/network/utils.py b/sbsheriff/Lib/site-packages/pip/_internal/network/utils.py index 094cf1b..134848a 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/network/utils.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/network/utils.py @@ -1,4 +1,4 @@ -from typing import Dict, Iterator +from typing import Dict, Generator from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response @@ -56,7 +56,7 @@ def raise_for_status(resp: Response) -> None: def response_chunks( response: Response, chunk_size: int = CONTENT_CHUNK_SIZE -) -> Iterator[bytes]: +) -> Generator[bytes, None, None]: """Given a requests Response, provide the data chunks.""" try: # Special case for urllib3. diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-310.pyc index a69374b430b59cad7513d24a3a90387c833cf75e..1ec0dc1598ead07c0bab6d3021cf0e7a18030664 100644 GIT binary patch delta 19 ZcmX@gc$ASlpO=@50SHPD%TMIq1pqDI1lRxo delta 19 ZcmX@gc$ASlpO=@50SKzqB`0$40st!C1Uvu$ diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-310.pyc index 018961f61974ed3839e2b8b14fc133549a47ae55..00074de8cf490c399495573621d1d90281e60ec1 100644 GIT binary patch delta 20 acmZ1_ze=7vpO=@50SHPD%WveK&kq1IMg;Nz delta 20 acmZ1_ze=7vpO=@50SKzqB{y=<=LY~UssvU5 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-310.pyc index e10965f34e2dd98cab463e38aa979505812f01d7..1859e361b092b617f86e4f9f4d4e965996657b71 100644 GIT binary patch delta 109 zcmdmNu**O@pO=@50SHPD%O_i?F)%y^agc!skmCTv#U2Z_89CWf6;l{f7}J<1>oLZO vaJr}Fr4}WYB`Xu6?Xst diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-310.pyc index bbd87d859642b37e3dc360d3fc01e9d30f380e24..0bc542e1696dcdf24a44d7aa81f2431335100358 100644 GIT binary patch delta 4918 zcmZ`-Z)_Y#72nz0+uK{8&lku4&gXxz9Vcfyw&OpslO|5u=6~8WP0}PjwcTEB*7jZY z?wr{@hlF)6tpf_EX$d10K`F8MP_?R{P#38xd?`qvf&}Ups;umYFs)=M2Fx zs5xVMDl?rDD`bKgKg)kAyft_phQ~e%;7G1CPv(LySs<>oNM5QYk{eu*UD*w|%3^>> zryg1zpP$u z-T@4|8bH$`L?J3sZ|k=;C3Z_w*f1XrUDQUQGpVvo{M}IRnGPI3h8%^BAiWI%MZAjH zjBT7nCl@FiM7Dq-?5ipjW}wGF5p>^SVA}ZU5fUMdgze%xHA=SdMQwuY<~Oy(z#iyK z20XeUP*TgWwW>^ZZ6EK~C`> z$C?S{AII8vRUej~hp@>7ShJ(JlB>8u8n_miQwy3CgtolQQRY;TQtbgJ$S)t*JcnSRc(i1jhLyf_(GLQdjq>XF)(jRje@-z{n6NrrRHQ75 z+L<0%&cN4RaS^Z62TjMUtNjb$OhD^x` z30ja(Ih8_T#tb78WD?2A^MnmJ8dVm;{Dr1d#N~fz`e%#oCqfD)^mMyeVi{A!!5K8; z3I3nv#E@8>PHaa}N`;`!r=4VA**xrU5!RY`prtw1Kp;ojp+^fUfhf_r)ADhn@Z=E` z7j8L?R29M*KGnLpsTIhiyhig{rEj(-$S(ei)&pc@sjBT)q-^6rp%MM(1*v(qG{q*6 ziyy>l5YU$l3%aKi(s@&O*$d5@OoSP37!Z&%R@Pw+C^>^r50DJ{W}uy3(61tx_F|6_ z9~)X;cK%HJM)K6sm)lDu^Z-blWRGyUv%PI2N{gB!zLlXO<(zrZ_LuuA-`hDH6Knh; zN(v`F&aZYh4`N_=(R*TD7@}ce!rJeV<){-L8sZ;yb`W>zX6G#F6SI90Rkk6BAQ%4l z5;n0+Fb4s@on7NMx|()g2NH^+A8^PP#t21EU=vr&(}fctJZ$H##r{`UEBW?P{if&0 zAQ}S&`WyI?J-KhdkMT9DC=~6qKu4ySpBeuN|K;Y1GR~H)@GTXS{$F!Zv!|wKW^gM< ztJ%vqcG>iAAw!rhQcJ{{uwOX%9xK{r7g3kIVR7AkQka|4TkdGb5~jq0=N1#$t7RFJKpIWEnGT!kHXm4&DqT7(0WQ{{%JMCI}| z8P8m~7?nyAy9(4gb{02Nr`k6GDljo(&U%!|)i|~DvXBBgS7%>!gY2qP?*?-X^MnTC z(n5Sunu9XnYOhGI!blur)PdBCCh7)21VS&38x;WEO?*<;Oq zhg+qm-8uNO<{Sumde+9HP`Z%uvzk>SSHYt%!@47K&kIkRU!d736N2_@$Q(uxMZO!U z9)wka!Etb1yfY1Xf90+ux@ol|Zdi8(~#V-<+ zZ)>vrxg3x`s}91+K+%XS%W!m9{@qkUm-_jK@!F*qdLJfb;TMq!r%}J~lMoJXDXMplld%EOgElw&JpK!;m{vT|#H>k`};9_4fWe=OIs1+)Q+`yYR*$o_j-=N?>9H{NWgT!5X-D@a+Pbq2Q zk8f>K`(=oL0Uq62-=f3i;qLW~YWiQ5y4YWox=RDF&NaMmSX-Ldx<3^+1n;GA+0SwUneXNyIP zHDWuC5JP4lTX6hySps=t4-xr{M_oUu*CVwK;Tl2!0ZTCZCc<|Ru1h-r-$e2)gtq~_ z%H_jS#m!TfyX8jk9%PIDnY_WL{W*O&f0vYxcJ&SYo$;11@PtdO?)@a|B+={{p5a!01rnX_L0a}gutex@m zSJbu+9EPVduL)(}8Vjo%vDFN%3P0M>EnWO~WA)`t*b|1!-y`Dc!9;k7kb4K!i0Bug z@gr>RLKsIliEs)*6mM~Kz*Slkbz%*1`8;hW__$=5@DCx#gZBUwNmDhVk+Mb_pd`YN zbdpFIZ`SyW!7rjLQ}6~E6lZ)h$y%2NT^U!RRtyV hn{r&ajeK?ak!AgJxmo6)Zf{%PBL>{*gpTUQ{{jdBZ{7d^ delta 5856 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 Yt*ObD6L9tT7$1o5k99SEzq#xG00bX$KL7v# diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc index afe31e66c930de312f1543e841e2553355ae91f0..42a05403a88cc5a4da3e77ed7b77d3ebdf1b7c01 100644 GIT binary patch delta 19 ZcmX@jc$$$rpO=@50SHPD%TMG!001t%1nK|) delta 19 ZcmX@jc$$$rpO=@50SKzqB`0zp001k!1Wo_| diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..919483601e597b311619747dcfe8c6bcd8b86af6 GIT binary patch literal 4284 zcmZ`+-EteZ6$Y?BT&_r(qGiW&oP^EPP1uR$CQaJJ<96b|ByK!vVmVF2QDNy#xK$e%;rYl3a@RfVO+ZXH_%~volWL4Je{PO!uo{{yhn5-X&_C?9pSZnd$ zxCL8naZ`PuvWmhxRT_K5a6dsH30EZHBh{weky^Lx(n^T+;J44J+`l)qt* z-pakPpZfQcPmSN- z*ny&qm*lFKnczdUe@AOrAWX7^w3~L6ak5;uO1c8o7(b8o7EE$B?Wd92OR^kVk9x6w zsI;kM@na>U$8mQEg}Z6oQ>L7%-D1Yn`a0Q4VAbON3DYlt<+s_bYwMq6N@we9xlZ=h zZ>z`a8En_v0C_A`lx-`WY;LY+8`IIfWMe&p$X5n%q8Qd)A0&gTQIh6Lga6h3fE)?l zl3m>xCS6(dQ4YU@oGXKUb8$G3ajqgLBI@+9Z;x(~f|ou+e((!);tOB+j?3#@pjGe} z--kkofY+UX2fQXizVzL6B)-!xVN=U7m78=XIXMoSb2bMgWi;}@?62qwXFC*8Z)|0@1sJIN!F)H-5Lj1rr)is*T~6 zZeke*adp3+8>f@+nbNU@*7b_+MdGoDGb1b6)Js~J&Mu-8UsPb|fH$lYgfRb$-`Bns z{>$I$D_EYv61=kj?On9&FX$8_s0K`P<&Y5pp04!1a@(%FD1BMN$OEwYs-%Ktw#;N1 zV~k{oC&1S33FLyTfHIU-wIGEeE;V@uGZk4^)nmSkvVob}shP8K2{UKp^YWZLk5OGM z?lg*ZbyhxSq5OhewvfFf9T@kLRhj-dB-d4Rs~v%U`lGRnb_*?Qq66lzh~@l%;VH;@ zC1!T4D_Um}tE1&xS|QSA?5^}RGP-BHs4z_iiw6is0D#K$t6;53|1DwMOm#O4fe0;5 znJkD9@JSv;zs7t<$ombdvoJdD{=l z?mU%JuYdtu{dGL%{i+<%t>CfIb*yG|W{taibbe08VTa}~@k#_nLDP>#j$pomM7ohP9jx+8~KS>KqIK_3} zp=qC3D>;AJ1?y}35h2G1ptFWqLV%Ah%o+yg>VnKTT0NS%Gr1fEyEVc;F~EIU=GnAc z+#WZdh|$FyXbe=YppdYMf8qjZ`4nl>066>7X`DqtQMLue$`q^9$}XVb5T(Qp8@oqh zf}Ak+4mgSf3b@i^p535x=_Kh8#C+|1bH<(* z2ivJ0A$Qmct~7e>hLp`X1)R?pUd_Be2ka}WqZdA(G?T0ucYy$Mzqz3Z?+Ik{Yt7Fm zhVPENVZM3gZTMhOm)G=2POJY=?@i_=I z<7O0!9-4JCLXoF#mh(eFwJFUUS;N6#F1d*<3=nLV9wDlA~s^#ad;az}jWCRW1xeS={);lmNn7sn9rzZ#r{M(NDxvMbB&TV=&rA%P7J^ zry(jFnmRk9seV*aOgF>-`Dm{rar?<8G$1o%`Y335gAgyblddBVqs~y_jME9jd z`9l2SO9Iz{eaY5OabH*mECl=kiHv6}pgm$rsuf>^!sj(UYRpJwiCV%I0Yw>Aj8|Ld zkft9kw{;TOj%T#a1nYy#rQT7W@lfCrY z)KOJjcnp1vow|foA;prZ9oK}%g}Np~>ow}0YTb^gq_a{}qO)-rum%r3M4}M?^BwVD z-xdE6Uie)jXt<3_Vd(mocyZ6?HJzoep)(~aCjm+}&p>m?%b67!-$DBWS|9@za@Z?U zO0f6Tq+7F$&ytms&yp4BN_Ddp8yj@p_6xJ?NH8mC*kIvRlOoKeS(;&`wyxy~guYN!Ryh`04sUwK9m9Z^V?FD~GS0=b#*zvbi7-gisfYFCd0FQ0*3WBe~ PL*Y6XxVyZ>8ubXubX0Z~_1^SOg6K diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc index 64f199fdd55aa0d860ff96fe82f1d83ada966e8f..712928caa2d798155f4824271071c8752fbc2af0 100644 GIT binary patch delta 20 acmX@Yd4!WYpO=@50SHPD%Wve~$pQd0GX)6% delta 20 acmX@Yd4!WYpO=@50SKzqB{y>KWB~v$mjrD9 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc index 48894cd9158f01213f0ef976f120481fbe77e5cb..4d1f631eec264451dabae038ba29dbf420eeb169 100644 GIT binary patch delta 20 acmZ3&y@Z=PpO=@50SHPD%WveK$qE23d<3ol delta 20 acmZ3&y@Z=PpO=@50SKzqB{y=hdP0;tpO=@50SHPD%Wve~%LM>7i3KwN delta 20 acmX>hdP0;tpO=@50SKzqB{y>K Iterator[None]: +def update_env_context_manager(**changes: str) -> Generator[None, None, None]: target = os.environ # Save values from the target and change them. @@ -39,25 +39,25 @@ def update_env_context_manager(**changes: str) -> Iterator[None]: @contextlib.contextmanager -def get_requirement_tracker() -> Iterator["RequirementTracker"]: - root = os.environ.get("PIP_REQ_TRACKER") +def get_build_tracker() -> Generator["BuildTracker", None, None]: + root = os.environ.get("PIP_BUILD_TRACKER") with contextlib.ExitStack() as ctx: if root is None: - root = ctx.enter_context(TempDirectory(kind="req-tracker")).path - ctx.enter_context(update_env_context_manager(PIP_REQ_TRACKER=root)) + root = ctx.enter_context(TempDirectory(kind="build-tracker")).path + ctx.enter_context(update_env_context_manager(PIP_BUILD_TRACKER=root)) logger.debug("Initialized build tracking at %s", root) - with RequirementTracker(root) as tracker: + with BuildTracker(root) as tracker: yield tracker -class RequirementTracker: +class BuildTracker: def __init__(self, root: str) -> None: self._root = root self._entries: Set[InstallRequirement] = set() logger.debug("Created build tracker: %s", self._root) - def __enter__(self) -> "RequirementTracker": + def __enter__(self) -> "BuildTracker": logger.debug("Entered build tracker: %s", self._root) return self @@ -118,7 +118,7 @@ class RequirementTracker: logger.debug("Removed build tracker: %r", self._root) @contextlib.contextmanager - def track(self, req: InstallRequirement) -> Iterator[None]: + def track(self, req: InstallRequirement) -> Generator[None, None, None]: self.add(req) yield self.remove(req) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/freeze.py b/sbsheriff/Lib/site-packages/pip/_internal/operations/freeze.py index 4565540..930d4c6 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/operations/freeze.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/operations/freeze.py @@ -1,7 +1,7 @@ import collections import logging import os -from typing import Container, Dict, Iterable, Iterator, List, NamedTuple, Optional, Set +from typing import Container, Dict, Generator, Iterable, List, NamedTuple, Optional, Set from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.packaging.version import Version @@ -31,7 +31,7 @@ def freeze( isolated: bool = False, exclude_editable: bool = False, skip: Container[str] = (), -) -> Iterator[str]: +) -> Generator[str, None, None]: installations: Dict[str, FrozenRequirement] = {} dists = get_environment(paths).iter_installed_distributions( diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc index fb71e4bd80f3ac4863f669da5a398d0552846483..20ba2ae79445485ee8c3cd8e841580ad2da8c5d6 100644 GIT binary patch delta 19 ZcmZo=YGvZi=jG*M0D{uP@)Nm#0RSaI1eyQ< delta 19 YcmZo=YGvZi=jG*M0D@|D$%)**03tyH{r~^~ diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc index 8d0065bffeaeb1255b7f6b295f897cee3b0da4fa..00faf8b9b9c86f7ea29f6f01ba32077ff0eb4435 100644 GIT binary patch delta 20 ZcmeC->EYqd=jG*M0D{uP@*BAs*#Iix1L*(& delta 20 ZcmeC->EYqd=jG*M0D@|D$&K8MYyc-k15E$` diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc index 3ea51560482771b62a0d231df6b29e307e7f28f4..283e096ba4e2e02a6a12f3906b433e4078e85225 100644 GIT binary patch delta 256 zcmZpXnk2=S&&$ij00gCn<&!xDCi2;7=dwnz=CVbxF*2kurm*C&=W;}GfZ41$oVi?4 zT)Es)++aRi&cyNnPL@<@Nrn{ORMv?XBo!eX;Z!!5Aea_OWd+lssjQQ^808r`CTlT9 zPoBaU%fp?Vk(igB8ef#3U$Xffqc9UA$7Uv$y^M@(n-8!WurRW3{>W*>D9lz;S&*5R zUc>}+Xc04rV43XAEz8I{Ig?vXoed@-PW7@=RXN6AJ(gVLOfh delta 315 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 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/install/legacy.py b/sbsheriff/Lib/site-packages/pip/_internal/operations/install/legacy.py index 5b7ef90..290967d 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/operations/install/legacy.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/operations/install/legacy.py @@ -3,11 +3,11 @@ import logging import os -from distutils.util import change_root from typing import List, Optional, Sequence from pip._internal.build_env import BuildEnvironment from pip._internal.exceptions import InstallationError, LegacyInstallFailure +from pip._internal.locations.base import change_root from pip._internal.models.scheme import Scheme from pip._internal.utils.misc import ensure_dir from pip._internal.utils.setuptools_build import make_setuptools_install_args diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/install/wheel.py b/sbsheriff/Lib/site-packages/pip/_internal/operations/install/wheel.py index e191b13..1af8978 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/operations/install/wheel.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/operations/install/wheel.py @@ -22,6 +22,7 @@ from typing import ( BinaryIO, Callable, Dict, + Generator, Iterable, Iterator, List, @@ -223,19 +224,16 @@ def _normalized_outrows( ) -def _record_to_fs_path(record_path: RecordPath) -> str: - return record_path +def _record_to_fs_path(record_path: RecordPath, lib_dir: str) -> str: + return os.path.join(lib_dir, record_path) -def _fs_to_record_path(path: str, relative_to: Optional[str] = None) -> RecordPath: - if relative_to is not None: - # On Windows, do not handle relative paths if they belong to different - # logical disks - if ( - os.path.splitdrive(path)[0].lower() - == os.path.splitdrive(relative_to)[0].lower() - ): - path = os.path.relpath(path, relative_to) +def _fs_to_record_path(path: str, lib_dir: str) -> RecordPath: + # On Windows, do not handle relative paths if they belong to different + # logical disks + if os.path.splitdrive(path)[0].lower() == os.path.splitdrive(lib_dir)[0].lower(): + path = os.path.relpath(path, lib_dir) + path = path.replace(os.path.sep, "/") return cast("RecordPath", path) @@ -258,7 +256,7 @@ def get_csv_rows_for_installed( old_record_path = cast("RecordPath", row[0]) new_record_path = installed.pop(old_record_path, old_record_path) if new_record_path in changed: - digest, length = rehash(_record_to_fs_path(new_record_path)) + digest, length = rehash(_record_to_fs_path(new_record_path, lib_dir)) else: digest = row[1] if len(row) > 1 else "" length = row[2] if len(row) > 2 else "" @@ -474,7 +472,7 @@ def _install_wheel( newpath = _fs_to_record_path(destfile, lib_dir) installed[srcfile] = newpath if modified: - changed.add(_fs_to_record_path(destfile)) + changed.add(newpath) def is_dir_path(path: RecordPath) -> bool: return path.endswith("/") @@ -589,7 +587,7 @@ def _install_wheel( file.save() record_installed(file.src_record_path, file.dest_path, file.changed) - def pyc_source_file_paths() -> Iterator[str]: + def pyc_source_file_paths() -> Generator[str, None, None]: # We de-duplicate installation paths, since there can be overlap (e.g. # file in .data maps to same location as file in wheel root). # Sorting installation paths makes it easier to reproduce and debug @@ -656,7 +654,7 @@ def _install_wheel( generated_file_mode = 0o666 & ~current_umask() @contextlib.contextmanager - def _generate_file(path: str, **kwargs: Any) -> Iterator[BinaryIO]: + def _generate_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]: with adjacent_tmp_file(path, **kwargs) as f: yield f os.chmod(f.name, generated_file_mode) @@ -706,7 +704,7 @@ def _install_wheel( @contextlib.contextmanager -def req_error_context(req_description: str) -> Iterator[None]: +def req_error_context(req_description: str) -> Generator[None, None, None]: try: yield except InstallationError as e: diff --git a/sbsheriff/Lib/site-packages/pip/_internal/operations/prepare.py b/sbsheriff/Lib/site-packages/pip/_internal/operations/prepare.py index a726f03..80723ff 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/operations/prepare.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/operations/prepare.py @@ -25,6 +25,7 @@ from pip._internal.exceptions import ( ) from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import BaseDistribution +from pip._internal.models.direct_url import ArchiveInfo from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel from pip._internal.network.download import BatchDownloader, Downloader @@ -33,12 +34,20 @@ from pip._internal.network.lazy_wheel import ( dist_from_wheel_url, ) from pip._internal.network.session import PipSession +from pip._internal.operations.build.build_tracker import BuildTracker from pip._internal.req.req_install import InstallRequirement -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.utils.filesystem import copy2_fixed +from pip._internal.utils.direct_url_helpers import ( + direct_url_for_editable, + direct_url_from_link, +) from pip._internal.utils.hashes import Hashes, MissingHashes from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import display_path, hide_url, is_installable_dir, rmtree +from pip._internal.utils.misc import ( + display_path, + hash_file, + hide_url, + is_installable_dir, +) from pip._internal.utils.temp_dir import TempDirectory from pip._internal.utils.unpacking import unpack_file from pip._internal.vcs import vcs @@ -48,14 +57,17 @@ logger = logging.getLogger(__name__) def _get_prepared_distribution( req: InstallRequirement, - req_tracker: RequirementTracker, + build_tracker: BuildTracker, finder: PackageFinder, build_isolation: bool, + check_build_deps: bool, ) -> BaseDistribution: """Prepare a distribution for installation.""" abstract_dist = make_distribution_for_install_requirement(req) - with req_tracker.track(req): - abstract_dist.prepare_distribution_metadata(finder, build_isolation) + with build_tracker.track(req): + abstract_dist.prepare_distribution_metadata( + finder, build_isolation, check_build_deps + ) return abstract_dist.get_metadata_distribution() @@ -98,55 +110,6 @@ def get_http_url( return File(from_path, content_type) -def _copy2_ignoring_special_files(src: str, dest: str) -> None: - """Copying special files is not supported, but as a convenience to users - we skip errors copying them. This supports tools that may create e.g. - socket files in the project source directory. - """ - try: - copy2_fixed(src, dest) - except shutil.SpecialFileError as e: - # SpecialFileError may be raised due to either the source or - # destination. If the destination was the cause then we would actually - # care, but since the destination directory is deleted prior to - # copy we ignore all of them assuming it is caused by the source. - logger.warning( - "Ignoring special file error '%s' encountered copying %s to %s.", - str(e), - src, - dest, - ) - - -def _copy_source_tree(source: str, target: str) -> None: - target_abspath = os.path.abspath(target) - target_basename = os.path.basename(target_abspath) - target_dirname = os.path.dirname(target_abspath) - - def ignore(d: str, names: List[str]) -> List[str]: - skipped: List[str] = [] - if d == source: - # Pulling in those directories can potentially be very slow, - # exclude the following directories if they appear in the top - # level dir (and only it). - # See discussion at https://github.com/pypa/pip/pull/6770 - skipped += [".tox", ".nox"] - if os.path.abspath(d) == target_dirname: - # Prevent an infinite recursion if the target is in source. - # This can happen when TMPDIR is set to ${PWD}/... - # and we copy PWD to TMPDIR. - skipped += [target_basename] - return skipped - - shutil.copytree( - source, - target, - ignore=ignore, - symlinks=True, - copy_function=_copy2_ignoring_special_files, - ) - - def get_file_url( link: Link, download_dir: Optional[str] = None, hashes: Optional[Hashes] = None ) -> File: @@ -191,19 +154,7 @@ def unpack_url( unpack_vcs_link(link, location, verbosity=verbosity) return None - # Once out-of-tree-builds are no longer supported, could potentially - # replace the below condition with `assert not link.is_existing_dir` - # - unpack_url does not need to be called for in-tree-builds. - # - # As further cleanup, _copy_source_tree and accompanying tests can - # be removed. - # - # TODO when use-deprecated=out-of-tree-build is removed - if link.is_existing_dir(): - if os.path.isdir(location): - rmtree(location) - _copy_source_tree(link.file_path, location) - return None + assert not link.is_existing_dir() # file urls if link.is_file: @@ -261,7 +212,8 @@ class RequirementPreparer: download_dir: Optional[str], src_dir: str, build_isolation: bool, - req_tracker: RequirementTracker, + check_build_deps: bool, + build_tracker: BuildTracker, session: PipSession, progress_bar: str, finder: PackageFinder, @@ -269,13 +221,12 @@ class RequirementPreparer: use_user_site: bool, lazy_wheel: bool, verbosity: int, - in_tree_build: bool, ) -> None: super().__init__() self.src_dir = src_dir self.build_dir = build_dir - self.req_tracker = req_tracker + self.build_tracker = build_tracker self._session = session self._download = Downloader(session, progress_bar) self._batch_download = BatchDownloader(session, progress_bar) @@ -288,6 +239,9 @@ class RequirementPreparer: # Is build isolation allowed? self.build_isolation = build_isolation + # Should check build dependencies? + self.check_build_deps = check_build_deps + # Should hash-checking be required? self.require_hashes = require_hashes @@ -300,9 +254,6 @@ class RequirementPreparer: # How verbose should underlying tooling be? self.verbosity = verbosity - # Should in-tree builds be used for local paths? - self.in_tree_build = in_tree_build - # Memoized downloaded files, as mapping of url: path. self._downloaded: Dict[str, str] = {} @@ -336,7 +287,7 @@ class RequirementPreparer: # directory. return assert req.source_dir is None - if req.link.is_existing_dir() and self.in_tree_build: + if req.link.is_existing_dir(): # build local directories in-tree req.source_dir = req.link.file_path return @@ -525,7 +476,7 @@ class RequirementPreparer: self._ensure_link_req_src_dir(req, parallel_builds) hashes = self._get_linked_req_hashes(req) - if link.is_existing_dir() and self.in_tree_build: + if link.is_existing_dir(): local_file = None elif link.url not in self._downloaded: try: @@ -548,6 +499,23 @@ class RequirementPreparer: hashes.check_against_path(file_path) local_file = File(file_path, content_type=None) + # If download_info is set, we got it from the wheel cache. + if req.download_info is None: + # Editables don't go through this function (see + # prepare_editable_requirement). + assert not req.editable + req.download_info = direct_url_from_link(link, req.source_dir) + # Make sure we have a hash in download_info. If we got it as part of the + # URL, it will have been verified and we can rely on it. Otherwise we + # compute it from the downloaded file. + if ( + isinstance(req.download_info.info, ArchiveInfo) + and not req.download_info.info.hash + and local_file + ): + hash = hash_file(local_file.path)[0].hexdigest() + req.download_info.info.hash = f"sha256={hash}" + # For use in later processing, # preserve the file path on the requirement. if local_file: @@ -555,9 +523,10 @@ class RequirementPreparer: dist = _get_prepared_distribution( req, - self.req_tracker, + self.build_tracker, self.finder, self.build_isolation, + self.check_build_deps, ) return dist @@ -605,12 +574,15 @@ class RequirementPreparer: ) req.ensure_has_source_dir(self.src_dir) req.update_editable() + assert req.source_dir + req.download_info = direct_url_for_editable(req.unpacked_source_directory) dist = _get_prepared_distribution( req, - self.req_tracker, + self.build_tracker, self.finder, self.build_isolation, + self.check_build_deps, ) req.check_if_exists(self.use_user_site) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/pyproject.py b/sbsheriff/Lib/site-packages/pip/_internal/pyproject.py index e183eaf..1e9119f 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/pyproject.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/pyproject.py @@ -1,3 +1,4 @@ +import importlib.util import os from collections import namedtuple from typing import Any, List, Optional @@ -89,9 +90,15 @@ def load_pyproject_toml( # If we haven't worked out whether to use PEP 517 yet, # and the user hasn't explicitly stated a preference, - # we do so if the project has a pyproject.toml file. + # we do so if the project has a pyproject.toml file + # or if we cannot import setuptools. + + # We fallback to PEP 517 when without setuptools, + # so setuptools can be installed as a default build backend. + # For more info see: + # https://discuss.python.org/t/pip-without-setuptools-could-the-experience-be-improved/11810/9 elif use_pep517 is None: - use_pep517 = has_pyproject + use_pep517 = has_pyproject or not importlib.util.find_spec("setuptools") # At this point, we know whether we're going to use PEP 517. assert use_pep517 is not None diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/__init__.py b/sbsheriff/Lib/site-packages/pip/_internal/req/__init__.py index 70dea27..8d56359 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/req/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/req/__init__.py @@ -1,6 +1,6 @@ import collections import logging -from typing import Iterator, List, Optional, Sequence, Tuple +from typing import Generator, List, Optional, Sequence, Tuple from pip._internal.utils.logging import indent_log @@ -28,7 +28,7 @@ class InstallationResult: def _validate_requirements( requirements: List[InstallRequirement], -) -> Iterator[Tuple[str, InstallRequirement]]: +) -> Generator[Tuple[str, InstallRequirement], None, None]: for req in requirements: assert req.name, f"invalid to-be-installed requirement: {req}" yield req.name, req diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-310.pyc index 3ddfa103633a0c7cb1c5cea890dab4dbdeb886cf..b640031948c0478d4b835576aab320a6d81a57d9 100644 GIT binary patch delta 52 zcmZ1~vPOhApO=@50SHPD%O`)I$SceEZKC#6wiLz`#x&-M2QpbW-Ba^6>oA_?U=*4B HgHsm(h0_ml delta 44 zcmZ1@vQ&gOpO=@50SKzqC6ixH4$D&(HAtKl{zk-N`7*9U)Xcbs%Km6!V*jn@IIyn&rQtfyINS$0TOTOpW6P zr9q*!X3KajJw#Kh?vXy)Wu`!r9#?5MJ-n)p9HTX$v9%sE)u4`%kmb!|3t5CB z%VT*tt;=Yja#QzufPY(e2vzZ)>yk|~5W{AHZ22cI6emY#W=m5ug(53}inoShNasVL zIA#St9cqh3K&$yNRuSHN9WIE(i;;@RALVi=iW`0f-(moWUsq8*7<4!)V)NzS8@|J6 zo^LdLfbR2Xb0=CVpKA_cZ55mi#FqJVxDn;bYvHS?b`5kaCP=#=Ss)`kao{$3murzD zXpIj>401)7KH_gjoR9{$#>?OK0ZXXtBg#n>sH`oar(-6CJ&6?7Sud=`N%#g@xb zEjOS>`1|b(LDhyu0%Z5bwfJi;jeX9~$Lmpnm*S^=pNW=wp$4q+pWdR6ur{-%7T= z8t~$6tn2>-TN`T{BN%d3zUnqe{{}FANL=^?tW2y9Ad_Y>HHSq91k6M4& delta 1610 zcmZWp-ESL35Wn5KTifR(1SiyvX}%oC_SxjaNs}~bzDlT}0a;WL0u>~;&0d=bFPyVc6C3`{(dvN zPE!cks?t z{p0{oT1j4O^-pQMi+8VTCy($NU`njZO4cb;j344XpbR=}ujQ~1(+5f)KMcx{hr*1O zAD-e#d6jmzmVMi-e(=Xr`}qKzI=t)oBtIez_0b7bEBGKE0(GRc6Mu>iTL*a@Vof-+ zzfR%heGERrN5ONHAGHGfajU`Eo$)dL1Y~oR(+R~qUi?Vi^7T%-_Z7qgb~QX>Sd&u# z1;tiY$fCPIYF54}y9~fm>o$KqBQulX~3fb##_s>Fv$N_9tOrOqAXL56e zncQq%F8d>@N3_YCk$QFxeO{5@`CC{Mm~OA!_6IeMu-}WpK$w!Bh)`6TfSZ2MwW_S)%$463Iv%%EW?k8AVdK+y|2v_rZf56t76i6rua+ayQKEg10Es; z%NOMP&0Az%=0ZK>lH3THp*3`R3&Gju;mq7=k+(9!I-kiG#LVp36Y|&4EV&>vEj?sO ze$Zl(Wx3N5gYalMW_tq+mv-4csAJkgMEL>_70BL$G+WrQ#S7Ta`*EAs0| zz?(1Arbqq|Y4k3aJw!oPMg87+0+-$Zq){z9qX$MbLJ7Mig1~GVdli|~fhZ3b7}!A0 zzgYm|b#}jHbopkqZG_o+mWghg;FEQgFzdG2ydt^_l&e=gz#F#y30)x`3J(=U9WL@Az z*WD#AQ%##hmn2?CO_ywr2iY?04>_meNjI9NER-__~D*!F!4CBj8US&M5I{r zZLOBxE-@v=xrsZPAvUBt(P&gakduD9OePXRNYjA#nWjyn)Qe|97v}-6Ii7y7Il#w< zveUG?j^ah+oC-U&{!a`QgQ$Nle@k?YZDHO4SW^{qEahFY5ZP^U4MfwGPN&kTRO-Hw zPMI1KrV3EZJ@yhM@5pc4`x>!n#1aC&Do(dK7brGxc}<2oBJ`Fb$2-QUc1K?BXbMt~ z@u#mLSQ89U*kx~me50f3S(GV!NN{R9fd4Q`?@^Wh%`|$K>U4)PW1Get{VwVhbOt(g ObYq7$IIN>o-TM~_*<5V^ diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-310.pyc index c3579c2c4ef2e5d834ce6949396c909188a219c8..1c45f81ef612eb8d1002e3b67e7d2465909cc853 100644 GIT binary patch delta 354 zcmdmz`7~2IpO=@50SHPD%O}UVFfcp@agc!kkmCTv#VHfDpD^-m7GM-)j8ND_imfg?Do5={YUJYmxQ-c8WY>jGL(agpqf%0HYuyGheF9W-X?DjKUnA zC8s?cH&0P0Wn`?I%%zmaSi8AWX%{2ogvll<2N@Sl{-zSmxNvijsxc$u z=E-ep+ZmT_wo~V4V%$5~PxBY!oz0$F%a|FTZ~maW7iiq(bq42|8QCV+nMCkANeK%G P3a|=^3&{&{D@g+Yz2-|f diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-310.pyc index aac42f278f53a38691d1236300c37d3ad586ddd0..1b786ac593d40b87d53193e0a0f57325a0d0e8ad 100644 GIT binary patch delta 6594 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 delta 5993 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 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-310.pyc index d1f6cd1e5df54b3731524389440d914e82e6c035..0a20fcc7f8589afa7efc2fa6a4aabd9c3b5c45c4 100644 GIT binary patch literal 3912 zcma)9-EZ8+5#L?%c)Zi;Bwu7pPMVl#)5K>am!wU<992kT7eQJ>1}rxS4hk5GyLY0@ zBhR}$IXX)~8|gIfk9zC>kpE&I)2BZBEr8w3EbseHXbJ3cxttl!%x`vPm@Y4u z30%GJZiKg%2>CZYOkNf|d<;W<0TU;j#-xdN7Sj%EGKy;}wmNpx?i88@^K8dXr`Rl- zbs=^;rDll|LC(u!=^1TSJ|*1Y#WTW-r>wcm=?n7fASTgr$pQ`Bo{<31LY52 z-MPK{7bT?H-N|J1_3mA9xT~^McJ^e{4!H2uzK~I?wX61qt9#Mju8K18ZZ`-Y1#O{r zyHWQ&KT0wolOTQ%zKO$EB5QPywClsGDD!>%o^oJvEr*s_fBnH&Z}4GbNEcF|8D40i z4a2zVLs(=G@|>N4iw@{Hdq(b(Q;Ii^++83K)osDP>clwUHE*` zg`gxo00qY`l&e4kZnMDZT)`S_%xEdE!XCE3||vyZ%|VcJWw6AyxTn4)j0`fcwiY^am1 zK6~eKwB=7x8N^in45!P$d<$P9nEhLGj-S(ccyQ{LE{*in1*4|6QLDNue~uCj>L^<~ zEl5*Arc1tWSbQII4H^n7D;9}-8_4R`I9l{_&Vn%#CG8ncBX_PC!l3XdG3uJ=u?sfd zF_vB|$Xhv=UW)R z0$Ks*VRPOBOil)}Aq=R#u5@LJfoQ;*HRdYnHCMgf1wKfOa4whUOm0%^0htn3GBvIhSW zXcSgxmzJ#xWiR`0%-Au*FsJ+oj9Uwom(`*2J0xQq0Qv{}Cp)Fz&^p`hU*Ar>f#ba= zQMT`8`@%z?c>vDXKKIY!=#NsSQvP<4MQxEyTJ+I`MXXG#Y|f$?hN*Omxo}k7@xX!p z1Of}3e{Ma4>b*XKz|K#D9Yg0iP6AN!Of8r>5UbFBPHL$P-U$2}>))7h`7G_6hNFPN zq&Mn5Oy>dV-Rgh;!1Q>=pQxUfwk9*Hf)_#NB|>m7OT9he4f2HGjdIx=To3Qxy$@WS z^iTkOq!6mEkl7LNfD54u8-o^$b`Tx`wMyedA>Z*-l!V9zc#0<@kw)^6$V-zLS+E;b z|F?QW?WTN!{=hiI#zbMR#D?|D^0<9Epx8wHojqod&=49(UcZ5xuBaf3R4ancbngf@ zUx7`zD5I4((UH(~b+@*GMxo~&!kA6j3)^BZ7 zQ@MrT{yk1J!LxpeoKH~^>|dRt&77BW`ScRDI(=BbA{)S`%f8=9c`wESRq_4Dy&xWx zD|;_ZW4VIbyou9IoIbz_KPa*BmA}U6cR1mp)9x@pB%Yw$oIl`dY>ru(CIWjJJSgUG z!zF99>Q;-j<(ge{YA$ovD6=-GM5=mK7vr?uhWee*{3#=w(r?Ojc>WZYYMo2Mur&jv+e6KwW|mzXx9xGWV2&D!>D3 cw8$XsZswlc!W5#=Mwe8e%2il}m08XD5#8yiS^xk5 literal 5839 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 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-310.pyc deleted file mode 100644 index 84a1f55085ee085a92f013e61cad507885c062f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4305 zcmZ`+TW=f36`q;BaJjrlrsddj6o*Lbqy%E6apN`#+`_KyG)@fFwwxLvR4i7Uk+d?o zq-K|v#E?Kz}Tun>b^(?;Nn(?9Z20#KfI=qhQR(?mQbiWA{3H%+i|6a(DM_ z&gefD1^r8w@@+Qui1#|%s*T=~>`$0~jCF_mowxh>V}C4$Oy4BV-?FW1xi|K6e@|qe ze#ZX7F{rX6LREZ41)u0l1&&tts~Yn)B{X{2_NEQi9QUaX%eZK_%PRLSUR z+#N#KZW{NLDW__?pqP4JC+i6eTD+|Y-Ksu$ihJ*?OyB zkEM#T4W*N{wUumjI=Yvvu4K6Kl>yu*hGAC*$>6;xN#Q%#|2?g?s6{zk3>RA*?3#Lx%q)I`OqHe8=UpT%c9)7tcZ=M8IdAfCs!TLO%D?bR>S# zmq;azBd$k2jRTMQmjk9U8WFRBFfqlb4MM2{Zcy!H8=hocJgd*x8S6pl}lRJOQo zLcUS+Zkpst+)YMGHdlv9S2itYlCC%7ym>imRjtxB@QxXW{3$%NNjF(Ff@+n9|`5t)~^;8??uH zoEbraDP&ANrG?4tB0BMP6~+#D!#Y9;7r6AS{-f~U`cc1&>0<`QI}6Zmpk;qWrx+nK zP?;--%m}P>rT4AdcICYEWeFn>IO?mC3g+27lVyxCk|CaDJZTNkR93+m%9^T3p=g)7 zoB^dOXI1TR-!rlSO8p4stegX7MqZTXuUo}w zl3mx(Ep-I?>5s-P+AXxKi4H)+B9`+#hNmF+m7r`|XSD7jmPYfpv_iBUv%b5Hcf0u>%A+SwPo8Kv0%C zT@|OpLCY;J_$!e02h?4o?q$^i(4pEJn9OMNs{abL7JSC-A_pIH76+@IEBEJkA?1$w zrl5RxzzOLlBKJ1^{SsUz7(?aL>y}MvBhEGm0Q_ttzIycoGdI-TXgkR_`olb0)A2fG zcc>%n^d&OOhT4${z&|g*h+|7QH7FKZzp+6+DPg^T_Qsj#DzTJorD3zvvB|($0R3LBoMF$`6mXDnq{8N!G#VW|3r)~=D=y-brn^GtpX-4Fqls< zI1PZnZyrTpR2OAiT`W#fJgsg6BKA>NY_hR?ASTEbV{eb6QlLOAJ>}U=I+sq84nfa% z&i6C+ydW=+`JT-oFP+*xdMfR+AC8M`Q`xUdszKOh?EqQD7ILN0yEmn5#wo!5WC7O9 z`zK(3acT6%SCeLvHRCRjLGCtJ6=efT4*AE;uO^0XkGx^NcI89(ZD1{o`OyN-Knz~a zPHd@k^RjN$H5pgmKxf?kK&60wY;Mkcl62KlKmVjZOl48e_-iOA;@nj3_4`kT154EJ z(L!%qqmt0)XzavNo(yikaHE?vA0F`lu{JP)&01-WimIowjEaflL8U*#vU_M51w-gm zg>XY2@`YzE5{!%bqK?XqZa=tI9TqVkZ zH6P68lC#*t0f7gsBU1*}lnB3;GkX7_>h+(hS6FjR_j@PpIcgS5tZhy*SnDjc%7uBT zyfXeUC9trzD)f$0oX$Lz&NKEzDz_i?7~>~xg<_|s%IO}SoE30=4keXJc3#cJ|rpqct%5qVhGYsy6W zA$2d5Z%0%E+FR3F8=3)Y@X$kW3h_VR5&!jF@gL!ZKQ)4e+gJ!g*I(c$l;{}!5js<% z(i0G6a}QL9jGfur;uC3iKoex4;tEzeN)T2=P0BU%_+nXn{>8EgHK}g4Xk&yVZNG7R zUaPG|G%T=St4RlD;W*DQPp}0(YMY3L|3)m{_F^vfDY!z(_+M)zJ oMNKBSUYPKAR5)ey#S<|41Pb7@Ov-FKZC&rr9}#?*;M`v1qqtCMU7+_?CS1oQY>Y@K3u?u zB`HM5vWU5pgcuAB2#JPe%QZ?&<}#NUw-7(MMaksD{9xv?1+xz(PFBx@Xr}SroZmg? zo_l`h+>?_&3%{QQ|4@FuMZh(DW%u#B{etkbVLZC5XdFUGZoKcmm$E263KXKEM~Iqf zAuXDa`ux!?Bixy8vY3Qq`9>uEo zws~yEiIHA54!I@&y)C6>$k$-JXNxfD%|)OB-@hT3a!g}0DBBIK~J$?r4% zD;hs)LePYHcvr~apEN=Vil~W*0u`bnTQPkFbu2DF2QpigYw~K0C>g;l?&Ejl%Myh6 zigiDM0d^~Y1|odKc8tI%TQ6J$ou!IaAjRtK=OE2)+L!XDFz~*FK*qfSixj%pqN5Q` zvm1^(pz*JrFN<)6dy4GiE58k}#XhU}6YTs#Wq^Q( zZB#8mfK66^0pBjP?j;anZ8cla!dq&O0Ce&*J}W>kpRL;@aEwpYX9339RKq5=;;rBj z7~^ZfNq|}QLeqD!#44MEHa8ZSi?ZFJb3EMa2KbG=xqlhvSa~Q6gY4~4RlzH|JPoR* zRq1jX-gC3_A@@Peq!*@Ptf&{8C*e+uAS7}dg=t83oCFYzeH2Br4HV4R=ta7eA?WL8 zo1w$0TI$t7CmD>S<~PpKY8~bS8KG0?FB@~{rg_IUk4v}fjtt2l zzgCY?%m4O#DA1BQvg4nIH%|8oi9AWrinYh0n0w^&zpHvC0Vf4osx{CuElA6?M#SwI zz`2v@Zdx%RjX8BEmS|5CEWteHG7{-7BQX-M>82M2UnP?ctimOJ@jwT_U7kHS3H;0x z1ptrpxhJo})9dDBWKfC5;)=R}Enc_A65-*bq9$WFrZ&7$^AY+=3^Pn)No`n*#gpOW zaW!^A3nwr($);PYWn%<=ZuVuX7k*^dTYswU+m#qn2P5&=s6xZ>SmO2YiJ@2mS=16E zkG#X6{=hD`Rmh(JPVpb?m$n736D&~vP!=UHXU&LGmVlg*HNf72C&W-Au*k}pRkc&ZtEuYPO*c2wBzk7{tJg=qSSddkorunXM| z(=w_ftfTuK=wVm8tL2-9YlGkKz5(z&yVg?~Bq9NVf7y{dVtGg$PPCkcW-AA;-|N`7 O$JS(v2`M3E_x=Uz24uAW delta 1203 zcmZWnYiv|S6u#f=-Mia%yX`)^yM54iyWK6_Z7HCpc0r5Pnm_{5h%~iyw#nAIg}YY) zxwTD}ii96l2Z+(sv=&Q|IQH?Drca$(gnMs@xWskXq%4p<}kcA?xN)koP` zYmi;CzK?o#OzVM-UC|mGbuy$0u%nXa+b*hz^GgNm2!JvoPJX#6O5kHFHS=g>r)uBEM{~RD2;!`-VFerc zBaPdD1b-u30Bq+Mnr;y6=4YC7fXU9Z+XwD*f&oo=rw+F@!_&>uHyOf8G&-0aJCe^akQ6;;fv1xh+E zu1q1*u^&+6d{`{A*d&h;;oZr~*KZwfpdk|`nHAY4h8smW(+FpkF<07RG|BH%4JKwH zv~(8tDt&9l+@^KLV>pM4W_+g0bPq>o$*ibuG>e^c|Bbz@(6VW=nlXialf6pXp(;ke zSUV&X9DEDPmQ`74>{n>H(LyVX7+qt;jhJXnjaJgC!|IsF^azQrED-|iV_tcP>6M3y zk{_Ga?Mk?s#W!5QJA7%wCSZ|A@0f&r!Il}+Q+o}5?#^PMm0!H;Gc@UQ;!YO|QtAFD zGD$s?5^d-d9=%YyZIaTIu3r(1ecn-9WfMl&w_q6@$>?n|rI4mFM*qm@;DC`DP3sHH zefL#n?{wl@R?=Ci%|mqNudJhU&g(}-&Oz)@q2>s*oSMs5+3%g9awq)IPzH5EU2&@_ zNRFsPA|ZcjES@+@6tF~HiS?W~u$h082mtr6pEq4cH~(R?=)gV9+m!)f&vuo$mZYdW zJvl%}Qt4zyx3KeFomgf!yQ1jj)mvidaR^O2!Zuwzu%ge3eEl^EL{fPhx~!qQ1Pv4Y zsI-?Q)cg&#(mE}HP2YC}n^|3Vt#(!N@A=m5uYvWf{(-7Mg{8?w907zPAy0j^v(=eW J#+7k*$zN4OLB;?8 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/constructors.py b/sbsheriff/Lib/site-packages/pip/_internal/req/constructors.py index 25bfb39..dea7c3b 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/req/constructors.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/req/constructors.py @@ -207,6 +207,7 @@ def install_req_from_editable( constraint: bool = False, user_supplied: bool = False, permit_editable_wheels: bool = False, + config_settings: Optional[Dict[str, str]] = None, ) -> InstallRequirement: parts = parse_req_from_editable(editable_req) @@ -224,6 +225,7 @@ def install_req_from_editable( install_options=options.get("install_options", []) if options else [], global_options=options.get("global_options", []) if options else [], hash_options=options.get("hashes", {}) if options else {}, + config_settings=config_settings, extras=parts.extras, ) @@ -380,6 +382,7 @@ def install_req_from_line( constraint: bool = False, line_source: Optional[str] = None, user_supplied: bool = False, + config_settings: Optional[Dict[str, str]] = None, ) -> InstallRequirement: """Creates an InstallRequirement from a name, which might be a requirement, directory containing 'setup.py', filename, or URL. @@ -399,6 +402,7 @@ def install_req_from_line( install_options=options.get("install_options", []) if options else [], global_options=options.get("global_options", []) if options else [], hash_options=options.get("hashes", {}) if options else {}, + config_settings=config_settings, constraint=constraint, extras=parts.extras, user_supplied=user_supplied, @@ -411,6 +415,7 @@ def install_req_from_req_string( isolated: bool = False, use_pep517: Optional[bool] = None, user_supplied: bool = False, + config_settings: Optional[Dict[str, str]] = None, ) -> InstallRequirement: try: req = get_requirement(req_string) @@ -440,6 +445,7 @@ def install_req_from_req_string( isolated=isolated, use_pep517=use_pep517, user_supplied=user_supplied, + config_settings=config_settings, ) @@ -448,6 +454,7 @@ def install_req_from_parsed_requirement( isolated: bool = False, use_pep517: Optional[bool] = None, user_supplied: bool = False, + config_settings: Optional[Dict[str, str]] = None, ) -> InstallRequirement: if parsed_req.is_editable: req = install_req_from_editable( @@ -457,6 +464,7 @@ def install_req_from_parsed_requirement( constraint=parsed_req.constraint, isolated=isolated, user_supplied=user_supplied, + config_settings=config_settings, ) else: @@ -469,6 +477,7 @@ def install_req_from_parsed_requirement( constraint=parsed_req.constraint, line_source=parsed_req.line_source, user_supplied=user_supplied, + config_settings=config_settings, ) return req @@ -487,4 +496,6 @@ def install_req_from_link_and_ireq( install_options=ireq.install_options, global_options=ireq.global_options, hash_options=ireq.hash_options, + config_settings=ireq.config_settings, + user_supplied=ireq.user_supplied, ) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/req_file.py b/sbsheriff/Lib/site-packages/pip/_internal/req/req_file.py index 03ae504..4550c72 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/req/req_file.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/req/req_file.py @@ -13,8 +13,8 @@ from typing import ( Any, Callable, Dict, + Generator, Iterable, - Iterator, List, Optional, Tuple, @@ -129,7 +129,7 @@ def parse_requirements( finder: Optional["PackageFinder"] = None, options: Optional[optparse.Values] = None, constraint: bool = False, -) -> Iterator[ParsedRequirement]: +) -> Generator[ParsedRequirement, None, None]: """Parse a requirements file and yield ParsedRequirement instances. :param filename: Path or url of requirements file. @@ -321,13 +321,15 @@ class RequirementsFileParser: self._session = session self._line_parser = line_parser - def parse(self, filename: str, constraint: bool) -> Iterator[ParsedLine]: + def parse( + self, filename: str, constraint: bool + ) -> Generator[ParsedLine, None, None]: """Parse a given file, yielding parsed lines.""" yield from self._parse_and_recurse(filename, constraint) def _parse_and_recurse( self, filename: str, constraint: bool - ) -> Iterator[ParsedLine]: + ) -> Generator[ParsedLine, None, None]: for line in self._parse_file(filename, constraint): if not line.is_requirement and ( line.opts.requirements or line.opts.constraints @@ -356,7 +358,9 @@ class RequirementsFileParser: else: yield line - def _parse_file(self, filename: str, constraint: bool) -> Iterator[ParsedLine]: + def _parse_file( + self, filename: str, constraint: bool + ) -> Generator[ParsedLine, None, None]: _, content = get_file_content(filename, self._session) lines_enum = preprocess(content) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/req_install.py b/sbsheriff/Lib/site-packages/pip/_internal/req/req_install.py index 02dbda1..a1e376c 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/req/req_install.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/req/req_install.py @@ -25,7 +25,10 @@ from pip._internal.metadata import ( BaseDistribution, get_default_environment, get_directory_distribution, + get_wheel_distribution, ) +from pip._internal.metadata.base import FilesystemWheel +from pip._internal.models.direct_url import DirectUrl from pip._internal.models.link import Link from pip._internal.operations.build.metadata import generate_metadata from pip._internal.operations.build.metadata_editable import generate_editable_metadata @@ -46,6 +49,7 @@ from pip._internal.utils.direct_url_helpers import ( ) from pip._internal.utils.hashes import Hashes from pip._internal.utils.misc import ( + ConfiguredPep517HookCaller, ask_path_exists, backup_dir, display_path, @@ -80,6 +84,7 @@ class InstallRequirement: install_options: Optional[List[str]] = None, global_options: Optional[List[str]] = None, hash_options: Optional[Dict[str, List[str]]] = None, + config_settings: Optional[Dict[str, str]] = None, constraint: bool = False, extras: Collection[str] = (), user_supplied: bool = False, @@ -110,6 +115,10 @@ class InstallRequirement: self.link = self.original_link = link self.original_link_is_in_wheel_cache = False + # Information about the location of the artifact that was downloaded . This + # property is guaranteed to be set in resolver results. + self.download_info: Optional[DirectUrl] = None + # Path to any downloaded or already-existing package. self.local_file_path: Optional[str] = None if self.link and self.link.is_file: @@ -138,6 +147,7 @@ class InstallRequirement: self.install_options = install_options if install_options else [] self.global_options = global_options if global_options else [] self.hash_options = hash_options if hash_options else {} + self.config_settings = config_settings # Set to True after successful preparation of this requirement self.prepared = False # User supplied requirement are explicitly requested for installation @@ -470,7 +480,8 @@ class InstallRequirement: requires, backend, check, backend_path = pyproject_toml_data self.requirements_to_check = check self.pyproject_requires = requires - self.pep517_backend = Pep517HookCaller( + self.pep517_backend = ConfiguredPep517HookCaller( + self, self.unpacked_source_directory, backend, backend_path=backend_path, @@ -549,7 +560,16 @@ class InstallRequirement: return self._metadata def get_dist(self) -> BaseDistribution: - return get_directory_distribution(self.metadata_directory) + if self.metadata_directory: + return get_directory_distribution(self.metadata_directory) + elif self.local_file_path and self.is_wheel: + return get_wheel_distribution( + FilesystemWheel(self.local_file_path), canonicalize_name(self.name) + ) + raise AssertionError( + f"InstallRequirement {self} has no metadata directory and no wheel: " + f"can't make a distribution." + ) def assert_source_matches_version(self) -> None: assert self.source_dir @@ -758,6 +778,7 @@ class InstallRequirement: if self.is_wheel: assert self.local_file_path direct_url = None + # TODO this can be refactored to direct_url = self.download_info if self.editable: direct_url = direct_url_for_editable(self.unpacked_source_directory) elif self.original_link: diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/req_set.py b/sbsheriff/Lib/site-packages/pip/_internal/req/req_set.py index 6626c37..ec7a6e0 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/req/req_set.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/req/req_set.py @@ -1,13 +1,10 @@ import logging from collections import OrderedDict -from typing import Dict, Iterable, List, Optional, Tuple +from typing import Dict, List from pip._vendor.packaging.utils import canonicalize_name -from pip._internal.exceptions import InstallationError -from pip._internal.models.wheel import Wheel from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils import compatibility_tags logger = logging.getLogger(__name__) @@ -51,123 +48,6 @@ class RequirementSet: project_name = canonicalize_name(install_req.name) self.requirements[project_name] = install_req - def add_requirement( - self, - install_req: InstallRequirement, - parent_req_name: Optional[str] = None, - extras_requested: Optional[Iterable[str]] = None, - ) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]]: - """Add install_req as a requirement to install. - - :param parent_req_name: The name of the requirement that needed this - added. The name is used because when multiple unnamed requirements - resolve to the same name, we could otherwise end up with dependency - links that point outside the Requirements set. parent_req must - already be added. Note that None implies that this is a user - supplied requirement, vs an inferred one. - :param extras_requested: an iterable of extras used to evaluate the - environment markers. - :return: Additional requirements to scan. That is either [] if - the requirement is not applicable, or [install_req] if the - requirement is applicable and has just been added. - """ - # If the markers do not match, ignore this requirement. - if not install_req.match_markers(extras_requested): - logger.info( - "Ignoring %s: markers '%s' don't match your environment", - install_req.name, - install_req.markers, - ) - return [], None - - # If the wheel is not supported, raise an error. - # Should check this after filtering out based on environment markers to - # allow specifying different wheels based on the environment/OS, in a - # single requirements file. - if install_req.link and install_req.link.is_wheel: - wheel = Wheel(install_req.link.filename) - tags = compatibility_tags.get_supported() - if self.check_supported_wheels and not wheel.supported(tags): - raise InstallationError( - "{} is not a supported wheel on this platform.".format( - wheel.filename - ) - ) - - # This next bit is really a sanity check. - assert ( - not install_req.user_supplied or parent_req_name is None - ), "a user supplied req shouldn't have a parent" - - # Unnamed requirements are scanned again and the requirement won't be - # added as a dependency until after scanning. - if not install_req.name: - self.add_unnamed_requirement(install_req) - return [install_req], None - - try: - existing_req: Optional[InstallRequirement] = self.get_requirement( - install_req.name - ) - except KeyError: - existing_req = None - - has_conflicting_requirement = ( - parent_req_name is None - and existing_req - and not existing_req.constraint - and existing_req.extras == install_req.extras - and existing_req.req - and install_req.req - and existing_req.req.specifier != install_req.req.specifier - ) - if has_conflicting_requirement: - raise InstallationError( - "Double requirement given: {} (already in {}, name={!r})".format( - install_req, existing_req, install_req.name - ) - ) - - # When no existing requirement exists, add the requirement as a - # dependency and it will be scanned again after. - if not existing_req: - self.add_named_requirement(install_req) - # We'd want to rescan this requirement later - return [install_req], install_req - - # Assume there's no need to scan, and that we've already - # encountered this for scanning. - if install_req.constraint or not existing_req.constraint: - return [], existing_req - - does_not_satisfy_constraint = install_req.link and not ( - existing_req.link and install_req.link.path == existing_req.link.path - ) - if does_not_satisfy_constraint: - raise InstallationError( - "Could not satisfy constraints for '{}': " - "installation from path or url cannot be " - "constrained to a version".format(install_req.name) - ) - # If we're now installing a constraint, mark the existing - # object for real installation. - existing_req.constraint = False - # If we're now installing a user supplied requirement, - # mark the existing object as such. - if install_req.user_supplied: - existing_req.user_supplied = True - existing_req.extras = tuple( - sorted(set(existing_req.extras) | set(install_req.extras)) - ) - logger.debug( - "Setting %s extras to: %s", - existing_req, - existing_req.extras, - ) - # Return the existing requirement for addition to the parent and - # scanning again. - return [existing_req], existing_req - def has_requirement(self, name: str) -> bool: project_name = canonicalize_name(name) @@ -187,3 +67,16 @@ class RequirementSet: @property def all_requirements(self) -> List[InstallRequirement]: return self.unnamed_requirements + list(self.requirements.values()) + + @property + def requirements_to_install(self) -> List[InstallRequirement]: + """Return the list of requirements that need to be installed. + + TODO remove this property together with the legacy resolver, since the new + resolver only returns requirements that need to be installed. + """ + return [ + install_req + for install_req in self.all_requirements + if not install_req.constraint and not install_req.satisfied_by + ] diff --git a/sbsheriff/Lib/site-packages/pip/_internal/req/req_uninstall.py b/sbsheriff/Lib/site-packages/pip/_internal/req/req_uninstall.py index 472090a..15b6738 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/req/req_uninstall.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/req/req_uninstall.py @@ -3,7 +3,7 @@ import os import sys import sysconfig from importlib.util import cache_from_source -from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple +from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple from pip._internal.exceptions import UninstallationError from pip._internal.locations import get_bin_prefix, get_bin_user @@ -17,7 +17,9 @@ from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory logger = getLogger(__name__) -def _script_names(bin_dir: str, script_name: str, is_gui: bool) -> Iterator[str]: +def _script_names( + bin_dir: str, script_name: str, is_gui: bool +) -> Generator[str, None, None]: """Create the fully qualified name of the files created by {console,gui}_scripts for the given ``dist``. Returns the list of file names @@ -34,9 +36,11 @@ def _script_names(bin_dir: str, script_name: str, is_gui: bool) -> Iterator[str] yield f"{exe_name}-script.py" -def _unique(fn: Callable[..., Iterator[Any]]) -> Callable[..., Iterator[Any]]: +def _unique( + fn: Callable[..., Generator[Any, None, None]] +) -> Callable[..., Generator[Any, None, None]]: @functools.wraps(fn) - def unique(*args: Any, **kw: Any) -> Iterator[Any]: + def unique(*args: Any, **kw: Any) -> Generator[Any, None, None]: seen: Set[Any] = set() for item in fn(*args, **kw): if item not in seen: @@ -47,7 +51,7 @@ def _unique(fn: Callable[..., Iterator[Any]]) -> Callable[..., Iterator[Any]]: @_unique -def uninstallation_paths(dist: BaseDistribution) -> Iterator[str]: +def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]: """ Yield all the uninstallation paths for dist based on RECORD-without-.py[co] @@ -527,7 +531,10 @@ class UninstallPathSet: # above, so this only covers the setuptools-style editable. with open(develop_egg_link) as fh: link_pointer = os.path.normcase(fh.readline().strip()) - assert link_pointer == dist_location, ( + normalized_link_pointer = normalize_path(link_pointer) + assert os.path.samefile( + normalized_link_pointer, normalized_dist_location + ), ( f"Egg-link {link_pointer} does not match installed location of " f"{dist.raw_name} (at {dist_location})" ) @@ -551,10 +558,10 @@ class UninstallPathSet: # find distutils scripts= scripts try: - for script in dist.iterdir("scripts"): - paths_to_remove.add(os.path.join(bin_dir, script.name)) + for script in dist.iter_distutils_script_names(): + paths_to_remove.add(os.path.join(bin_dir, script)) if WINDOWS: - paths_to_remove.add(os.path.join(bin_dir, f"{script.name}.bat")) + paths_to_remove.add(os.path.join(bin_dir, f"{script}.bat")) except (FileNotFoundError, NotADirectoryError): pass @@ -562,7 +569,7 @@ class UninstallPathSet: def iter_scripts_to_remove( dist: BaseDistribution, bin_dir: str, - ) -> Iterator[str]: + ) -> Generator[str, None, None]: for entry_point in dist.iter_entry_points(): if entry_point.group == "console_scripts": yield from _script_names(bin_dir, entry_point.name, False) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc index 4d99b26446cba8493f66897c2bc29a5136d0050b..d980540002970b8a1810630d7d163c452d5e568a 100644 GIT binary patch delta 19 ZcmX@gc$ASlpO=@50SHPD%TMIq1pqDI1lRxo delta 19 ZcmX@gc$ASlpO=@50SKzqB`0$40st!C1Uvu$ diff --git a/sbsheriff/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-310.pyc index 154d63c811178ee3ec99c5227d8e6a656a94a261..e17991bb2cb5be4fcbb7d6dfab5cb1cd7bebe7b2 100644 GIT binary patch delta 20 acmbQqF_VKkpO=@50SHPD%Wvf7V*vmxR|EzC delta 20 acmbQqF_VKkpO=@50SKzqB{y>Ou>b%ly8~(f diff --git a/sbsheriff/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc index 2e991592a22e05b696b15daa342b7cad6d1a908b..fe2d0577990a5133d5ba6ba5fb94c1a1e8ac31ed 100644 GIT binary patch delta 19 ZcmX@Zc!rTXpO=@50SHPD%TMG!2mmhP1nmF- delta 19 ZcmX@Zc!rTXpO=@50SKzqB`0zp1OO}I1W^D0 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc index 20dee5d8c754ea2d40deaec608c64200230a9504..6af4559fe5e18d16d4a7e3e9221bba2fe72c79ed 100644 GIT binary patch delta 5645 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 s&p!u~aNS|gKoKhLJbfvoo3h0jm Tuple[List[InstallRequirement], Optional[InstallRequirement]]: + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + install_req.name, + install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + tags = compatibility_tags.get_supported() + if requirement_set.check_supported_wheels and not wheel.supported(tags): + raise InstallationError( + "{} is not a supported wheel on this platform.".format( + wheel.filename + ) + ) + + # This next bit is really a sanity check. + assert ( + not install_req.user_supplied or parent_req_name is None + ), "a user supplied req shouldn't have a parent" + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not install_req.name: + requirement_set.add_unnamed_requirement(install_req) + return [install_req], None + + try: + existing_req: Optional[ + InstallRequirement + ] = requirement_set.get_requirement(install_req.name) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None + and existing_req + and not existing_req.constraint + and existing_req.extras == install_req.extras + and existing_req.req + and install_req.req + and existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: {} (already in {}, name={!r})".format( + install_req, existing_req, install_req.name + ) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + requirement_set.add_named_requirement(install_req) + # We'd want to rescan this requirement later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = install_req.link and not ( + existing_req.link and install_req.link.path == existing_req.link.path + ) + if does_not_satisfy_constraint: + raise InstallationError( + "Could not satisfy constraints for '{}': " + "installation from path or url cannot be " + "constrained to a version".format(install_req.name) + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + # If we're now installing a user supplied requirement, + # mark the existing object as such. + if install_req.user_supplied: + existing_req.user_supplied = True + existing_req.extras = tuple( + sorted(set(existing_req.extras) | set(install_req.extras)) + ) + logger.debug( + "Setting %s extras to: %s", + existing_req, + existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + def _is_upgrade_allowed(self, req: InstallRequirement) -> bool: if self.upgrade_strategy == "to-satisfy-only": return False @@ -310,6 +432,14 @@ class Resolver(BaseResolver): logger.debug("Using cached wheel link: %s", cache_entry.link) if req.link is req.original_link and cache_entry.persistent: req.original_link_is_in_wheel_cache = True + if cache_entry.origin is not None: + req.download_info = cache_entry.origin + else: + # Legacy cache entry that does not have origin.json. + # download_info may miss the archive_info.hash field. + req.download_info = direct_url_from_link( + req.link, link_is_in_wheel_cache=cache_entry.persistent + ) req.link = cache_entry.link def _get_dist_for(self, req: InstallRequirement) -> BaseDistribution: @@ -393,7 +523,8 @@ class Resolver(BaseResolver): # the legacy resolver so I'm just not going to bother refactoring. sub_install_req = self._make_install_req(str(subreq), req_to_install) parent_req_name = req_to_install.name - to_scan_again, add_to_parent = requirement_set.add_requirement( + to_scan_again, add_to_parent = self._add_requirement_to_set( + requirement_set, sub_install_req, parent_req_name=parent_req_name, extras_requested=extras_requested, @@ -410,7 +541,9 @@ class Resolver(BaseResolver): # 'unnamed' requirements can only come from being directly # provided by the user. assert req_to_install.user_supplied - requirement_set.add_requirement(req_to_install, parent_req_name=None) + self._add_requirement_to_set( + requirement_set, req_to_install, parent_req_name=None + ) if not self.ignore_dependencies: if req_to_install.extras: diff --git a/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc index 141e19f04e95abc01a9556a9ccc0ea5c6b898c4e..130dbdf26a060b8be1bf760dad5194147f4a1dbf 100644 GIT binary patch delta 19 Zcmcb>c!7~SpO=@50SHPD%TMG!3IH#51o;2} delta 19 Zcmcb>c!7~SpO=@50SKzqB`0zp1pq8|1YH0C diff --git a/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc index fe501ace301c18acab8b1b6b24f4863e5f7d579f..5b8663981683c739ecfbc658585373d37600e5fc 100644 GIT binary patch delta 20 acmdmNwAqL|pO=@50SHPD%Wve?kOTlWWCXnc delta 20 acmdmNwAqL|pO=@50SKzqB{yrxf>v1 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 delta 5841 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 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc index 7fd7b3fc361fb7f5130f1a722d90587a5ff224bf..bd9f35c5bed1495db6d1914faf237bb803d2fcd3 100644 GIT binary patch delta 5943 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 P-|h~xkWc;NeE0tW1s0;t delta 5966 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 D+W+~J delta 1101 zcmZXS%TE(Q7{GV7yS3f!w$S=&5%JL=6$(B;gkXK*BVvLv@z7{Cr8C>ES-NFrTLB*^ z5HTt-ac(4@Bqm;rrbjO(B%VF5Xa52pi3bzsE0JKF&HVOz?)S~N^W)^|DZ@1kO%m(Q zfn;&&y)hcty9-pY*opv=@(4?Lxh!Gy3grV~8K*c4^v#8FlmtnH=s0G{Nhv8=JC`I2 z;TGJwXygqXCs7hhN;pBncq?hKf_NL=zNq9|@ea}=EKRSa;GH-rtnnpDk@AUaQl^a> zqHHc8FdKC%&P>*}vK2xw!M;igB|>Loo}1NK!Lyk)lZ6nTQC3HHuv)cB31j9&&33S9 z6>O&_bU#*|G3$gf+pU;(#d3R#P~qGV5%Hanvrj;aMUgDa=>I45GpIM-26Y+r@(-bTbgYpJk0YTx*U~M= zMJi1Lx&T9bP0OJ^E=Ly73H~T@361d2k%y5(;2Z!P<2UrD>6{S#z$7dA3MEsF9tBqu z{UDtaxX2^MOEl4VV_Xd!-SB4uzTA7rM<&G^DI0mdHsaXKE4q`_+#1ieo(c9r&?v99 z-pV#xm;k*3C=2*HbE!wLX?tYypC-5-Z$qznSKLNf{vv+lI?ReHfH)ulfG+8@fNz*) z(J3%iB#vX6n@)2WLYhZ{pR`|WHZBm7LP(A&-*_s~rOCSdJ!(Y1$@}=l#4c3fB+-us z8!L%-DjMXMlONGTuBSS?p>1EO7Q8Zj0HRvAne8+g3;CUqB!XpN;@Fe(ZX3UD!I1m=cUy*K|a|k{O_$ zc==l#w^Xt#C3>27w@;(9jn(!$a1r-(3=hE>{cwqRVuK_jWoZtsp9&* N;k@GlO7kxrsXyg@`= None: self._finder = finder @@ -108,7 +106,6 @@ class Factory: self._use_user_site = use_user_site self._force_reinstall = force_reinstall self._ignore_requires_python = ignore_requires_python - self._suppress_build_failures = suppress_build_failures self._build_failures: Cache[InstallationError] = {} self._link_candidate_cache: Cache[LinkCandidate] = {} @@ -201,12 +198,6 @@ class Factory: ) self._build_failures[link] = e return None - except InstallationSubprocessError as e: - if not self._suppress_build_failures: - raise - logger.warning("Discarding %s due to build failure: %s", link, e) - self._build_failures[link] = e - return None base: BaseCandidate = self._editable_candidate_cache[link] else: @@ -228,12 +219,6 @@ class Factory: ) self._build_failures[link] = e return None - except InstallationSubprocessError as e: - if not self._suppress_build_failures: - raise - logger.warning("Discarding %s due to build failure: %s", link, e) - self._build_failures[link] = e - return None base = self._link_candidate_cache[link] if not extras: @@ -617,8 +602,15 @@ class Factory: req_disp = f"{req} (from {parent.name})" cands = self._finder.find_all_candidates(req.project_name) + skipped_by_requires_python = self._finder.requires_python_skipped_reasons() versions = [str(v) for v in sorted({c.version for c in cands})] + if skipped_by_requires_python: + logger.critical( + "Ignored the following versions that require a different python " + "version: %s", + "; ".join(skipped_by_requires_python) or "none", + ) logger.critical( "Could not find a version that satisfies the requirement %s " "(from versions: %s)", diff --git a/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py b/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py index e6ec959..6300dfc 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py @@ -117,7 +117,7 @@ class PipProvider(_ProviderBase): The lower the return value is, the more preferred this group of arguments is. - Currently pip considers the followings in order: + Currently pip considers the following in order: * Prefer if any of the known requirements is "direct", e.g. points to an explicit URL. diff --git a/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py index 32ef789..a605d6c 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py @@ -47,7 +47,6 @@ class Resolver(BaseResolver): ignore_requires_python: bool, force_reinstall: bool, upgrade_strategy: str, - suppress_build_failures: bool, py_version_info: Optional[Tuple[int, ...]] = None, ): super().__init__() @@ -62,7 +61,6 @@ class Resolver(BaseResolver): force_reinstall=force_reinstall, ignore_installed=ignore_installed, ignore_requires_python=ignore_requires_python, - suppress_build_failures=suppress_build_failures, py_version_info=py_version_info, ) self.ignore_dependencies = ignore_dependencies diff --git a/sbsheriff/Lib/site-packages/pip/_internal/self_outdated_check.py b/sbsheriff/Lib/site-packages/pip/_internal/self_outdated_check.py index 7300e0e..9e2149c 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/self_outdated_check.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/self_outdated_check.py @@ -1,23 +1,34 @@ import datetime +import functools import hashlib import json import logging import optparse import os.path import sys -from typing import Any, Dict +from dataclasses import dataclass +from typing import Any, Callable, Dict, Optional from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.rich.console import Group +from pip._vendor.rich.markup import escape +from pip._vendor.rich.text import Text from pip._internal.index.collector import LinkCollector from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import get_default_environment +from pip._internal.metadata.base import DistributionVersion from pip._internal.models.selection_prefs import SelectionPreferences from pip._internal.network.session import PipSession +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.entrypoints import ( + get_best_invocation_for_this_pip, + get_best_invocation_for_this_python, +) from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace from pip._internal.utils.misc import ensure_dir -SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" +_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" logger = logging.getLogger(__name__) @@ -31,17 +42,17 @@ def _get_statefile_name(key: str) -> str: class SelfCheckState: def __init__(self, cache_dir: str) -> None: - self.state: Dict[str, Any] = {} - self.statefile_path = None + self._state: Dict[str, Any] = {} + self._statefile_path = None # Try to load the existing state if cache_dir: - self.statefile_path = os.path.join( + self._statefile_path = os.path.join( cache_dir, "selfcheck", _get_statefile_name(self.key) ) try: - with open(self.statefile_path, encoding="utf-8") as statefile: - self.state = json.load(statefile) + with open(self._statefile_path, encoding="utf-8") as statefile: + self._state = json.load(statefile) except (OSError, ValueError, KeyError): # Explicitly suppressing exceptions, since we don't want to # error out if the cache file is invalid. @@ -51,41 +62,87 @@ class SelfCheckState: def key(self) -> str: return sys.prefix - def save(self, pypi_version: str, current_time: datetime.datetime) -> None: + def get(self, current_time: datetime.datetime) -> Optional[str]: + """Check if we have a not-outdated version loaded already.""" + if not self._state: + return None + + if "last_check" not in self._state: + return None + + if "pypi_version" not in self._state: + return None + + seven_days_in_seconds = 7 * 24 * 60 * 60 + + # Determine if we need to refresh the state + last_check = datetime.datetime.strptime(self._state["last_check"], _DATE_FMT) + seconds_since_last_check = (current_time - last_check).total_seconds() + if seconds_since_last_check > seven_days_in_seconds: + return None + + return self._state["pypi_version"] + + def set(self, pypi_version: str, current_time: datetime.datetime) -> None: # If we do not have a path to cache in, don't bother saving. - if not self.statefile_path: + if not self._statefile_path: return # Check to make sure that we own the directory - if not check_path_owner(os.path.dirname(self.statefile_path)): + if not check_path_owner(os.path.dirname(self._statefile_path)): return # Now that we've ensured the directory is owned by this user, we'll go # ahead and make sure that all our directories are created. - ensure_dir(os.path.dirname(self.statefile_path)) + ensure_dir(os.path.dirname(self._statefile_path)) state = { # Include the key so it's easy to tell which pip wrote the # file. "key": self.key, - "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "last_check": current_time.strftime(_DATE_FMT), "pypi_version": pypi_version, } text = json.dumps(state, sort_keys=True, separators=(",", ":")) - with adjacent_tmp_file(self.statefile_path) as f: + with adjacent_tmp_file(self._statefile_path) as f: f.write(text.encode()) try: # Since we have a prefix-specific state file, we can just # overwrite whatever is there, no need to check. - replace(f.name, self.statefile_path) + replace(f.name, self._statefile_path) except OSError: # Best effort. pass +@dataclass +class UpgradePrompt: + old: str + new: str + + def __rich__(self) -> Group: + if WINDOWS: + pip_cmd = f"{get_best_invocation_for_this_python()} -m pip" + else: + pip_cmd = get_best_invocation_for_this_pip() + + notice = "[bold][[reset][blue]notice[reset][bold]][reset]" + return Group( + Text(), + Text.from_markup( + f"{notice} A new release of pip available: " + f"[red]{self.old}[reset] -> [green]{self.new}[reset]" + ), + Text.from_markup( + f"{notice} To update, run: " + f"[green]{escape(pip_cmd)} install --upgrade pip" + ), + ) + + def was_installed_by_pip(pkg: str) -> bool: """Checks whether pkg was installed by pip @@ -96,6 +153,65 @@ def was_installed_by_pip(pkg: str) -> bool: return dist is not None and "pip" == dist.installer +def _get_current_remote_pip_version( + session: PipSession, options: optparse.Values +) -> str: + # Lets use PackageFinder to see what the latest pip version is + link_collector = LinkCollector.create( + session, + options=options, + suppress_no_index=True, + ) + + # Pass allow_yanked=False so we don't suggest upgrading to a + # yanked version. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=False, # Explicitly set to False + ) + + finder = PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + best_candidate = finder.find_best_candidate("pip").best_candidate + if best_candidate is None: + return + + return str(best_candidate.version) + + +def _self_version_check_logic( + *, + state: SelfCheckState, + current_time: datetime.datetime, + local_version: DistributionVersion, + get_remote_version: Callable[[], str], +) -> Optional[UpgradePrompt]: + remote_version_str = state.get(current_time) + if remote_version_str is None: + remote_version_str = get_remote_version() + state.set(remote_version_str, current_time) + + remote_version = parse_version(remote_version_str) + logger.debug("Remote version of pip: %s", remote_version) + logger.debug("Local version of pip: %s", local_version) + + pip_installed_by_pip = was_installed_by_pip("pip") + logger.debug("Was pip installed by pip? %s", pip_installed_by_pip) + if not pip_installed_by_pip: + return None # Only suggest upgrade if pip is installed by pip. + + local_version_is_older = ( + local_version < remote_version + and local_version.base_version != remote_version.base_version + ) + if local_version_is_older: + return UpgradePrompt(old=str(local_version), new=remote_version_str) + + return None + + def pip_self_version_check(session: PipSession, options: optparse.Values) -> None: """Check for an update for pip. @@ -107,83 +223,17 @@ def pip_self_version_check(session: PipSession, options: optparse.Values) -> Non if not installed_dist: return - pip_version = installed_dist.version - pypi_version = None - try: - state = SelfCheckState(cache_dir=options.cache_dir) - - current_time = datetime.datetime.utcnow() - # Determine if we need to refresh the state - if "last_check" in state.state and "pypi_version" in state.state: - last_check = datetime.datetime.strptime( - state.state["last_check"], SELFCHECK_DATE_FMT - ) - if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: - pypi_version = state.state["pypi_version"] - - # Refresh the version if we need to or just see if we need to warn - if pypi_version is None: - # Lets use PackageFinder to see what the latest pip version is - link_collector = LinkCollector.create( - session, - options=options, - suppress_no_index=True, - ) - - # Pass allow_yanked=False so we don't suggest upgrading to a - # yanked version. - selection_prefs = SelectionPreferences( - allow_yanked=False, - allow_all_prereleases=False, # Explicitly set to False - ) - - finder = PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - use_deprecated_html5lib=( - "html5lib" in options.deprecated_features_enabled - ), - ) - best_candidate = finder.find_best_candidate("pip").best_candidate - if best_candidate is None: - return - pypi_version = str(best_candidate.version) - - # save that we've performed a check - state.save(pypi_version, current_time) - - remote_version = parse_version(pypi_version) - - local_version_is_older = ( - pip_version < remote_version - and pip_version.base_version != remote_version.base_version - and was_installed_by_pip("pip") - ) - - # Determine if our pypi_version is older - if not local_version_is_older: - return - - # We cannot tell how the current pip is available in the current - # command context, so be pragmatic here and suggest the command - # that's always available. This does not accommodate spaces in - # `sys.executable` on purpose as it is not possible to do it - # correctly without knowing the user's shell. Thus, - # it won't be done until possible through the standard library. - # Do not be tempted to use the undocumented subprocess.list2cmdline. - # It is considered an internal implementation detail for a reason. - pip_cmd = f"{sys.executable} -m pip" - logger.warning( - "You are using pip version %s; however, version %s is " - "available.\nYou should consider upgrading via the " - "'%s install --upgrade pip' command.", - pip_version, - pypi_version, - pip_cmd, + upgrade_prompt = _self_version_check_logic( + state=SelfCheckState(cache_dir=options.cache_dir), + current_time=datetime.datetime.utcnow(), + local_version=installed_dist.version, + get_remote_version=functools.partial( + _get_current_remote_pip_version, session, options + ), ) + if upgrade_prompt is not None: + logger.warning("[present-rich] %s", upgrade_prompt) except Exception: - logger.debug( - "There was an error checking the latest version of pip", - exc_info=True, - ) + logger.warning("There was an error checking the latest version of pip.") + logger.debug("See below for error", exc_info=True) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-310.pyc index fb7cf2ee3d5f07ead5a2cf8f7851348fba684665..268f06c61026b567f07515c42cf9f2cbb153cb41 100644 GIT binary patch delta 19 ZcmX@Wcz}^RpO=@50SHPD%TMIq3IHu81jzsZ delta 19 ZcmX@Wcz}^RpO=@50SKzqB`0!k1pq201T6pn diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-310.pyc index 985bbf8aa678655b631a392277f71216a0bdf27f..27d2bc90fec92bb8a6278e6e8616a34c7804250b 100644 GIT binary patch delta 20 acmeys{ehc1pO=@50SHPD%Wvd<$_fBGTm_N< delta 20 acmeys{ehc1pO=@50SKzqB{yWl2VU-ehss FvjCyT5z_zw delta 51 zcmaFD{e+u4pO=@50SKzqB{y<^Vv%Ais4U6I&%4EuSd?CnSX7*Pi@m%!J+mk^ZL&D) FSpbc75jOw; diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc index 54abb7e000e4d209e5221df6a379d045a37e0e99..1121c07398af946e0897eb72bc0ec141fa422e28 100644 GIT binary patch delta 20 acmaDW|5lzmpO=@50SHPD%Wvd<#18;Hz6HAg delta 20 acmaDW|5lzmpO=@50SKzqB{yX=dTh=jG*M0D{uP@*BB-FaiK7R0O#I delta 20 ZcmZo>X=dTh=jG*M0D@|D$&K7U7y%}@1RVeX diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc index 6b398cc06f98082879ed1aa2b60c9b191224d1a2..ef8b97a1160a7b900266116468e409583d5690ce 100644 GIT binary patch delta 20 acmew=`BjoTpO=@50SHPD%Wvd<#RC97BL&0& delta 20 acmew=`BjoTpO=@50SKzqB{y=v;sF3UhXp7A diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc index d95ecb32dff20ab105ef65a861ca623cf72141ca..bda8084e62007e3444508930cb4cd4f1dae7611f 100644 GIT binary patch delta 20 acmZ21uvmaQpO=@50SHPD%WveC-~a$G3j{a- delta 20 acmZ21uvmaQpO=@50SKzqB{y0$S8@4aKF*8A(&*++aRJLUFk`0>}-%R6P{>(WMNbIhoslK zznKnF0 zHb-19tAZQepLVaj6Ul`H-Jf=@EQuN|`HO^`|12fQ>lPh>Dh$?W{_O$s-1KW!Y6&&t z5bN3lX-dc0}Bx^BZ zobx*rA*SRlIcBG%a`nAqR=L96AhSl*u(x2M@d=^*;#z3GIx`RL{st)?iq@=IH7i^fb=Xo56bK)%TKd^^-z+5inAP~*qVpcq~}5t$FEy@l7oG4UHeI%#a04~*oA}a z;F50Eba-J6H8W7k9s}1Z{tzQoo@uagbrU4MTO@n_qAX&s%f!?!4i&ZwJE*W3aMMP6 zi`=lA@l+1Skf*~%NVs~!lk%GBJAqr6bE$S84_@Qr>cOD_bvD?OCj)JANJpSz+^C_R zNKoVPK##7ZeKi_rW#neTqaz+mJt$PMJye;Iknv=@G%C^C0#|x24ei!!73cNZyqV#3 z#~L=F?;>LjpE`7%b|_=cFXlPacdXW?%z0{+Yd8kVght6gni e9zCCKiQTqde<#gFnaC#=cx{)qOS<@-``zC>Kq_qj literal 1099 zcmZ`(%Wu;#7`GEAeXK(pOp}U)6mdb3Sa(MZF|9lf(}Xl3L=;rHv736!YqqnkqvZlu z{s-X3zvLU@#J_+z@FiW>9^i{?fBqi!?|V4;`g$7yy?@Y+eh`FyR-09FVe=G*3SeT0 z;RK~Pz_{YA#7gbJu6a8lsS`M<8@L$7h>>qNXmFc1KH{Ls9PaW~7crMRyv181tBXd2 zHCXc#3EHf6jQsX5I3M}gZ1#oHr51_Wm+>I54r8o9PLiK+%rR4wCs7Q)JuiVjC1hN3{$UN6Kw;56@F6WUMLS?LsE4eOZ7U3#~ z*W|$3f^h&ty@W}i8J?m(dUtPTU9D+!f~QuD8UBnzYi7^L8hbE8sCmTOOYx|B zGuLU6HnOu>t@o1OsmX diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc index cfe43d280561896f36850795117d70c6e0486397..57f8c21021719fc15b1025dcbcd18be7cc856d53 100644 GIT binary patch delta 1613 zcmaJ>&5ztP6t^8Glg(znc9$)KDoAMs%z+US5(l)Z*e}#du&lIO6-8S`*|BFQLncWb z&weSRLF)bkrHBivG;=}X$lt)73pZc+FOXHWrf&`{-@ z^%>bgkFZ~3t8AHD+~my`Y9Z$Gl^$hPR=YC&RgjuJ!s@JXMg6sf)MP6ly~gkXYOg(( z-lUCH<^J8hoiFYmC?kt9g*yse(hfi8T?|3L7z7v-<~GcH9mokP(1XetvM@yjp5e#j zApxgY*kA;&bdW|#n<&!xK$%%6Wd0)(F4%tWZGU`pFXtjZI*?Cp(W4vAMjYj`n+~(v zP3>NLun-~kbL+XNf$-C}=f@o{eY?V7}g;}mffx$v%L~Iq5AdC*s!?vtHLQs42sZO7D zdFN1Ecrx{R(aA_~FC9rw_PKXF;koqA!qOHcr|DPRgK~LMQkuIXA$TG^o}5M^O@_dC zROO&6qDIF1rU_csskl-0Scc<&GO>2^ctnktg!ie{ngizN_+E`qW$!F$oUvXfK{ zyJ0@zs4q{&lc1N1K=z|N$S!0*P1=^r5ai`E?*J zY2Y_$15<2c2R?#bOrP15eC-vX8@@ z>r9CoTKBdlH-WUFt-%5D4nq4#ysOpv7k>E%id!J=z|6JYA})4}6-W&=N=qB>wb#{B zB)O1j8t0}DT zM1V@+!Il1M5XNzO#&vZiPxRg#Kq*o->PltgQYZubm;InDPx-J#7@vZNm%%7|V+hA$ pep`3G9D;_1VMCd1+`ulxMhq9PWBLa*ZERtOSkJCowQDQue*!5&okRct delta 259 zcmcaCGL5S~pO=@50SKzqC6nb@7#JRdILLq%$Z-JTVizEh!jQt4!w?0cnQ|C&nWC6- znWLB)L44*MmR!~-Rv?=rg(a0al_`}?l0lLog*BBujU|OGg}sF}iX(+Fm_d{CCD0@W zKTW1vEIyMt8AUfsF;y^gfb3bxP{cL4moZ0;Bfh*Sv7jKeh#e?e%mF0Wc$gSj{&R2? z@c=oRjDDJ&MeLKKIgM?Zi%W`bF=ytLfMtq6owW&p|#EO7t; diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc index ea76f7d1491972d68040844131626e466785b9a4..d894eeaa512782037e87e93c9d118f938d8c02a4 100644 GIT binary patch delta 1017 zcmYjPO=}ZT6wRGXz9(OkG)>c_Nn2};F`=lXh%HtGr62{Z1^b{)OWzwCnQ7!DB9uZa zEp9}lyp0<-uIy6s16=4|a5D=LT!=ftKj6KSQZvIG?mg$+d*8==y!3Li){e)cK75{k zDQ|08pYJCngAb{T_;vPAYK;TU4md#;1RwWtza4VIEbPU)9dV*8>cm*gF__`RS=>pm zgp*`RPY>8BC(Y81$xJ81G9DMSv(6A3^5T%4bB5V4#$l1?5iw%vJj!FoIxC2v#~C8Z zBL~6|F%BFo|A@~D@;FZ%>qo#wMVcpt$x}xlGCX|*+WuYaD8pi(*WCdBHvn6NaIbY9@2C{3P8d1Q*bgv^C=^MCIcFQYOw z;H~g+WG-@8@l_|(cUaUT_rz{*TwBl}rJDLo?^ke53r*m`yI`rM$YrRhZln(N-iOFO zz(Qw_3JvHH*tKakmL71hWVm>QB51 zv%Ny%8r+yiqUx795|adXiO}RNifag`;Oes7?)E!Xh`xhxs9q)4mLE`hgg)n+jw#Lo>kiYoim88;NRWz%&cRLevZu^jzd0kZ#vp delta 1647 zcmZux&1)M+6yKTMl~&T~!)sZxWI5jWd+kQH6R06gA;oS;8sfBd!DPY6vSwr}*|nUR zHHjSslQ`EL${u^ztFD?CgZ|wvVy2C#G=J$SY-kW)& zeKhi7a=M*PClz=eOq3dWQBi)u$?3;{$z^!uH=j>e_lc*wI#U?&Vr~q6sTcPR*B}aD z)l2wEHyL5gOZld2`e`@qXWWdRb+dlX&G|iUPvqA<%kOo2{k)s^``o^Wi+KgV=oTX! z_xk;kTLNtGGE4A*rpA&iwf{tOE6fBcjWi?87|XCMu!EgkaTzq|sSav@O?VfuiJM^d5`prZbd(M` zq(oVP#w{zF642cXM8SccCS6ok2OrYCSfF<30ePsdC|ik0HFm7JrQFTmQ#z`cgVi)f zI{WlXxDU_NL-Ls1%|BM|DUP-mu88`!EjM?9mRD`Gw|CD^I`;ZbVEaIGA=*OPNVm2& zY}szy;ep+3d0g5-J88qSyv-Y}x_1S*4^eH`rOodH8E{rj9!og4>z-`y+nYhKEicZ@ ztnX~d>h^B1+1{$Q#l}oa${l`Tetveg8b$m`*7nkCc1zmzlcY~7zT|PK_O{&Kh3-m*KiMF2)&W9QId+*1=oGf&H*7SU}(%DCJY)` zO{ITpx<%-}RHeU*>F{|ve^m!r)H@3Rb}pdL)sAvVZfl2d7rrJ~ye5Ns&^4B8*Or%W zE?gG{&~|k%V&gKX`E3@GOwke(;8=uL;uW!om^gB^Rhl>tGvR;**HIj$p&A_1lXsVEyyrYhq{h&k3oE%FQqu_W5{OIT&$+?rD+sYG0zVC1wY3#=^`_UZ2gf`0 z(G}$kLZ@f^;=3?66ay-KJ@ES4Bu`Ch5=$)%SVgK;NTHOZmTp<)N;zr8%UU7vABSOU AfB*mh diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc index ac1b7fbd10fd4417eec2845029831ae4b62aa629..b05d5d236f70e60aa36755f47ce3e73ef9447797 100644 GIT binary patch delta 20 acmZ3-zK)$cpO=@50SHPD%Wvdf%nSf9dIZ7% delta 20 acmZ3-zK)$cpO=@50SKzqB{y;}W(EK(-UKE9 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-310.pyc index c8ac3b3dfd1e913145f7385fc7838bd9f2d9378a..84f14218d9de1b50dff18b3695de66908f423234 100644 GIT binary patch delta 20 ZcmZqYZRh3A=jG*M0D{uP@*BBp*Z?a%1Y7_B delta 20 ZcmZqYZRh3A=jG*M0D@|D$&K7KYyc;r1Hb?P diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-310.pyc index 7d38c54d158e589ca4356fbf3c14329486359de8..7fe2002ec684c7bec51b6f0768193ecc65e4fec0 100644 GIT binary patch delta 27 hcmX@5aY};pO=@50SHPD%WveqzzhI4f(1zc delta 20 acmcc3ew&>;pO=@50SKzqB{yu(#!5x+eij}MU)^(OT^Nu*^;mMl4bNRDkuQEk_;A|tY5S7#Ii#ak+r??`6v zWJ{`4*_I2(b=|<;wod9KwSj&K5ELkc^dBhDHc62J`B0#T_KUwc=(n~g&;m_o_UM;@ zh`68Tu`@e6JG(m%PyhRLv>c6wCHPzZZCAc>C)z>&d1qic5wgO1m`H|XD5h-H=rw}& zn|E#{H?0P}L9nXXXf^3gRm*|`MRRNM5U$u#$F>q z4}iSZNG7F%Vze4<*ZttABujD84bfbKK) z&^kH^VPhCUW6&6aFkUgpSt&F8n0L!fL(w_9;+#5jp5-bP$}+@NPZUiDsDSI6EUmi1 zDKlr==W@&qounmxPEHe*uginGVzablP?lRT>D+3Cx)G0`rS`JvxWU`bJ%|DSx zw|&0dMAe`)n8rtxHyhf3?1j%(0D@AGur~g&a*ZVTUjN9s9vp~jragsjpxmZx(atWg z@;@L8lXD!#_M%XG5injh z1aKU_e_$jL!iIQ0@M-J-Fs^#>a*i$9EVX?&*ht6$ekRm0fEtD&utNYJ5jT|0<}v%( ztmj{N9RuC;_Px+yGM)s|^&g*|Ju{o}vBPM26yX?x_7p_&>LA>#MQuB`NVB$+W6p)` zc+ET^<9sPHcJS$FSeZOD>?&rlL?HyV!f2tm@@#%Le8eo;PQGkaj;-*&M2==gVIo&8 zl$n)t*tc+2F~3-6*b~ncEegvYk0$nsC^0J{R5$uUNbF@)oI((5od)V6zZo5^X-8QH zLMQ)YH1#@W!S&e=bA829b=nD(g{I4kvov33219E%TFqgen&y){YM}6@60__F_7tCt zrOAH27`sbS{6Dd`Hcy~631|GS%0#8J@1R*DifinOS%iv#9NBChBpKC9zm7vL;E+viWk!E}Jx)y$X6e4j}WdYDdpMw`w%31#oM#*<7hq zhT1EF6*!nf6&5XvBA_+PA!sjxSnGL^t@G7*2RYC0#Xp0!F4VozSOBRTvdaZ0dl@c* z6B$3#`R8>9#&B;L=GvQ}9;hdkMp24}UM4l9#1uIE9X?inkR0cg`i{-N18+zhvLmgN zCF00ivK@X^x<-KW8RVkO_Bje_wum7khqU2KN*g|~@Hu`*bpiz+SoOaO{C#*xK7f1j z8gYW44Q)w=|F*oLl={}C2jO+{kZkyYs#z!N{)Zr6-y};BLs}+m9vnxU=u+&WpUpV6 zhH3erLI2QrBnMi>}Y4B^E3p?1<}|;UmFB{e2J36z_nE zo8#FFA?^zeM`9cdM}ERTYns~JadHgQst6&3Ac9ER0#f*Tuvr9A>Jv!4fv|yqPT4sG z?J069D8ny;PZ;nnEq$55%H6GPHvgHT^Vz9AK$&<)@9h_2j# zO49xC7%Og)zt)+QS&ILwd5X01v6gh7xLEz!a)p+lAjAgkSnmz+{we=K%g{-c?O3r7 zR1Eds9Qswz{sF$~Gu%qpRsMC01$Tm#7~FFWG%)Q={3m;}BmGFF5vAD9mkg_eF9yR-G`&PkuN4{c^qJ7k zHHw>W$Cin0ytU(<*U+^H_idoQfX~Ka2uk%N;bU*(PVq;{`>Kd8#kX3A`>P8O1$Yb1 ze~7Rn|ETyY|66OOup|3jICug<)R7kyvfo%oSVMn?uNs&lYYIb|8@fcXVJC2!n(C9--SYPoy>vxQ-+-b9?r^@|?Hdn$0O8}Rnic0*ow0Np1030mEMX2m{4fp9I}m|r0K00Gys=3jOS zgQM&NphMMp*oS;v>*~ZYa9M~;<)=WipCQ~ssmyNjb*+uuR7GFO+4T5Io>s7F@vd6z(cM^eJyxy+eJS&LnGv)bLUrhb=qj;5Ftgqh zmq$u$R>N$WKWeVeTtx| I9_)$yAMvOV delta 3791 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 J;Jc0C{{i5NR`vh@ delta 6873 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 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-310.pyc index 65180f388f029c2ad8788faddadbf14da949d2ee..994c2d67a5f66f3de8bb70d29da61609c15e22df 100644 GIT binary patch delta 20 acmX@Ye}tbqpO=@50SHPD%Wve~$qoQD4h0wh delta 20 acmX@Ye}tbqpO=@50SKzqB{y>KWCs8-as+$; diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-310.pyc index 96c39eab682ab7dc7127b5fd652314ab8ed9a323..5f89308260f1d5cc53026b383fa006b204470bf9 100644 GIT binary patch delta 20 acmZ1=ut0!2pO=@50SHPD%Wvcse(*c?J1I#G?y}Qj1gbN_0~)6VvnZi%T+-H|y}lZ~y=_ CEe;d_ diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc index e46c6357d02c0856b6d41190bd44a142c0643e00..f354eef9e5d2ac8368001b5f526a246104e9d214 100644 GIT binary patch delta 251 zcmZp)oNTF`&&$ij00gCn<&(wa7#JRdILLqv$Z-JTVwH*7E9&_q8Pb?i_)`R0SehB5 zq}&-&1XF}s7*d3qnWCgq7!zeuc~hk&8B!%vgl!m7IZ}92c~XJmDU4~%V4Wf=SehB5 zq}&-&1X2WB7*YhAnWCgq7!zeuc~hk&8B!%vglrg6IZ}92c|d%i9^n)bupU{U9?=vr zpdK-x9=TMxW`-zvpqO|H8&Hf5D5e19Nu)>ud6KCL&CF4XDU87kno=);j+h+5sLRaZ ySu(kkao1)Krt<<^>_AZvC{CHIC~UtuP52f&qr_%MX%9v&5k@{d1US%xLoyQ6(nEr<>U&J}?Rgv;1XZ TWcts<#PpAindvVR3*R3AJr)vI delta 64 zcmeA&=`!KX=jG*M0D@|D$>dWTc_)c7GEH6}>d1Uv%y{z?Q6(nEXPen2J}?T0u>56W TWcts<#PpAindvVR3*R3AE}0S& diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-310.pyc index b09716cfd25cc56fc7a32659e0b6ac32e391ffde..3f0396ac885c88f7e9269c16bf867f2e013e0c32 100644 GIT binary patch delta 20 acmdnVvy+EApO=@50SHPD%Wve?V*>y&=>%{9 delta 20 acmdnVvy+EApO=@50SKzqB{y>Gu>k-sO#{>b diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc index 47fbd192f67db10b3fcfcecaec09565051f87013..2a05fbedb676f2ec606b55788f4282caae87793f 100644 GIT binary patch delta 20 acmca1c|(#rpO=@50SHPD%Wvd9%L4#8n+0tE delta 20 acmca1c|(#rpO=@50SKzqB{y=PtOT Dict[str, str]: - """Parse provided arguments, returning an object that has the - matched arguments. + """Parse provided arguments, returning an object that has the matched arguments. Any unknown arguments are ignored. """ result = {} for arg in args: try: - _, match = _distutils_getopt.getopt(args=[arg]) - except DistutilsArgError: + parsed_opt, _ = getopt(args=[arg], shortopts="", longopts=_options) + except GetoptError: # We don't care about any other options, which here may be # considered unrecognized since our option list is not # exhaustive. - pass - else: - result.update(match.__dict__) + continue + + if not parsed_opt: + continue + + option = parsed_opt[0] + name_from_parsed = option[0][2:].replace("-", "_") + value_from_parsed = option[1] or "true" + result[name_from_parsed] = value_from_parsed + return result diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/encoding.py b/sbsheriff/Lib/site-packages/pip/_internal/utils/encoding.py index 1c73f6c..008f06a 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/utils/encoding.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/utils/encoding.py @@ -14,7 +14,7 @@ BOMS: List[Tuple[bytes, str]] = [ (codecs.BOM_UTF32_LE, "utf-32-le"), ] -ENCODING_RE = re.compile(br"coding[:=]\s*([-\w.]+)") +ENCODING_RE = re.compile(rb"coding[:=]\s*([-\w.]+)") def auto_decode(data: bytes) -> str: diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/entrypoints.py b/sbsheriff/Lib/site-packages/pip/_internal/utils/entrypoints.py index 1504a12..f292c64 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/utils/entrypoints.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/utils/entrypoints.py @@ -1,7 +1,23 @@ +import itertools +import os +import shutil import sys from typing import List, Optional from pip._internal.cli.main import main +from pip._internal.utils.compat import WINDOWS + +_EXECUTABLE_NAMES = [ + "pip", + f"pip{sys.version_info.major}", + f"pip{sys.version_info.major}.{sys.version_info.minor}", +] +if WINDOWS: + _allowed_extensions = {"", ".exe"} + _EXECUTABLE_NAMES = [ + "".join(parts) + for parts in itertools.product(_EXECUTABLE_NAMES, _allowed_extensions) + ] def _wrapper(args: Optional[List[str]] = None) -> int: @@ -25,3 +41,39 @@ def _wrapper(args: Optional[List[str]] = None) -> int: "running pip directly.\n" ) return main(args) + + +def get_best_invocation_for_this_pip() -> str: + """Try to figure out the best way to invoke pip in the current environment.""" + binary_directory = "Scripts" if WINDOWS else "bin" + binary_prefix = os.path.join(sys.prefix, binary_directory) + + # Try to use pip[X[.Y]] names, if those executables for this environment are + # the first on PATH with that name. + path_parts = os.path.normcase(os.environ.get("PATH", "")).split(os.pathsep) + exe_are_in_PATH = os.path.normcase(binary_prefix) in path_parts + if exe_are_in_PATH: + for exe_name in _EXECUTABLE_NAMES: + found_executable = shutil.which(exe_name) + if found_executable and os.path.samefile( + found_executable, + os.path.join(binary_prefix, exe_name), + ): + return exe_name + + # Use the `-m` invocation, if there's no "nice" invocation. + return f"{get_best_invocation_for_this_python()} -m pip" + + +def get_best_invocation_for_this_python() -> str: + """Try to figure out the best way to invoke the current Python.""" + exe = sys.executable + exe_name = os.path.basename(exe) + + # Try to use the basename, if it's the first executable. + found_executable = shutil.which(exe_name) + if found_executable and os.path.samefile(found_executable, exe): + return exe_name + + # Use the full executable name, because we couldn't find something simpler. + return exe diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/filesystem.py b/sbsheriff/Lib/site-packages/pip/_internal/utils/filesystem.py index b7e6191..83c2df7 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/utils/filesystem.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/utils/filesystem.py @@ -2,12 +2,10 @@ import fnmatch import os import os.path import random -import shutil -import stat import sys from contextlib import contextmanager from tempfile import NamedTemporaryFile -from typing import Any, BinaryIO, Iterator, List, Union, cast +from typing import Any, BinaryIO, Generator, List, Union, cast from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed @@ -42,35 +40,8 @@ def check_path_owner(path: str) -> bool: return False # assume we don't own the path -def copy2_fixed(src: str, dest: str) -> None: - """Wrap shutil.copy2() but map errors copying socket files to - SpecialFileError as expected. - - See also https://bugs.python.org/issue37700. - """ - try: - shutil.copy2(src, dest) - except OSError: - for f in [src, dest]: - try: - is_socket_file = is_socket(f) - except OSError: - # An error has already occurred. Another error here is not - # a problem and we can ignore it. - pass - else: - if is_socket_file: - raise shutil.SpecialFileError(f"`{f}` is a socket") - - raise - - -def is_socket(path: str) -> bool: - return stat.S_ISSOCK(os.lstat(path).st_mode) - - @contextmanager -def adjacent_tmp_file(path: str, **kwargs: Any) -> Iterator[BinaryIO]: +def adjacent_tmp_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]: """Return a file-like object pointing to a tmp file next to path. The file is created securely and is ensured to be written to disk diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/hashes.py b/sbsheriff/Lib/site-packages/pip/_internal/utils/hashes.py index 82eb035..0c1af32 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/utils/hashes.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/utils/hashes.py @@ -1,5 +1,5 @@ import hashlib -from typing import TYPE_CHECKING, BinaryIO, Dict, Iterator, List +from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError from pip._internal.utils.misc import read_chunks @@ -67,7 +67,7 @@ class Hashes: """Return whether the given hex digest is allowed.""" return hex_digest in self._allowed.get(hash_name, []) - def check_against_chunks(self, chunks: Iterator[bytes]) -> None: + def check_against_chunks(self, chunks: Iterable[bytes]) -> None: """Check good hashes against ones built from iterable of chunks of data. diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/logging.py b/sbsheriff/Lib/site-packages/pip/_internal/utils/logging.py index 6e001c5..c10e1f4 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/utils/logging.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/utils/logging.py @@ -6,21 +6,23 @@ import os import sys import threading from dataclasses import dataclass +from io import TextIOWrapper from logging import Filter -from typing import IO, Any, ClassVar, Iterator, List, Optional, TextIO, Type +from typing import Any, ClassVar, Generator, List, Optional, TextIO, Type from pip._vendor.rich.console import ( Console, ConsoleOptions, ConsoleRenderable, + RenderableType, RenderResult, + RichCast, ) from pip._vendor.rich.highlighter import NullHighlighter from pip._vendor.rich.logging import RichHandler from pip._vendor.rich.segment import Segment from pip._vendor.rich.style import Style -from pip._internal.exceptions import DiagnosticPipError from pip._internal.utils._log import VERBOSE, getLogger from pip._internal.utils.compat import WINDOWS from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX @@ -50,7 +52,7 @@ def _is_broken_pipe_error(exc_class: Type[BaseException], exc: BaseException) -> @contextlib.contextmanager -def indent_log(num: int = 2) -> Iterator[None]: +def indent_log(num: int = 2) -> Generator[None, None, None]: """ A context manager which will cause the log output to be indented for any log messages emitted inside it. @@ -121,7 +123,7 @@ class IndentingFormatter(logging.Formatter): @dataclass class IndentedRenderable: - renderable: ConsoleRenderable + renderable: RenderableType indent: int def __rich_console__( @@ -152,12 +154,15 @@ class RichPipStreamHandler(RichHandler): style: Optional[Style] = None # If we are given a diagnostic error to present, present it with indentation. - if record.msg == "[present-diagnostic] %s" and len(record.args) == 1: - diagnostic_error: DiagnosticPipError = record.args[0] # type: ignore[index] - assert isinstance(diagnostic_error, DiagnosticPipError) + assert isinstance(record.args, tuple) + if record.msg == "[present-rich] %s" and len(record.args) == 1: + rich_renderable = record.args[0] + assert isinstance( + rich_renderable, (ConsoleRenderable, RichCast, str) + ), f"{rich_renderable} is not rich-console-renderable" - renderable: ConsoleRenderable = IndentedRenderable( - diagnostic_error, indent=get_indentation() + renderable: RenderableType = IndentedRenderable( + rich_renderable, indent=get_indentation() ) else: message = self.format(record) @@ -193,7 +198,7 @@ class RichPipStreamHandler(RichHandler): class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): - def _open(self) -> IO[Any]: + def _open(self) -> TextIOWrapper: ensure_dir(os.path.dirname(self.baseFilename)) return super()._open() diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/misc.py b/sbsheriff/Lib/site-packages/pip/_internal/utils/misc.py index b07e56f..a8f4cb5 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/utils/misc.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/utils/misc.py @@ -21,6 +21,8 @@ from typing import ( BinaryIO, Callable, ContextManager, + Dict, + Generator, Iterable, Iterator, List, @@ -32,6 +34,7 @@ from typing import ( cast, ) +from pip._vendor.pep517 import Pep517HookCaller from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed from pip import __version__ @@ -54,6 +57,7 @@ __all__ = [ "captured_stdout", "ensure_dir", "remove_auth_from_url", + "ConfiguredPep517HookCaller", ] @@ -264,7 +268,9 @@ def is_installable_dir(path: str) -> bool: return False -def read_chunks(file: BinaryIO, size: int = io.DEFAULT_BUFFER_SIZE) -> Iterator[bytes]: +def read_chunks( + file: BinaryIO, size: int = io.DEFAULT_BUFFER_SIZE +) -> Generator[bytes, None, None]: """Yield pieces of data from a file-like object until EOF.""" while True: chunk = file.read(size) @@ -346,7 +352,7 @@ class StreamWrapper(StringIO): @contextlib.contextmanager -def captured_output(stream_name: str) -> Iterator[StreamWrapper]: +def captured_output(stream_name: str) -> Generator[StreamWrapper, None, None]: """Return a context manager used by captured_stdout/stdin/stderr that temporarily replaces the sys stream *stream_name* with a StringIO. @@ -556,9 +562,9 @@ def protect_pip_from_modification_on_windows(modifying_pip: bool) -> None: python -m pip ... """ pip_names = [ - "pip.exe", - "pip{}.exe".format(sys.version_info[0]), - "pip{}.{}.exe".format(*sys.version_info[:2]), + "pip", + f"pip{sys.version_info.major}", + f"pip{sys.version_info.major}.{sys.version_info.minor}", ] # See https://github.com/pypa/pip/issues/1299 for more discussion @@ -627,3 +633,91 @@ def partition( """ t1, t2 = tee(iterable) return filterfalse(pred, t1), filter(pred, t2) + + +class ConfiguredPep517HookCaller(Pep517HookCaller): + def __init__( + self, + config_holder: Any, + source_dir: str, + build_backend: str, + backend_path: Optional[str] = None, + runner: Optional[Callable[..., None]] = None, + python_executable: Optional[str] = None, + ): + super().__init__( + source_dir, build_backend, backend_path, runner, python_executable + ) + self.config_holder = config_holder + + def build_wheel( + self, + wheel_directory: str, + config_settings: Optional[Dict[str, str]] = None, + metadata_directory: Optional[str] = None, + ) -> str: + cs = self.config_holder.config_settings + return super().build_wheel( + wheel_directory, config_settings=cs, metadata_directory=metadata_directory + ) + + def build_sdist( + self, sdist_directory: str, config_settings: Optional[Dict[str, str]] = None + ) -> str: + cs = self.config_holder.config_settings + return super().build_sdist(sdist_directory, config_settings=cs) + + def build_editable( + self, + wheel_directory: str, + config_settings: Optional[Dict[str, str]] = None, + metadata_directory: Optional[str] = None, + ) -> str: + cs = self.config_holder.config_settings + return super().build_editable( + wheel_directory, config_settings=cs, metadata_directory=metadata_directory + ) + + def get_requires_for_build_wheel( + self, config_settings: Optional[Dict[str, str]] = None + ) -> List[str]: + cs = self.config_holder.config_settings + return super().get_requires_for_build_wheel(config_settings=cs) + + def get_requires_for_build_sdist( + self, config_settings: Optional[Dict[str, str]] = None + ) -> List[str]: + cs = self.config_holder.config_settings + return super().get_requires_for_build_sdist(config_settings=cs) + + def get_requires_for_build_editable( + self, config_settings: Optional[Dict[str, str]] = None + ) -> List[str]: + cs = self.config_holder.config_settings + return super().get_requires_for_build_editable(config_settings=cs) + + def prepare_metadata_for_build_wheel( + self, + metadata_directory: str, + config_settings: Optional[Dict[str, str]] = None, + _allow_fallback: bool = True, + ) -> str: + cs = self.config_holder.config_settings + return super().prepare_metadata_for_build_wheel( + metadata_directory=metadata_directory, + config_settings=cs, + _allow_fallback=_allow_fallback, + ) + + def prepare_metadata_for_build_editable( + self, + metadata_directory: str, + config_settings: Optional[Dict[str, str]] = None, + _allow_fallback: bool = True, + ) -> str: + cs = self.config_holder.config_settings + return super().prepare_metadata_for_build_editable( + metadata_directory=metadata_directory, + config_settings=cs, + _allow_fallback=_allow_fallback, + ) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/subprocess.py b/sbsheriff/Lib/site-packages/pip/_internal/utils/subprocess.py index b5b7624..cf5bf6b 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/utils/subprocess.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/utils/subprocess.py @@ -116,7 +116,7 @@ def call_subprocess( # replaced by INFO. if show_stdout: # Then log the subprocess output at INFO level. - log_subprocess = subprocess_logger.info + log_subprocess: Callable[..., None] = subprocess_logger.info used_level = logging.INFO else: # Then log the subprocess output using VERBOSE. This also ensures @@ -209,7 +209,7 @@ def call_subprocess( output_lines=all_output if not showing_subprocess else None, ) if log_failed_cmd: - subprocess_logger.error("[present-diagnostic] %s", error) + subprocess_logger.error("[present-rich] %s", error) subprocess_logger.verbose( "[bold magenta]full command[/]: [blue]%s[/]", escape(format_command_args(cmd)), diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/temp_dir.py b/sbsheriff/Lib/site-packages/pip/_internal/utils/temp_dir.py index 442679a..8ee8a1c 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/utils/temp_dir.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/utils/temp_dir.py @@ -4,7 +4,7 @@ import logging import os.path import tempfile from contextlib import ExitStack, contextmanager -from typing import Any, Dict, Iterator, Optional, TypeVar, Union +from typing import Any, Dict, Generator, Optional, TypeVar, Union from pip._internal.utils.misc import enum, rmtree @@ -26,7 +26,7 @@ _tempdir_manager: Optional[ExitStack] = None @contextmanager -def global_tempdir_manager() -> Iterator[None]: +def global_tempdir_manager() -> Generator[None, None, None]: global _tempdir_manager with ExitStack() as stack: old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack @@ -59,7 +59,7 @@ _tempdir_registry: Optional[TempDirectoryTypeRegistry] = None @contextmanager -def tempdir_registry() -> Iterator[TempDirectoryTypeRegistry]: +def tempdir_registry() -> Generator[TempDirectoryTypeRegistry, None, None]: """Provides a scoped global tempdir registry that can be used to dictate whether directories should be deleted. """ @@ -200,7 +200,7 @@ class AdjacentTempDirectory(TempDirectory): super().__init__(delete=delete) @classmethod - def _generate_names(cls, name: str) -> Iterator[str]: + def _generate_names(cls, name: str) -> Generator[str, None, None]: """Generates a series of temporary names. The algorithm replaces the leading characters in the name diff --git a/sbsheriff/Lib/site-packages/pip/_internal/utils/unpacking.py b/sbsheriff/Lib/site-packages/pip/_internal/utils/unpacking.py index 5f63f97..78b5c13 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/utils/unpacking.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/utils/unpacking.py @@ -188,8 +188,7 @@ def untar_file(filename: str, location: str) -> None: ensure_dir(path) elif member.issym(): try: - # https://github.com/python/typeshed/issues/2673 - tar._extract_member(member, path) # type: ignore + tar._extract_member(member, path) except Exception as exc: # Some corrupt tar files seem to produce this # (specifically bad symlinks) diff --git a/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc index ef93c959f40c291e68f8b122b2bbcfe19f433fcb..864d0fd1d59561dc9b03beb9b68baffdf52ba6a7 100644 GIT binary patch delta 20 acmZo>X=dTh=jG*M0D{uP@*BB-FaiK7R0O#I delta 20 ZcmZo>X=dTh=jG*M0D@|D$&K7U7y%}@1RVeX diff --git a/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc index c04a31c6dcb0340c158ee4fb4f3107e65db85bb6..0ac6828967158291dfd89b419bdf6f75932dbb67 100644 GIT binary patch delta 20 ZcmeB^>XYKm=jG*M0D{uP@*BCCc>ygj1QGxM delta 20 ZcmeB^>XYKm=jG*M0D@|D$&K91yZ|Yb19kua diff --git a/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-310.pyc index a56a90d7b24987f384084775e7f4e6f374f3119c..92601e82947eadc82557d0bde177b6608ed2d276 100644 GIT binary patch delta 20 acmZonYE0tJ=jG*M0D{uP@*BCo82|t`YXzPF delta 20 ZcmZonYE0tJ=jG*M0D@|D$&K9K3;;9F1p)v7 diff --git a/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc index 599f41f0ba2c2dc80ec981cdf94d8d59302627a1..3ff8f656ab773caf1abe263e622189d57836743a 100644 GIT binary patch delta 20 acmX@AepH=1pO=@50SHPD%Wve~B@6&Kq6Jp~ delta 20 acmX@AepH=1pO=@50SKzqB{y>K5(WS@1_ZkR diff --git a/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc index eeed223ce3f2be5c856b90e724fe42159f191c2a..7d1065efe06b83df2b1301464bf850e4a538e7d4 100644 GIT binary patch delta 20 acmZp4YINex=jG*M0D{uP@*BCoDF6U6+XYSl delta 20 ZcmZp4YINex=jG*M0D@|D$&K9K6aX(j1hN1C diff --git a/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc index f77b1158738298109b4f121f98e07763f03293ef..35a0d3684de96690f46e3d28214cf38877673be0 100644 GIT binary patch delta 22 ccmbQSlySyVM(%uGUM>b8C_OB{k-Ikt07q{I4FCWD delta 22 ccmbQSlySyVM(%uGUM>b8s8*NU$lV(R07KISaR2}S diff --git a/sbsheriff/Lib/site-packages/pip/_internal/wheel_builder.py b/sbsheriff/Lib/site-packages/pip/_internal/wheel_builder.py index d066344..77a17ff 100644 --- a/sbsheriff/Lib/site-packages/pip/_internal/wheel_builder.py +++ b/sbsheriff/Lib/site-packages/pip/_internal/wheel_builder.py @@ -354,6 +354,12 @@ def build( req.editable and req.permit_editable_wheels, ) if wheel_file: + # Record the download origin in the cache + if req.download_info is not None: + # download_info is guaranteed to be set because when we build an + # InstallRequirement it has been through the preparer before, but + # let's be cautious. + wheel_cache.record_download_origin(cache_dir, req.download_info) # Update the link for this. req.link = Link(path_to_url(wheel_file)) req.local_file_path = req.link.file_path diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/__init__.py index 3843cb0..b22f7ab 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/__init__.py @@ -63,7 +63,6 @@ if DEBUNDLED: vendored("colorama") vendored("distlib") vendored("distro") - vendored("html5lib") vendored("six") vendored("six.moves") vendored("six.moves.urllib") @@ -106,6 +105,16 @@ if DEBUNDLED: vendored("requests.packages.urllib3.util.timeout") vendored("requests.packages.urllib3.util.url") vendored("resolvelib") + vendored("rich") + vendored("rich.console") + vendored("rich.highlighter") + vendored("rich.logging") + vendored("rich.markup") + vendored("rich.progress") + vendored("rich.segment") + vendored("rich.style") + vendored("rich.text") + vendored("rich.traceback") vendored("tenacity") vendored("tomli") vendored("urllib3") diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-310.pyc index 6f2adc0b26d1b00dd185fd25d2e2b883d81bf63c..5d0be084e3467f26989cb5b62984635c5d4c1909 100644 GIT binary patch delta 283 zcmaDXwnKt1pO=@50SHPD%O|G^Pvnzf44SANz^J~lW(#9bDsPHaGb1AdkhX@>Hc;9Y zO4~tcdnoMyr5&NP6NpY>4hCaQ=gn43f0#Bquzq5xXDP}|&Zy!6k$TDbdByoTsZ|1C zUPfkmMh*~{q!vNtbMn*EGxO4`xWV$diAC9^1y#IYPC-$AdQoa|F;r!7YI<&JUP%=f zShBdJ5@;$Xm|c=uQBuVRVHPDOv!*5`CTCAJB;=uA}lg*li3gf*=;H!=NT;^fFE k$;~m%$xPZ@%lesR@>j0Sj8&6Ya>q<&=8b8C_OB{k$ZbK09G^y2mk;8 delta 22 ccmX?fo$=6hM(%uGUM>b8s8*NU$h|!q08*F+YybcN diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc index ab317459f4b047d08d8dc8bb6d296475ab2d46ba..0ba083f0de2629a627683dfff23d3a73a31e15b1 100644 GIT binary patch literal 60726 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 literal 66598 zcmeFa34C1Fc^^7E27`qlxG$ovWJv%h5|l_$3$>UONJ=*h%axb(&N<)t&bOWKRQvjJF?`-Sw5BvS5s!V3Kf<3Ze(c28 zt{|NmGvl+dy#5={$K`jz{hQ1u<##HdlE3ME+Dgr2%($6&S7J@fOde0?yR0sCi$G;Lyj@4?_58A=RO@jACJeZ zC05$(Ih#5g+DU~0z2IVfEAF$HrmYD zzqWE~%bN>;YOT2rP_09nbuLuvt@Y+AbG>;TN?$9GZ!oV%n(L9qgZw({Iv4V_QnP`Y zzlQf4@*65C^9IvE|7a^S4%(BJXB%6Y_4d;xn7@bhEX5P0YH5zs%8>GWlEa zY&1VAdACU3F+ACl-%?p>#?0GhZ=1V4zcn61Ik%fzP|g;--Da&?69Xi?zaxK#fA1MegbvgoxfXh-f3<}&h5x~H=f>OEw^?|VNOVU@0Of* zOU}C_=Pw}5z4?19#JjkupM4wk-)-K7Qtm=2_aa5K{(GgAd!>|nq?A8Kn)~wiRaPM9 z4)Y%5yvN$e9>R0jU`*aD8L`jpn`PeZaDv(=qdY%*I{j z1Lhm?`$2Q3xeI^Cq`n7HUqUTIj@|j)mHVwO{Mu&5%rVUGJ^4MD+q=y@NWB-3>@^<( zBoA4!nTIe^597(h=7V_hp!Kl1@1-R2Ux%EJAm_gPzPU&8k0AGcKlh_n9vI+frn%MRQ@SkpUyvxYd)W^ zY?q$=cPOuDPNKX?JU{HxkvyK3%%gaU{Q0L$)3gB9Gv-&!Y4g}~@%+=3m1fzT!LuVs zdEA^u%30)R&%Fgt=5$``Ez;{xMW|OrTK+0h7xD#MkLHh7?gA`HwY^5VUB&1W^Tl}V z&9O>fDrQZ7FnMNWJjQ>7FkgH+R*9dAN!od&E#*s*w3|X{OFFH2!c>5@VA`gGzelBK z7SJKCWtnHph38@zOS5ukBp+xt@|{Ay zTHAaJ=39j#nw7OkQ#Th;_9DujLcdMp$=l4gUro-^NpU+=JvqvSGvzsr0#e!p9O&qz7XOF91n zCCuh$D_Nv@!F(QRp10URRbfUo?M2dhdkv-iOQ& zBh81AhP`Ja*N>VX!IO{R$x_R9d(W{PxA#s6oF7GtQfdd%EaVp|54S*=Qct3!A2UCO zl0Fuy|D<)&{BiT60{22?QzRcpJ*5=#eY|bHkD8wlxEEv{{G|CZ%6^$p3S_DLDeIIA zJ`-aIrH-<@AF9KjZ59Cn_n8tyNcKO^^23Ud6c`9$1JDV$Q7J3^H$+xQQ4q2!H1dC_>SRgkK*FQ>L3h@aWh_z zpNy#$b=<9q?T#JEE+*>nbMbn@jGYG?aH6-4ZXQXDH@XW2d$#J>g#s!~ndOqxNX}R1 zN0N=CS#t8-d{QV?=g;I*Om`us$Wvc3$96n($hMUI%t1$$Pd~HUI{A$4RMp(1Do+

t74a{ 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py index 8435d62..f631ae6 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -8,7 +8,7 @@ Make it easy to import from cachecontrol without long namespaces. """ __author__ = "Eric Larson" __email__ = "eric@ionrock.org" -__version__ = "0.12.10" +__version__ = "0.12.11" from .wrapper import CacheControl from .adapter import CacheControlAdapter diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc index 1b624c9ae39158b2a175b3c58c44916dc6ceb77e..8f04cd3d0a1d013b094aedb522915e6dd81b5dc8 100644 GIT binary patch delta 27 hcmZo>ZD!@p=jG*M0D{uP@*BBX7#R&W3osTl0su(Y1u*~s delta 27 gcmZo>ZD!@p=jG*M0D@|D$&K7BjEn}G1sIDN0YLEtlmGw# diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc index 5cda8edf2ecc3e930ba1f05cb99e75d082ff8750..a5f00baf83203cbf5e4ccc45877f15ba538fdb2b 100644 GIT binary patch delta 20 acmZ3>vzCWDpO=@50SHPD%WvdXVgmp$2?R_4 delta 20 acmZ3>vzCWDpO=@50SKzqB{y;_u>k-qZ3D0X diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc index bf2bfd8564fa220a18794ce5aaf61a99ecadd233..cbbc9bf128cc7f7a6543a2d269c690cc386890c6 100644 GIT binary patch delta 38 scmcaAaaDplpO=@50SHPD%WveK$jHMS5E^oe&BfKnHN;&S0JReeFaQ7m diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc index 9701299fdb787988b17760c41c91cd54d0682395..0bf274943eb8f27c78a2b2161995fccbc99edcc9 100644 GIT binary patch delta 870 zcmZ`%O>Pr06rR6Krb#+f3Mm2sHSH!NLN-V&A|XM8gxGXJScS#J8JmvV$xLKBp~)tT z_5f6~W5*F#aR6?S18@y^Z^A^a1eW~Se){~q_dWZEf7$Z0-QAi2WA^hP`dzv9ADVBj zpFZDzYp^Qwt_RZUT<>= zZAIv^3ySS?zUV+UaF>WBXJJ`&P$am;-DHOg!A58xRuhp>nSjE!Eh^4t2_s`pl8iDa zrgV}l$XrnHaeB)~k->(?DhKYN`$iw8bPy^CEFXsV zRrn8G=YP3N>Pg_r78bgXa1UTz4MUbiVJM$q=n$cvzjm942e9qJR33n5IHp%`*b<{B iK~)~Xn*VZ-TnxaCZ&ovZRP}vqmE$y=J$vuY-R2()_~Ly4 delta 76 zcmZn`-Ok6C&&$ij00h<4 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-310.pyc index d9e3cc3f9c1f5fea492e0aad5b7aef97b5d0b9c5..770a0d57724cdbbd14a6b28095da4afc6269cf1a 100644 GIT binary patch delta 20 acmey$`jwSCpO=@50SHPD%Wvd<#RLF5Nd=Ms delta 20 acmey$`jwSCpO=@50SKzqB{y=vVgdj+tpxS} diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc index 83e2d9f3abfda4bbe114cb675ce7c808e9c6ccb5..1f0feb7c1e5e07ecffe93dae8e3a8326b5ffa03a 100644 GIT binary patch delta 3039 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

}JMl~F zc)geu<4zm**J1RM$M~aYY#f85w-H8K;Du}u(}pf}7X$VnsH^U{2O|qP;r9ZMJ%t$4 zC@{?^yQWxcH+BH0jb;=1z>c6HrV?2_zaE4>^CHK4X0Zis^|00T~b|5>pBg z;-G&h;`=G@ZiA@Ah1dSwwQMp=>_ncFRhw93tg%7k5SwI)uEHN!tC#i5MnZ)d^whu8 zUGdiR%{Ja~xT(Ri_-eXdZ0o}m*Px%&p%dQ_BURi!^9xxJ+h^~!t_Mpf+*RWF+07+M zI(gS6cQ1H7SPr}Gg7|dy!9fYl(lKNIljTV8$XHs0!^Vqr3U_>zXoX%kh->bHnk^zw zVq5_BG|tM6%&Z?bs}+&yoI*XxiJ1uomsC zb6VO}C)hc#ip);VUs!-sI8vDx_wPgEleygk*_n78MM>zaR-@B8cWaPk=2 z3*V9mk=gXSi!J!UlEx|QQC0vE8UE3>*9>LMe@i;Dc6WWc)bZd~8Dx<Lu=fICE9f PbyR2<&4y;Nv|{p4e!NS$ diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc index 722d5c61791dce3f4d2192e1dd3d4353e19d0758..4d48a4ec33b3867e37075087822f14caea943e59 100644 GIT binary patch delta 20 acmaDU`cjlTpO=@50SHPD%Wveq#{~d8u?3a@ delta 20 acmaDU`cjlTpO=@50SKzqB{y>4;{pIU6$JVK diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc index f137f05a4eb47baf4dd9f794408e5e8e3c78a0af..1a4f383ead2a632118ff67ed24c67e82c50abcf8 100644 GIT binary patch delta 20 acmaE>@>YdApO=@50SHPD%WvdP5&{4{bp=QO delta 20 acmaE>@>YdApO=@50SKzqB{y;>2>}2(*#xWr diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc index e258040a696d2fa5c995286d3995e228d513bacf..a4bdd2243c756ffaf635e16999dbaf5f8a469009 100644 GIT binary patch delta 1381 zcmZ8h&u<$=6rNu@`y<|s;}S?*)HJB7YUlyd!U2LrDXK&yO4|S?rc#w=5`haTj5msG zjTJQ2vy-l3PS!>_EnR##Kd*A!U_h$c@ z&2Fb@!tiYTHnZ~U@gK9cc(;Y&Dr<4WTEf(fFmi{tBs^sTcnY32A-n)yWMX(4USh`J zh43mSg%_F3jPI~kjG3yL*x~mdiZ%JXqSN-D0N)7jMZBG_V4UbE!xmXDaiU;`8!-^q zMPKjP$AIfX1uStgujg)q^8_f;>=rDG;8 zus-11!f_{@+?Gw8q*xww7yR$~&hfyW0|a}X%nLBP@y*+&dt>c`4_Cbj=Xu=^!g~EM z{uogQ`2X^MglD%@KXAMa@PH`?!V$!$I5TpQeNuD6D8P~?04$vYIE{_Q8{Xyp(1m~x zMgc#$CG0C0ODcgg7Y<|RSubg8awX z*xjc8HbhtEEk0&aD_79l|VMxI#|eqT(tF?=$_o;e~FQr zH_;KuffOsJ*)|{g^DK|(Qr+Akwa_w@P{afF8iEeOG{Tbob%^?4J}lEC+)2ugk7UO4 z%&}q&QZJeF%}SGh>wl5n~*0*@Vk*%GTJFyf=q?h39^v@m2p(R^K|x@xjfZ%hro?)<(nW&fmq2 z2cHS}6y0N^Orj_`ENYQ8*G!R%rq5lLMXktn`&3lfV|uu+?~HYq3}C!(t)Fu53Z zJIfXlAB5V6PG4GlxZ4&=p$KBz2lbC=DM-nKFFtDh2Yg7+*-heZ<}%;8GjnF2vO{WE%2aPV4;)r2!6GbG{O4>=MjG0 zTPJglmfRo30@4Y~-{NRBLJ&ORQ7^d2{gxklXD`73ea?{cp9t>1{JsuRi%B7=XsBzV zSsf;r`dD95p{%fVB-;P4vsCwA#`X+WI}5t(1N7PTQs@6<>KwiRxCkWe(x67HxWs)s2HFtc;Af8qg+FS;iQK4|>iX+vtD=hX^Q)<87?2XRjfC}MOt;e(2($(ge?zA4SZ z8tOveDSLEbF40_%Qq0`bqIOpbVflBQ+*ZTLt{QCN!vj50^-^`lOwLHXB^sPskXV#hlIoP7QVAESb&6|CfhBpG@uzK@yQ@l5Yo4}i$L0-!XUM`*yH09b8_P2 ZS27fFfDGW6IJ=pP4agE;;bG)q1^~zGHQfLJ delta 161 zcmaFGw2X;2pO=@50SKzqC6iZ8av7r-89{8O9Hw06C}tp=Iha9{ z znORCAK@~-m-rD9;w3i;F910{r554qUp#Q~Qd-8wK258*hn-wY1Qo6(p=X>AG`@P?L zv)SxyVBzWi^Oe@0p0=!iQRVF8qjCdDe~wI8f_1HC`OlgRb>8JYyJ<5^*uv>LJ-6xh zyryUBZnx6&n?AFKj;u0k-AZR2O9q3h%%Y#1k+n8&Rv%a?+p~lxDxX@-+4n8si|VJA zs2=j>9BP4>L2X9PN%zoc&ZDI!X3;W>77r~8VouCs<|V<_top(u$Z0j|tnh>sGR+@x z)a$&c-i)5!{uOpiNh<7j)uw0YDvtmM{FWn>*Qb22lImHT;!nNwttWX`N53y3;6v)u^$0dv#@Hb-nOc zqnmdc@7;S)@V(9YY{4^4ZR__|8!Hcr%4)QH@78nHoXs(h2b?qY0*1AarXCx$8%X+>$fQN~(By(O?JBR@ zRj2A!UGa>;HETN3EpdIwnqGmBeYTmu^4$ zHM6Wo|3KDgk(S2~(Eusj!27o-j9g*$nW~Mv^54LkeZq!wf(yILdiJP8w!PNQHIGtFY9Wa~x#-u-Dgl*ok-L)NGP~ zAQvX7&SS8LSPCCtbSqBBO<|IUyGa}Zx!0%WhSW3}HC}0INWE4BAI9CjEN#yp4^ppS zm&N6Ab*V=i9M@DxoilfOJDJMOL`95NR53=jU~q$?0#gq>o=jWBTh)%-7YV2)2Xff{6FX3EV$C*^rXyYC z!^=;KRW5VRhfIWe8}lHL1#X8Q$=Qetc#hxj=d44Nx7Zcyz|Q%$y$xg7cDLBb{+!*j zeoyAW8;@Mfu6ss`!s#YDS7gD3vlHi?!r9J})aa`2sPCF~!^j@(Rf@ue|I76gJ1Xp` zoo-{W_K*ekWp`hC*um|TwzXwR`=wCyBZV%oVw^GX@iF@J0y1zvkms@2AJ=S;@yF-4j?pdB-uNLEOteX;o@^Z& z1K6AqKjxrF2(OmV{RKCI7hdUq>aJ0ZA`2+oT{7;XBKLP-o7#wcPFyYXAqH!DX#hhx zFCs=1j)?QPMb2sbkf4*$WCR=QHeG;b-+n@~lU@qepy{bP#y8H6Hvt_Vo^s_{ z+?L%zXuNkw#7sLSqNegzf?yyd_%BVEvr(TZ&BE`+4<&d_E3&$RD2@!m@RuU(t4ov_ z?jm1r*sXBQo5p&gnd*IHus0B+xjUPxssHWdA}CRw5z0GMB%@Bx5&-kzhH*+GI7(e}`AjQARnV?%q}} z(feLT)@T@$Ku8KtK&ptMB8VdRoj$_0sHjEJ$Nji_(o=~dk+q^oUB%R*1_ukD(u14N zgkivPTkp~0w`qjCImlr|qz!eKvQssglF`+R=y(T7lRUl!J-Os}=okElzZNjx_A5bk z&Z*5S8rwpedWiUMAQ@$!jsGY>LfqyE2VCtI)kz#SY#C_YSFuPaRExW(vBh=7Y+?{5 zI;2pTqPjHfA@){-H$t6-6#D3XlE<5fF(|_8#%ik!K}5EfcC%RM68KZ}OfpV5ihy3i zNU-A*W+GCBCp5B=(OlMMQZ;u%Ese?eHJGBS}Hpm09b<-Sf%Wzl>Lmd zk0`rH1^3bMM#YRQ^Z(aH9O{#6W7vkbc_W05`mH40GHdO~_~D7V5H{k1a)B;v$UZUY@1Zg_X+gf8 z4?W{9aZe<-2pZ;tE7OKtw;Nx%O9T@|z^&V-j<7Uh`;7j`>76-rqeLGrETZ{;L8q=E zn*-WwC$>9$`Rv7ba#~B{N$2=!0xYtism*|&-~jDY2MCy{CP{P?*%aA0W=e0lhz8AnL%~Qy@#^r! zi_dLr6qO5&;^(y1FUAX=dC4h5JwWdfk|wSu^YC52QgalwPi>QsMQIsH<1@}luuE~} zh#lb@#W8&wVZ)7kGViO@_)7vYZYQ`n8>bm=;`@jQaeX9b`oX=GrJ&@h4j4&fQX2-6 zsm3MxbiUk2%ykwA&H7Q5zgo)B{+mD3LVz8ACZV26K-|uqp37 zuTYzsCdj0fY_ffNDUs|2ttGy;5j21;NRx8XWDa$hqdB^x^EGa8^OQC

vDdr({N( z26wm%(M?|99{ep{-0C8eQ3IxU$s#!s_%QR&4IQKM@vhx+sb6amF&R7IdOaWp&tSBL{2_R4}$t^XaVgZ)(lgVzKWt$i-j5iKSr-`6j~A#-YhK-w+`~;ak)0dTo>JD&?p*T z8QY4@wPl<3p-oC3)h^nDwZeO_sMyFW&Ta~pElWr~0OD)Q8nTpM&+`F16QNMzJ5c@) zHUJh{$)Ll|^}ko}U(Z#2I1fZz_ytZg=727_d9xPP&2m)e?bxsF%L^xAkqFFp+xTJr1KY|VgG z>a_8t3yx$cZzqqd>v!=GS0ZN5LIuQu8V30O1bB_V2c;PAg=@G}egX@>EbD0LBrmF) zPg1u%jFcRPp^y^eWIaxu20-d#DTi_eQW=`CoXpQk=tZ%qeP=M_N1@oIpq5vx+t7HA Qd6cny#s0C4itl~?FX#+R4FCWD diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc index 0073740b2410351e8f10a10097156681829d3a4e..dbfbbd23a26ba9b9d1e6ea4e294efddaa78592f1 100644 GIT binary patch delta 236 zcmZ3+bA^X5pO=@50SHPD%O`WPY~)K}s*eG3YnY3md6 yc{>Y;HMxOVgyR-#a!zVuk^JOBmKBVulciY0xj}M8k|08Aat*5dS)u80k2geH3tJCM4?T%1}m`8`uC4+oIP z!YIVZ!z9BvIfgl%RSYN~HTeYdc1E$u4J>kuvXkettYB20?7 0: logger.debug("Caching b/c date exists and max-age > 0") expires_time = cc["max-age"] - self.cache.set( + self._cache_set( cache_url, - self.serializer.dumps(request, response, body), - expires=expires_time, + request, + response, + body, + expires_time, ) # If the request can expire, it means we should cache it @@ -368,10 +390,12 @@ class CacheController(object): expires_time ) ) - self.cache.set( + self._cache_set( cache_url, - self.serializer.dumps(request, response, body=body), - expires=expires_time, + request, + response, + body, + expires_time, ) def update_cached_response(self, request, response): @@ -410,6 +434,6 @@ class CacheController(object): cached_response.status = 200 # update our cache - self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) + self._cache_set(cache_url, request, cached_response) return cached_response diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py index b075df1..7fe1a3e 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -44,7 +44,7 @@ class Serializer(object): # enough to have msgpack know the difference. data = { u"response": { - u"body": body, + u"body": body, # Empty bytestring if body is stored separately u"headers": dict( (text_type(k), text_type(v)) for k, v in response.headers.items() ), @@ -69,7 +69,7 @@ class Serializer(object): return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) - def loads(self, request, data): + def loads(self, request, data, body_file=None): # Short circuit if we've been given an empty set of data if not data: return @@ -92,14 +92,14 @@ class Serializer(object): # Dispatch to the actual load method for the given version try: - return getattr(self, "_loads_v{}".format(ver))(request, data) + return getattr(self, "_loads_v{}".format(ver))(request, data, body_file) except AttributeError: # This is a version we don't have a loads function for, so we'll # just treat it as a miss and return None return - def prepare_response(self, request, cached): + def prepare_response(self, request, cached, body_file=None): """Verify our vary headers match and construct a real urllib3 HTTPResponse object. """ @@ -125,7 +125,10 @@ class Serializer(object): cached["response"]["headers"] = headers try: - body = io.BytesIO(body_raw) + if body_file is None: + body = io.BytesIO(body_raw) + else: + body = body_file except TypeError: # This can happen if cachecontrol serialized to v1 format (pickle) # using Python 2. A Python 2 str(byte string) will be unpickled as @@ -137,21 +140,22 @@ class Serializer(object): return HTTPResponse(body=body, preload_content=False, **cached["response"]) - def _loads_v0(self, request, data): + def _loads_v0(self, request, data, body_file=None): # The original legacy cache data. This doesn't contain enough # information to construct everything we need, so we'll treat this as # a miss. return - def _loads_v1(self, request, data): + def _loads_v1(self, request, data, body_file=None): try: cached = pickle.loads(data) except ValueError: return - return self.prepare_response(request, cached) + return self.prepare_response(request, cached, body_file) - def _loads_v2(self, request, data): + def _loads_v2(self, request, data, body_file=None): + assert body_file is None try: cached = json.loads(zlib.decompress(data).decode("utf8")) except (ValueError, zlib.error): @@ -169,18 +173,18 @@ class Serializer(object): for k, v in cached["vary"].items() ) - return self.prepare_response(request, cached) + return self.prepare_response(request, cached, body_file) - def _loads_v3(self, request, data): + def _loads_v3(self, request, data, body_file): # Due to Python 2 encoding issues, it's impossible to know for sure # exactly how to load v3 entries, thus we'll treat these as a miss so # that they get rewritten out as v4 entries. return - def _loads_v4(self, request, data): + def _loads_v4(self, request, data, body_file=None): try: cached = msgpack.loads(data, raw=False) except ValueError: return - return self.prepare_response(request, cached) + return self.prepare_response(request, cached, body_file) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__init__.py index 8db1a0e..bdeb06b 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__init__.py @@ -1,3 +1,4 @@ from .core import contents, where -__version__ = "2021.10.08" +__all__ = ["contents", "where"] +__version__ = "2022.06.15" diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc index dddf9d82db1ae462c636611bf60c3e04ae6efb50..2b895ff9041cb53c4f0fd574e29a26c70f7094f9 100644 GIT binary patch delta 171 zcmbQjw2_H7pO=@50SHPD%O}T8av7r-bD5%;7#UKSQkc`3qL@=y zqF7Q`gBdj0UNQoeX)@j7NY2kINzE%MzQtOeky?~m!~_&CVg?dbTt)^)MtTNjdWNQc znyj~2lJk+JZ?VV6C+6hD$KT?Pk1tCtD$dN$i;rK)z+S`-GJ$>K)N(F1AWMLOgNcI? E0QW#Ae*gdg delta 121 zcmdnUG=+&bpO=@50SKzqC6nzY^2*9d068fPDU3M`xr|YaxlB<^j0`DEQOqgK!3>%# z69XhntGJ8|j12V*4fG5w{4`l^u_Wggr4}&(^%XG#iCf(9@nxw+#hLke@$oAeir7FB QY!f$>bFcte0t_5X0IU)j5C8xG diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc index 3a16db6d2129c496f429d4ed3aa1e027ccbc75fa..e05fd719df7ebd952fbde5be9f8d3f1f1b4c3453 100644 GIT binary patch delta 20 acmX@ke4Lp(pO=@50SHPD%Wve~!w3K~&;KVFUm$Gz4b= diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-310.pyc index 5e33e16a21d325043aafb42909121c6daa523c0e..b0f6cc6cb50d0516efe60ac36db7bb81329fe4a3 100644 GIT binary patch delta 1105 zcmZuwON$dh5bmz&d1jK$W|Qnj!39~tfDb(Rz_&yZRK!)pxr8v?yJk0;2|W|n6*XW2 zo>XM69`q=9@#@t-;JL3}^$+;2p6vPnd#JCgy6dazuIhQ}KQ4{pV$mZwhVK`{PX$6g zYUA%wLgO?_@&$pDfN;v8M+2JA5CG0b&*-y&QF4KB#?1-grZC4wVBK31bj^P0aO)Kf zT;a;S+~&@N1fH@s<;{oa%mPxbm{6pVuQf1zVx^a}9ppj)`O{AT@rDD!N)z@`m2o7OX z8d($0)ZEvXWGG!&KRWPPpD#70Qt!iH9;oO+;bLyV0t$ zgp{#NLVfP-VWOg=kIo?^#}HDI(lNP@-F^bk{0HnldkL?|O#=8P7=B}el4Wv;B=rrt z-6U)$t~KGxYbqBoM$=F%9*8Kvfnxf`O;gr!N6u@|KC*$J81JMVX_MW!ke498xGwKm zl*B?PTNYjVDgEpyJLT&~+B6l!i7aFjw!8YLZof-*IeW)iBkifoP7-#za))M7sl!gQ z{L4~K7)Pmy(qtJu5{)0J_gj8&1!{Ec|oL$fi$Uy#VMhWuEwTAR^OK~RN@{Xs0#mhPDH zF2{V>6W1}FvafD;_}W&7^Mn5XTF3i2@g&8N$$11u9Lu3TEgQ#y`HWGAT2KZCj8?#3 hVAO{aZi5SyeFF+V0pJH1@Eu*gf$4p%6yS5E@e4!4;ynNW delta 879 zcmZuvO>fgc5Z&2bJ5KDRNm^(Dsi+kKg#+gvDn1pV3W0<`LiiH7o>gm<*wNahEfhr} zmALS6@RdV3@|X6?Z{Q5GwhB3Pt$m(Z&zqSy>rb7p!7OXHTa4EGTUX*WpRr%oSzI1D z_i5*61js^$fP4%gJZ30Ro-&k*&qXNSZ76sn&m44qK8KkaD{c5*d;cA(a8PLupfyX3hUVi2e9$Ia>j{9dd$TH61zS8P4 znYrZ>p-Ha+H*y*k`=+T?grheAO*6 z_J|JhZGwUoFsCV>aO7Xax8Q>~5#>|4I$J%2^TE*c7>O0n4CtR=Je9^7Ch6Wl7@18~ zT9r4_wmFcdF`8s}FjmGH+4l7%s$wKYMYJH^>eloFuzR#~E2$4I-1t+S#pISoZUuIV z1IO?z*R68h*8k$4-EP;zybHw1ZxTrExn03!ASHO<@-CNL R_8{QFnj~yFfy;jfy}yD_qMrZ& diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/certifi/cacert.pem b/sbsheriff/Lib/site-packages/pip/_vendor/certifi/cacert.pem index 6d0ccc0..ee9be4c 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/certifi/cacert.pem +++ b/sbsheriff/Lib/site-packages/pip/_vendor/certifi/cacert.pem @@ -28,36 +28,6 @@ DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - # Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Label: "Entrust.net Premium 2048 Secure Server CA" @@ -491,34 +461,6 @@ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - # Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG # Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG # Label: "SwissSign Gold CA - G2" @@ -779,36 +721,6 @@ t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - # Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority # Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority # Label: "ePKI Root Certification Authority" @@ -1450,39 +1362,6 @@ Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= -----END CERTIFICATE----- -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - # Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 # Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 # Label: "Actalis Authentication Root CA" @@ -2342,27 +2221,6 @@ zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 # Label: "GlobalSign ECC Root CA - R5" @@ -3337,126 +3195,6 @@ rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 146587175971765017618439757810265552097 -# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 -# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 -# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R2 O=Google Trust Services LLC -# Subject: CN=GTS Root R2 O=Google Trust Services LLC -# Label: "GTS Root R2" -# Serial: 146587176055767053814479386953112547951 -# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b -# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d -# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv -CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg -GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu -XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd -re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu -PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 -mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K -8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj -x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR -nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 -kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok -twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp -8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT -z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA -pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb -pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB -R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R -RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk -0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC -5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF -izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn -yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 146587176140553309517047991083707763997 -# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 -# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 -# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout -736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A -DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk -fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA -njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 146587176229350439916519468929765261721 -# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 -# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb -# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu -hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l -xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 -CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx -sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- - # Issuer: CN=UCA Global G2 Root O=UniTrust # Subject: CN=UCA Global G2 Root O=UniTrust # Label: "UCA Global G2 Root" @@ -4360,3 +4098,588 @@ AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps -----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 1977337328857672817 +# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 +# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe +# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 +MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc +tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd +IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC +AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw +ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m +iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF +Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ +hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P +Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE +EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV +1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t +CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR +5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw +f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 +ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK +GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus ECC Root CA" +# Serial: 630369271402956006249506845124680065938238527194 +# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 +# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 +# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw +RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY +BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz +MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u +LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 +v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd +e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw +V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA +AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG +GJTO +-----END CERTIFICATE----- + +# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus Root CA" +# Serial: 387574501246983434957692974888460947164905180485 +# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc +# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 +# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL +BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x +FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx +MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s +THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc +IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU +AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ +GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 +8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH +flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt +J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim +0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN +pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ +UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW +OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB +AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet +8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j +bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM +Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv +TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS +S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr +I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 +b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB +UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P +Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven +sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X2 O=Internet Security Research Group +# Subject: CN=ISRG Root X2 O=Internet Security Research Group +# Label: "ISRG Root X2" +# Serial: 87493402998870891108772069816698636114 +# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 +# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af +# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Label: "HiPKI Root CA - G1" +# Serial: 60966262342023497858655262305426234976 +# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 +# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 +# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa +Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 +YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw +qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv +Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 +lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz +Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ +KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK +FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj +HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr +y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ +/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM +a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 +fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG +SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc +SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza +ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc +XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg +iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho +L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF +Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr +kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ +vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU +YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 159662223612894884239637590694 +# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc +# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 +# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD +VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw +MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g +UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT +BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx +uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV +HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ ++wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 +bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 159662320309726417404178440727 +# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 +# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a +# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 159662449406622349769042896298 +# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc +# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 +# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt +nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY +6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu +MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k +RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg +f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV ++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo +dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa +G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq +gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H +vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC +B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u +NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg +yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev +HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 +xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR +TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg +JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV +7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl +6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 159662495401136852707857743206 +# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 +# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 +# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G +jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 +4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 +VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm +ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 159662532700760215368942768210 +# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 +# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 +# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj +# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj +# Label: "Telia Root CA v2" +# Serial: 7288924052977061235122729490515358 +# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 +# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd +# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx +CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE +AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 +NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ +MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq +AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 +vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 +lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD +n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT +7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o +6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC +TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 +WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R +DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI +pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj +YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy +rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi +0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM +A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS +SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K +TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF +6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er +3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt +Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT +VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW +ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA +rBPuUBQemMc= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 1 2020" +# Serial: 165870826978392376648679885835942448534 +# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed +# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 +# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 +NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS +zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 +QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ +VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW +wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV +dWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 1 2020" +# Serial: 126288379621884218666039612629459926992 +# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e +# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 +# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 +NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC +/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD +wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 +OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA +y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb +gfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS ECC P384 Root G5" +# Serial: 13129116028163249804115411775095713523 +# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed +# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee +# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp +Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 +MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ +bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS +7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp +0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS +B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 +BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ +LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 +DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS RSA4096 Root G5" +# Serial: 11930366277458970227240571539258396554 +# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 +# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 +# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT +HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN +NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs +IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ +ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 +2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp +wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM +pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD +nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po +sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx +Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd +Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX +KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe +XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL +tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv +TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H +PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF +O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ +REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik +AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv +/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ +p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw +MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF +qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK +ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root R1 O=Certainly +# Subject: CN=Certainly Root R1 O=Certainly +# Label: "Certainly Root R1" +# Serial: 188833316161142517227353805653483829216 +# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 +# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af +# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw +PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy +dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 +YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 +1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT +vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed +aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 +1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 +r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 +cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ +wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ +6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA +2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH +Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR +eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u +d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr +PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi +1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd +rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di +taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 +lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj +yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn +Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy +yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n +wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 +OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root E1 O=Certainly +# Subject: CN=Certainly Root E1 O=Certainly +# Label: "Certainly Root E1" +# Serial: 8168531406727139161245376702891150584 +# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 +# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b +# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw +CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu +bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ +BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s +eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK ++IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 +QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 +hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm +ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG +BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Global Root CA RSA v3 O=E-Tugra EBG A.S. OU=E-Tugra Trust Center +# Subject: CN=E-Tugra Global Root CA RSA v3 O=E-Tugra EBG A.S. OU=E-Tugra Trust Center +# Label: "E-Tugra Global Root CA RSA v3" +# Serial: 75951268308633135324246244059508261641472512052 +# MD5 Fingerprint: 22:be:10:f6:c2:f8:03:88:73:5f:33:29:47:28:47:a4 +# SHA1 Fingerprint: e9:a8:5d:22:14:52:1c:5b:aa:0a:b4:be:24:6a:23:8a:c9:ba:e2:a9 +# SHA256 Fingerprint: ef:66:b0:b1:0a:3c:db:9f:2e:36:48:c7:6b:d2:af:18:ea:d2:bf:e6:f1:17:65:5e:28:c4:06:0d:a1:a3:f4:c2 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Global Root CA ECC v3 O=E-Tugra EBG A.S. OU=E-Tugra Trust Center +# Subject: CN=E-Tugra Global Root CA ECC v3 O=E-Tugra EBG A.S. OU=E-Tugra Trust Center +# Label: "E-Tugra Global Root CA ECC v3" +# Serial: 218504919822255052842371958738296604628416471745 +# MD5 Fingerprint: 46:bc:81:bb:f1:b5:1e:f7:4b:96:bc:14:e2:e7:27:64 +# SHA1 Fingerprint: 8a:2f:af:57:53:b1:b0:e6:a1:04:ec:5b:6a:69:71:6d:f6:1c:e2:84 +# SHA256 Fingerprint: 87:3f:46:85:fa:7f:56:36:25:25:2e:6d:36:bc:d7:f1:6f:c2:49:51:f2:64:e4:7e:1b:95:4f:49:08:cd:ca:13 +-----BEGIN CERTIFICATE----- +MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMw +gYAxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVn +cmEgRUJHIEEuUy4xHTAbBgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYD +VQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENBIEVDQyB2MzAeFw0yMDAzMTgwOTQ2 +NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEPMA0GA1UEBxMGQW5r +YXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1Z3Jh +IFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBF +Q0MgdjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQ +KczLWYHMjLiSF4mDKpL2w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YK +fWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMB +Af8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQzPUwHQYDVR0OBBYEFP+C +MXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNp +ADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/6 +7W4WAie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFx +vmjkI6TZraE3 +-----END CERTIFICATE----- diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/certifi/core.py b/sbsheriff/Lib/site-packages/pip/_vendor/certifi/core.py index b8140cf..f34045b 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/certifi/core.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/certifi/core.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - """ certifi.py ~~~~~~~~~~ @@ -7,6 +5,8 @@ certifi.py This module returns the installation location of cacert.pem or its contents. """ import os +import types +from typing import Union class _PipPatchedCertificate(Exception): @@ -28,7 +28,7 @@ try: _CACERT_CTX = None _CACERT_PATH = None - def where(): + 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 @@ -56,21 +56,29 @@ except _PipPatchedCertificate: pass except ImportError: + Package = Union[types.ModuleType, str] + Resource = Union[str, "os.PathLike"] + # This fallback will work for Python versions prior to 3.7 that lack the # importlib.resources module but relies on the existing `where` function # so won't address issues with environments like PyOxidizer that don't set # __file__ on modules. - def read_text(_module, _path, encoding="ascii"): - with open(where(), "r", encoding=encoding) as data: + def read_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict' + ) -> str: + with open(where(), encoding=encoding) as data: return data.read() # If we don't have importlib.resources, then we will just do the old logic # of assuming we're on the filesystem and munge the path directly. - def where(): + def where() -> str: f = os.path.dirname(__file__) return os.path.join(f, "cacert.pem") -def contents(): +def contents() -> str: return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__init__.py index 80ad254..e91ad61 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__init__.py @@ -15,13 +15,11 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### - -from .universaldetector import UniversalDetector from .enums import InputState -from .version import __version__, VERSION +from .universaldetector import UniversalDetector +from .version import VERSION, __version__ - -__all__ = ['UniversalDetector', 'detect', 'detect_all', '__version__', 'VERSION'] +__all__ = ["UniversalDetector", "detect", "detect_all", "__version__", "VERSION"] def detect(byte_str): @@ -33,51 +31,63 @@ def detect(byte_str): """ if not isinstance(byte_str, bytearray): if not isinstance(byte_str, bytes): - raise TypeError('Expected object of type bytes or bytearray, got: ' - '{}'.format(type(byte_str))) - else: - byte_str = bytearray(byte_str) + raise TypeError( + f"Expected object of type bytes or bytearray, got: {type(byte_str)}" + ) + byte_str = bytearray(byte_str) detector = UniversalDetector() detector.feed(byte_str) return detector.close() -def detect_all(byte_str): +def detect_all(byte_str, ignore_threshold=False): """ Detect all the possible encodings of the given byte string. - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + :param ignore_threshold: Include encodings that are below + ``UniversalDetector.MINIMUM_THRESHOLD`` + in results. + :type ignore_threshold: ``bool`` """ if not isinstance(byte_str, bytearray): if not isinstance(byte_str, bytes): - raise TypeError('Expected object of type bytes or bytearray, got: ' - '{}'.format(type(byte_str))) - else: - byte_str = bytearray(byte_str) + raise TypeError( + f"Expected object of type bytes or bytearray, got: {type(byte_str)}" + ) + byte_str = bytearray(byte_str) detector = UniversalDetector() detector.feed(byte_str) detector.close() - if detector._input_state == InputState.HIGH_BYTE: + if detector.input_state == InputState.HIGH_BYTE: results = [] - for prober in detector._charset_probers: - if prober.get_confidence() > detector.MINIMUM_THRESHOLD: - charset_name = prober.charset_name - lower_charset_name = prober.charset_name.lower() + probers = [] + for prober in detector.charset_probers: + if hasattr(prober, "probers"): + probers.extend(p for p in prober.probers) + else: + probers.append(prober) + for prober in probers: + if ignore_threshold or prober.get_confidence() > detector.MINIMUM_THRESHOLD: + charset_name = prober.charset_name or "" + lower_charset_name = charset_name.lower() # Use Windows encoding name instead of ISO-8859 if we saw any # extra Windows-specific bytes - if lower_charset_name.startswith('iso-8859'): - if detector._has_win_bytes: - charset_name = detector.ISO_WIN_MAP.get(lower_charset_name, - charset_name) - results.append({ - 'encoding': charset_name, - 'confidence': prober.get_confidence(), - 'language': prober.language, - }) + if lower_charset_name.startswith("iso-8859") and detector.has_win_bytes: + charset_name = detector.ISO_WIN_MAP.get( + lower_charset_name, charset_name + ) + results.append( + { + "encoding": charset_name, + "confidence": prober.get_confidence(), + "language": prober.language, + } + ) if len(results) > 0: - return sorted(results, key=lambda result: -result['confidence']) + return sorted(results, key=lambda result: -result["confidence"]) return [detector.result] diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc index caf982f537d31f4a6ed4e4184b23f9058d61cd98..8e89003b7e4c9a66c1810ffc84f51ce67a9b5d49 100644 GIT binary patch literal 2382 zcmbtWTW=dh6yDjp*G`(Gh2F(JAz4tTJRp@Qihw317EOxkviY zO&6E3i%UnSS;AgJt5%*NFjhsvt0&ozH+aYijOOnp(IY}x7_Smex;&*-T{!pG?l$Uo zHbprIzo6TswiogXElOa1{OE56_3Eh}h?S;*+GC z;wb6)>9!j8;82O*+2_P(oWerQQz}bYNW+0z2w-7Jn(?>5K(UoP9D*g{^VBDM;UG## ztx)6pS+VD}mfvnmCDv~HDIE_&O2hqjTj@OiWNj~lFG{eVc6LBeu}$nSsU-E4%Ex{$ zG3~sd5fUmOGS|yKK4DNi;p;0fypw%Zd+TL!l&P2K$by_Uq0-AZQgE^u1W^+4AgE>g)CNx%<&{g9p5q}MRgn3@HEiS|7pe7I zT?vlKz8vl@h3iDaYSk#GMCj(&Y9kSv7q=eG_kGvSC zVAM-eN&?=eg!R)HLn_vjZal=(@$-Jj{g6WHkvM&<4y|0A+O^wnaanDnzFFV6w-Icu z-(730-?_ayPR>&esL3etA);Z-*>vik60J=6G>yjwsl>2wGMaWEz22fhiFPL2Ip}@> z8hl_$YP%08eW+teYG_lXDCDnRyDm_sMn!j4nl3H(NJ929x+04Llf0@wSY za-4R;Ys0j(_}lslI?^Whe>Y;x%~``{+q%joy*u8 z(3mV*IaH&IT3ONXCcOkRMc7E##b6MmcSCQR}>|`OLP&qYv2D)ZBk|hl&4{92fE<|a){?&T$<#$_a%`=jt7~#SA zZiLehS;&DNZL-IK#;Cj#VTV};12Nl!ty3Ro{w)ZJ%EV$44v4S-nS=@tyi?8|N4(#h z0T03BCKl2V delta 991 zcma)5OK%e~5VpO~Y&L0W%9cV!bgsJnW84_bw&VL$h7GC!R7H~Gp$LEF@Y~tx zuFRAOb#M=N@N3MlSjUK|9TejTceM!hFh;P_lWX`LzLI>#m*l>4Dmko^ew?yp@O=CD`waLW(80G*yk@%*QYrbaPhUQ%p}+d` Z+>O9(``*0xBB6L(vtVL~E$Nb3_zl4zm&2M&5j0UM>b8C_OBnthJF>E(-u&7Y54! delta 24 ecmZ2|g>m&2M&5j0UM>b8s8*Lu7Td@xmjwV=-v%21 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-310.pyc index ed03401926e0f122effd9ae028da1e394a477245..3c0904d7105955a4bf791f209e99fa6e82c3714f 100644 GIT binary patch delta 219 zcmaFG@sNWzpO=@50SHPD%O{_m$QvWT+RPlqk-{F#pvm!)5hyWnrM$3^bAC!@UV3mz zVo9oRVsb`iUh2e3*@-9W9hrbCn1Q%h14xuGG&3wY4Rqg}tiBW(*Hz_$I nv8Xt;q@XB2DYaRTMW`5peNfr+PiGeq1 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-310.pyc index 0dee9575fdba7ada7af0286ad56e4137bc36045d..8d6de466470c107d651dbd2963fe211a60bc035c 100644 GIT binary patch literal 6224 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 Po|`>=^y#KMogVxz4D1(M literal 5740 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 Hzfk=J&pKLo diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-310.pyc index 50bf1f5456b0d7fe0029f990861ecb9acee277da..99bd23af9051efa926dce6f5fb01705eabca222e 100644 GIT binary patch delta 836 zcmY+CO-vI(6oBW=&ThA*1uX{xr9g>A3yENi0n}g`K|;XNKob--wR8q)pe@X9QFJ#D z(SrvMI7crfCK@jq=5g#p+u>>?5+b;2 z?>dWbqlA3faav($r?0a^K%H^63-kIo;W{_&5pHbLd4t0&Ndj%x;p~YK3F#(PAImO zu{Ga9xYSkZGFNwW&X%c6AcEdPTts#0S`@tode1n_(UzGUcBnOsV9Y^$haHTMYQeaA5p0Dk>V5E;+6%q8=t1#2U{50whd}n#v$743Z2cRE))<2-?Ge zc>Z@gLO(S5w=p0S@cAR_Lw(1l5og?ZjJP3KgA+&hc8G$>V7E8Bhn()_&uX0vG! z%(gA6wyo^it6kw7mkB3j8sLD0sDdjP#Ge8wCn^#(kp?f-7SC!Z@22ZQD44HS7MNwRo@!o__NwmX`&0;H=%%XyR|17lon}iDEuql2Uki;U|iP#Q1Pj zJ&k^xk_4P?>FY9H$Fo;t9}w9EFaz6^fWBtPoVOrq)D@mg>e&MTX|sOXGNoQLj;?hV z95)bh?w%7Y&WRmKbFK&=<}X0Dp8_y#h8b=lEyN-ww)B|Vq>V<2g~=mE+bAOs(o>5$ zIV%Evb%h-M&${)inr@cxYSf6G!5yk(?{D0v1rBN$RU38>POA6z!Dy-pOZ|S*ruu1j YM$F>;ZIKUDYi!WAAZ+zm*d`tH54s`RSpWb4 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-310.pyc index 4b2291524184b07c35791be92678c8625158c583..a8936865307ef7d31982c89a04c9ccc5211c989f 100644 GIT binary patch delta 151 zcmca6c0x=$pO=@50SHPD%O^kQWng#=;vfTNAjbiSi`6D-E3z~*MKNy-s$yfbn0%J4 zhtXkk6uS?js53}j07&pL^Dwe83NVT=2{3Nn&tbu&F2=#Z!OX$S!OXhc1=t>pO=@50SKzqC6n3s7#JRdILLqn$Z-JTVvUK~ifpOO&CF3O8w0A?7|kc2 zX6s?J-yFg2!zk|rQXv8)_?USZ*%$>F`Iwj(S^f(!@d0^NvXdXO32(l{Au)8e{evvo7XRn_6 z3!Z$56nrqVGt6TiD@UV<;C!5)6QBDL9Qh>QE;@L=JTi>KFe^Z(RTY diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-310.pyc index 46644de24bb5c6df937a1687b1ec461d575b38aa..6dad5afbd006654c12f204fc390b7e67fddd0e89 100644 GIT binary patch delta 99 zcmey!@q&XlpO=@50SHPD%O~q?Y8V!Y)BOZPvf#7>+b+Q~v4)w@YVk+^e2u x#XKx$_M8stwd}K|D|RRDjOsA?gck2{9IyL`CSALZaF^F;949vMNrv{#>nITf2&&$ij00h&J->np9{zrW{zS53UH_J z00nr!3fMQc{bXch-rT^{#>g)SvRMR3a4@hivan1RWqHP^F!>M514hlwcUkip8LcP# zvd`o<0x1)KDP!LJm3;=Ijw48r4<^V4)DMIlj754tAwNxyB2FNEi!DDXD>b=f@dyVX?^|@WHH}2ZqW>wThbCsxg zz1w!THUF98(>uikjG%)OT^u7q3nVz2gpMvE9d-)dK6!0wh^XKroKYg&W8v;+P0AKR z7XQZ*#EwH|t(gmQ2b?4ga8iM81iC3oh H><#%ZVu)Vz delta 452 zcmY+AJx{_w7{~7^z0wy7TI*mm4my}RIXF2O2N^Iy3Ah>4AXKCwMUHbYoN-`q!o*yh zT*?PO4H4(!Jk_Z&hN*C5 zxtZnCYYFd8#tQ$KE!cj>iYY6jwro{Obs^QoR2_!mr6~fz8^}|RJxHuxGwS%4-5w2y z=O%b~a~%+3i3R4B+%A~gA{wpPwK=KF~NLYe}o2q)jwd9-x{l+@n_=&)NivbXx{(; diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-310.pyc index 587005a623fb74457463503ee5672673aa8d3d43..d90c59aa18cb2e7c2b1d5a1550048736cd5fb4c6 100644 GIT binary patch delta 120 zcmdnxxXY0*pO=@50SHPD%O`);+sJoUhLL&l8=1p`TujVNj4;Udi-l|R0a<27K^}DB c$p>VsCi}^+6y(Js6E-jmbu5C!nyw zLMW78#O@bJ4n278N9eVMp7$FRdg)zg->kOip*y@c^WOWtzq}nx{LH1h>9k4k>wTGT z?w+Ub<$*ZFp>5h>J1lv#w$f2|&R;&dZw}Z_+A(URZ2kcBDMMUbe^q_4z2*gidySs( zy8ctY-aZMu;QU*Dmd4g*y}9rCZcWsM8(Z7F+wlB1iS!X>^3$8Ww(y>v2)DXl=QUSI zfXkx-3{NR$U`W9dGC>Ap2qOYSP{9Te5?c}KfZ(l(RC4Pf85$DdkQ%vwt+E-bLGRGz zv2NR*?+M%HG9K5F#YVI1U?q0Y;WAM?<=p7OuKV?9m1>|x8}tIq=oek8{Hv#MtDcaw z=v8GhFPFnCGd>o*W{Y5ce$Naz)lip0sv-p?oSYyb3}B7yb#`f=_8G>2Ar09G`bww> z)=~~AFQHZ)Y7X|=N+IbX9Vytq(K4~?F(Cd{g0&F4h}!hEwwh=&s69&Jj-QT5Uk#~4 zQB@0NvaG{aaCEIZ!<>{tbwokR6F21}9L4^Z_pZ)Cu<;m!)x;$Tu4cG5=T#nnr(>T7^^xb1&2XdXb z5|y+PsL^xnQ&HnNY1SLKOK9dXc(Edd2vQ3hchR;ir@w+M3l=p&0}2WrBXQ?3jkc2uqn5cnL|GjGIbWXcW~ZJ=YkR-H=KsK4tmW&lX4JB}at+;Nx+A=72f zXlJ~fsK+!Jmt8;N%x@L?+z$h%DJgvbfSgz+$JiD>$(;v(sa=5;|5A%lhmJ`~3QS&T zRbf-$m?56g8n(Z^rv^Th1adIyFrwRVg&7PU!21+!h6e{AHJ?pig_bz1ZNp>a6PD8dIqeB2MBs(+1aKEz`cV4fs3fCUNk9WIn>io9(tLCxN&uzN$;}mr|8AgDo$mT`yo3++%76AR;G{0%TMe z+I39CqIOhLSy7ht);{;3%u?)&6YbXO0%Vuu2UrGEzy)Gr9h+GBtrG>jj-{2}#syr& z6+)mkw&asd^U$Bi1iHoB+$OGx@43fn4WQnL(_E-YbXF6QzOs5P)8AUvPE{}H_aa7Q zP0A>p?zP(6O%{247ycg*nj*8su`08p^u~WurdjbrFXc0xYMtG7!1u(wv1}JE=Yh!h HouPjK<7Vl} diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-310.pyc index b09a36b11ac0c65dcd49116c2f28b4997831fb2b..a3f98b311ac0434da63f1585b85411a6ff029699 100644 GIT binary patch delta 24 ecmbOqH$RRypO=@50SHPD%P0Ta$SbJN$N~UWeg;+m delta 24 ecmbOqH$RRypO=@50SKzqC6ixmspO=@50SKzqC6ljAg@rjnRQWHz_$I zv8Xt;q@XB238;(-sO*+dGT1G}Ah+Z~+)@N`!7Txh;*`wdlA_F{(vr;lyvd3z9srhv BKqUYG diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-310.pyc index 346d1e300a3819edb43a2f09462dfb1d837373d0..680aced2706fcb014dbddc2dca2e47c983568755 100644 GIT binary patch delta 27 hcmZ2~g>n5AM!tMrUM>b8C_OBnY&c;fpF$QRGXQo?2XX)a delta 27 hcmZ2~g>n5AM!tMrUM>b8s8*LuZmr(Pr;x?S1ORcd2NVDR diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-310.pyc index d877f61aad11f4ef5ee9fb60a503c3736c58471b..1bf959873da656e9954e5c74b57def3773cfd6f1 100644 GIT binary patch delta 221 zcmeyw@sfi#pO=@50SHPD%O@Y6$QvWT+RPlqk-{F#pvm!)5hyWnrGl`KbAC!@UV3mz zVo9oRVsb`iUh2e3*@-6`9hrbCn1Q%h14xuGG&3wspO=@50SKzqC6g~tvJKlF9NywmHb8C_OBn{C^|wR4+zm0A=V0Z2$lO delta 26 gcmZ2Hm2vS@M&5j0UM>b8s8*Lue!Y=*suv>@0AEiAyZ`_I diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-310.pyc index 085d42ebba67886698f743d8c628dd1ea0028081..935ea06cb959e9ea5108368e2adc9f660d061cfa 100644 GIT binary patch delta 271 zcmeyx@sWc!pO=@50SHPD%O{_l$QvWT+RPlqk-{F#pvm!)5hyWnrJ}HqbAC!@UV3mz zVo9oRVsb`iUh2e3*@>r`9hrbCn1Q%h14xuGG&3wlD7Gf-70}A+Qa^4b1&PXgu$t*4@%1kOP$;{6y0y*oJ mP%_xn#UNMbLR?)0a_cSr+$4~W;?$CYqWmPF8;n@o8JPhj2S!`~ delta 230 zcmey!@r#2upO=@50SKzqC6jMW1(UUd%uhAY7~iBuW@c7;6}snHDfDWME_{VJ=~52J+)sOW2wj zfHZpz!vYSFObP?gbVff-&ReX-r3I-)MQlLLllvGI7+EH-XI#dm1Tv5VNbpULXDVXU zn0yIH>P&WJZevuOe1=(8fIl}WIU}*CIJKmpC_gE+X!0*+c|ie?P)cTTNl|7}X-Q^& L-egS{cSa@vQ~Nz- diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-310.pyc index 7660122f1f86cc8f4dddda25f1c57d198241b6ad..9ab18dfe53504baf01c3aaa89d11d22f16eafa93 100644 GIT binary patch delta 520 zcmX}pJ4*vW5CGtvy~`!{L?V*JM*_a0MomQUiP3DEFVK)ay54TvV%rE|Cv57JKa zs#S2d^BZdgyW~3So9?Q)oA)X-71MGYZpF6z6splq3*jLDzsiS5`%e0MFzrVFiD6VX z@}6CEiuP8%xK_Bwj7Q%d)@$#+UTEl};wGYzNQ#6%tvqAs^$Euxu>vyx);RxCB>rhB zwNt+X5kKH^E7lmY1_~HBf>b7nsJaIo;!G_!rRX$jkUK<#iD6Nd!oMqVI)OTBNe1w5 zMH2Jc)L{n|C5TRpN}r&ME(%??%uDnU()$-2I6v+^=bi)i&acexOb`Wu6#Ba?W*gyca6@@h z?+~4erYpMC6IVvx7zh&lmkQGdq9^K3PxM`+4#ckbN?Tb8C_OBnd}JeUW*8$g0C)@s=l}o! delta 26 gcmeyqhVlCvM&5j0UM>b8s8*Lu-nfxBGmMc50C9Q;H~;_u diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-310.pyc similarity index 51% rename from sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-310.pyc rename to sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-310.pyc index c731d86286a220d4c7f090d2a1d38cee616ea92f..75ff48ddcce3bbdf2892ab02ef824a7bf5d7bae7 100644 GIT binary patch literal 138759 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

*#FLL3=jP`8&Nbo*W^r@O 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2b91be1338a7a5b4a9e2ebf185ad93f735842eb GIT binary patch literal 1128 zcmZ`(OK%e~5VrS~ZP-Eyr2=t4f(tpcy>LPZ(IyB~nieVIvRcX7tes?GAHnukr0Ok| z`Zvn4e*^x7ubepd#)+}FQMW?1yT%w94#?oJ|87447dM7|wGuA@Fce~nLhB5TF~!t6^+TIE)TYiUTHw$HY~lv& zogoK>I_{RbV|>&u6P?6zXl%jMPQ(ik5-rd<{(&%(mb4f61QAEN3j|;91f93Eh9WSE z54yf`MKxnw`GllJDhc7*4tGJQmBi3MM9#GX^^i8`BC+P{7_PdU2_`SFasi&yFG?OP-H-I*BPGV#;_r9!FxdMEmI|5~*aHvpD%0 zPnd{i>1>-Ev4WO-I|1@3liOd)X*`;l5^T-p+=mFC!xS2{aU1(Mz{l$i*0z=@{zspt zum|%}Hyp)4jdc*Zd)fhCgDoCtVUQ8`VW|Qg2qaF5IA>khxzr>%*72jJ&*q_9{qhdn z1fR$N-xR_MH$tK+3>mY8XxKu-7p`to6LR6cOyrfm8aX`qoD$Z(+Ax-%} zBD8><^9S1K1_-r!RlUZ@Koj->Mi=M$0nj9Ym*z(%gvOCyl4!SF9&6KLq zGj$tv>b4U4b>;QzGEJxM<)bUQ>aucO4&}kFfELs(X-qewxvqx)x=!(puBFhwmEcJL J9T4Dk`yUaf6V(6! literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-310.pyc index 5da352d926c7a6f55a953362ee80a23f5ffb4f01..9d8a3b9e43199064b9a7f1e59db945660745474d 100644 GIT binary patch delta 510 zcmYk1OG_J36vywmGr5j2FLX3*qw%pD6(WMcMZ2g_8!HGUE;KHNnhA&-!_^=@P$Xj7 zI7z2DU!aAyyHeV0x@Zd`egL7XsT;d12*p)*>bb7Gm;1Z?&*RTI)sOu81COkP!$C%; zbljW&wDcy@olcW-SdKkq4mfHcsJKqQe$BbK5?btX zvm4J2@8Mpx1fTJL^;h((@(_d&@1lD24-1+PHug76_=fZDdsxRSHxcMDw2;7LZEKuU zv8K9A!Wt{HxA2Yut+vfAA0%}hAp&E5UkjA88 zo_i)q$64%ggjyl$UBoaCm%=dNJ05u*FpPaQv-#Icfq1AgkMOY@hu@fPWZLd{;+fksI6(zIz1tZL h76PdvGnOtBs?|_X&T<0J-8lYhm@Uc3Ta_V&&kHD27lkfL1Pi+G1zZ#?LN-1^k!}S&ce-;f=Lg@J?|f%2b9czSBW@MCyF-kg z%9DZB(|2F3=;S0Rhb^)<%mIggWDd_mOVspx^9)_G>2tbg3on=+069ReD3XZHlcR{<&9!q$|McqRed7# zOC{(83&V|Bc#fr=2v!;voVC5iJW%7hIR)n!Z)Jv_l1(NQo+(5K9Z{483UoK+3#_+B z9*?OvVFk6~gsQCmieM&iJp{HUlX&|n*8bayL-3XIy(ajV|AXUu8T-MK0le6YjLQ_6 oE~)%aRbhT-E)kG})a@9BmG%6pD+LLEu}slivMXl4x6^&GdnoXESO5S3 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-310.pyc index 70ac3a4c9ceece8bb49ce55c42cb5c37a55b58b0..b716b7564e6eb087b294291a0aeb2bfeee2d0f9b 100644 GIT binary patch delta 95 zcmdn|jcNNgCcb=LUM>b8C_OBnTr^`N-{mZ>pa2F29tI|M7RJdF7eC*8DO=xDgo%}f hk%f^72thOpBgaoBuFW6U{bSxNxKoHp2wj@*CjiqP76JeO delta 91 zcmdn~jcM~YCcb=LUM>b8s8*LuemG|%-{mYWzW@dX9%d#E7RJdF7eC*8DO=xDh>ewn ekqHP{z>wn?6UXL{>;5rs7TzhuB!DW(_X_}h`W4jx diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-310.pyc index 73ad7d71636c18c83913f86143f7329048a2d927..41f80ef1267711d40cafce427d0c89ec3c34fad3 100644 GIT binary patch delta 90 zcmZ4Zf@$dsCcb=LUM>b8C_OBnyrp3yA9FgFfG-0B4+9fB3*%(QjK`b*rGIo4VPa)r bWMO0iLJ-Zu$nlejYcu0I0X89Y8NQzY)1?uA delta 90 zcmZ4bf@$FkCcb=LUM>b8s8*Lu{@k*Wk2#%-$CrVDhnb0kg>f=t#^cTZ(m%Qiv9Yo+ bG65kA7;^k#;sDB>+I)7M8>;}S9N#Yh_aPJK diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-310.pyc index 697adb5d34e140721e3da0bfae88aded7cf48053..fcc370f7abbe7c7e688b24dbf3ab70496a1d3e23 100644 GIT binary patch delta 64 zcmbPqhiS?kCcb=LUM>b8C_OBnJf(gk-<4!8Jue0Z9tI|M7RJdN(w=R;lw#m1#Kg+N P$im13gdm!Qk?$t}J>Cx! delta 62 zcmbPohiTFsCcb=LUM>b8s8*LuzR|dm?@BV4ju!(14>J=73*+PsY0oxaN-^*hU}I%r MWCB7KFy#9M01?m*y#N3J diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-310.pyc index ee6d36c53d0e8954c2e53dfe590332c63a6f75bc..76a532f0a8d8aea95633d6b092ce2693b663ec32 100644 GIT binary patch delta 88 zcmeDF#?=3fi7%g*mx}=iN)O8?f9~GMw>pa>D1d>1hk=QG^T8|$FA*kI7Dg6ECLjdS ZEQ}mKnYbo9mYmwWb*mez5V|biPXN*X61M;V delta 84 zcmeDG#?<|di7%g*mx}=is?{ZvlO}BBTb;$>7r?;4!_367`CyiWmk=8(3nLQ{vVbAS WFD8!3jwPoyZ{O<1Du61-_X_|?mJy2p diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-310.pyc index 8c72788394192db960033f68a1c6d34859b3267d..28e984749de89200e1b07847cec80c974515d1a1 100644 GIT binary patch delta 233 zcmca{hxy4JX8wF$UM>b8C_OBnto(&>BY%D?*P{#u1|9|`b{59T0=>^R=d~Gl3Nx{? zFtRW*0U?NHVdVJ9G+D9x^yUYTWSBSKy068AM}-K><_))u81bkeY=#>v9_=D5lQ-O2 PF?rwHE+KSx^8Ew=FWNd2 delta 226 zcmaEIhxx`GX8wF$UM>b8s8*Lu&S7BM$e-WJbuEK|frpuigN1RjK<~57d2I%sLTs!o zj7&ht0)`yFm^grPr#3IRCd0h>!F??z+zQ-Samx|ZEW)z+&od)N+$QW{ncVO&VY0?M LEdf*~^8Eq;PGL5{ diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-310.pyc index 3d4220389e2f303fd8c5395c48bbb9707bf13e9a..29b42950d8d5a0c9c47322611e3fc790b644e557 100644 GIT binary patch delta 64 zcmX?fm+8n|Ccb=LUM>b8C_OBnTsCndUrP#?o)-fH4+9fB3*+R3^kb8s8*Luo-lbMUrP#?ju!(14>J=73*+R3^k*jQN@ MnShW54EcTm00or|`~Uy| diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-310.pyc index 449ab710705e188970112b9e7b0230adaab6c287..fe7a7971c87324882e7e8341917b85013f24f075 100644 GIT binary patch delta 64 zcmZ2{hiT~@Ccb=LUM>b8C_OBn+*7iV?`blZo)-fH4+9fB3*+R2Y0ox4PBHKlVq#@s PWMO0iLJ-Zu$oCTfNa_z& delta 62 zcmZ2_hiUO0Ccb=LUM>b8s8*LuK2^4n?`blZju!(14>J=73*+R2Y0ox4PBHKlU}I%r MWCB7KFy#9M02@{g`2YX_ diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-310.pyc index 72977d7f03cb9cd88814f59f80a2fa90110372b8..70480f55c15ce6b68561ce3b068529c1f9ddf5a5 100644 GIT binary patch delta 476 zcmX|-zfW5+5XbNA_a3ejLrS7TUx6d{$YQ5hLJRUm$-%0L7-AOa!iy_X1~mno50 zn0f;v@DEgN5#kSEMq*}UhCiWd&q2c0eeCmneLmkq@wRAM#%SQtzAx;Y|2FeMahbh3 zRMA3JoWU+yw4$%7anqv_R=)_ANw%oSh@l5pcnt^^5~zs*Wdc{;+u16V@LS1$ z@}u@~J*3y*PVcz8ilOP}(8An%x~V}rPQnlGVJvbkp^QC#z`q9a)aMz)lJKL$s6)=- zlf#&U3+&UnI>jS;R0kN+;)h?E>PT2`wmS9NN%OE4Z|#xNl5KWp(|oP5mxj>SMVBCXem`G1mUbJ!gVHeoq3W` zyBTH%yXMvjU8E}c9($3iI*lG`5y;@*gb;tVPp_$6EYVuJJh|;O?t6+==|K1zh2%12 f#?WPYBQ?#Tu;4KD!+b?aD<)5yM%^^bv&7;5j?!JK delta 446 zcmX|+IZFdU6vyYy?oP%%f{J*=D4KW+9+d>_w6G8n1dAX4YL~rT^kkbeYKF3 zc8Z7}LM%lH*!v9x8-1hb4D;j7{~hz6hs<-vJM=u8(K;FL+x@)rrp4eY-2#>epXK=_ zD}oO`zmR#uH+=JgVP0%38&slCI7WzA1Tj134c=tHd=|5U@k29a4eM9iV3V*mDOy%o zuLVlE)Q0ck(caNRBq516iCIg}T*9|RS~RSfH37d8Gg(fe>d@%a=>A8~U!sKT@))Z4 zB=?|(3vIXQR)4WljRI9Tszl{Na8RmN!g8S+M5N(I8}>xh8>R?0NZK}V5MPqxwVi`4 ze6>dsT|PhM2gxfZ-4S!2?=dx@6^ca{PCL1jrAD;@?OA0BEhDV&t9FX;+{q1`Q4sbL zTrk1r5(IQ}4ko=~0=_s!n8HPOu76wC>7Plel!9C2#UNKkdlE0*O(#PsHKZ|&@9qll K`+3hW!TScCL|S?P diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-310.pyc index e6d67b8b444ac0b6faf88a17a8f36c5fd19076af..22083018e6d9e8d0570aa87b21950226712fb89a 100644 GIT binary patch delta 670 zcmX|9L2DC16rT5HcC+1PW0RVuK`}@RO^Kif!3y@GLJy)S6%V48w7b+KG}XxlV%bok zdJ>T`c<3#QKS9Bp7jGWK^Zo~~o&^17Te`!0v)}jL``+xl{Zal}4t9gU7kGx>8(T|< z!A|vVd+T|pAFapjILeCm_3mb;zkT@OSF?$%SR9BhB^1(oA`yy2Y;f*n$RTeturlxH zyys-jVE7`^<_rDwOXOmeXs=<~vSvPU{Q*Nv!UiiRsuM~DL9fd?u>KTFT?LlMI7H{; zE}>W#%Y084P`~VG&&Qx#nVSmc+6u7L7H$PQyQy8 z#j>kx?>?vcP*YOZcU@|ig*ym4&<-7*W_8eKF!Z{t7KmzL%L delta 685 zcmYjP&1(}u6rcBIcC&7>`D*JXh~hz71EC^_7-%nk;K^1fg;LNEyKBrgZtG+PX(v>u zdJ_qA@|L~o(S!ek2N93^ANUt|Q{SwKxXb)z-tT?<-oBmBwJ$aA!1G*2&+$rgZ+qfB zUAiw19u4CDR?){3nbXvOqOjwsdHdmKJ;+%AaoXYj9#jjq?_*(Jz8r2~O#~%^vKG zsr?A2T!F$SOJU3vPef$xqg*DBJuL(@fXJbBMqw&|C2mxtPc8wAJ9(@}u~&&L&)C(R ztq}WAu@fp@P1#r|niWx-G)EGma4}qBF zW1hcA(o0lX<(X$wW=>N-HMJZ26(QBUHzF4Gv328OGqWW9r7+{eFqTCcO6JDli=;a; zmp}^r-MR!^|FqtNr6=}+{$Q`%xlCc}W{B4bs!#xK?=}qqID}@fU^#$SE(%i9K{ig8BHsxhoSDm|XUhg>FKiYwry#N3J diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-310.pyc index 86a97210f57225b65abceaf4f60e2418c89de99e..c16c4e7eaa155fbddba60e42e434d8c383ebabf6 100644 GIT binary patch delta 630 zcmZ8f&r2IY6rQ)6n9cr3YN8_2DheKA=t0|p(o(3u^-z^4LM}_PJI17IH_YtPOCg8! z*dD^({aXb8i@AETQ1Irp@2yL#&hS2VzIprjzK{81Toy~A43;0(Jl)2vRygL+On+rTuHqKk3!J{1! z#{HxW)1%+zqzEtaTPGXGr=z=>`Tc|4PwW5s&Bp#-ZrgD-8XTnKbZLnCzmO7T4Mkql}%fZtUqY*ZTOt z;<5KdWIQ=m#6;gRhD!bjhAdZ e@|QY&O$L?m;Ue_ofPbWSA&IhI+3fK>HZPi< zX;Mt0NrXOxeuNYPR-|bJ5+2E8poQ0RcghgNtO%ADkb$I}guko*LnGltqS{3r*G@k12D!26g>TCmIixg@_a1J1NHm zcFzfGHCaqx8Lm2A-)j9Np)amA>hlY8^RWtD3YBl2(U?KYT(vrtQYB{4KPPoD`Ix|2 oL`mLN%-~~3{r<5QnH<6qab@Y;wf(lUj4#dbKpWTK|H>u407*ZCL;wH) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-310.pyc index 8d3028c63001fad888c5615689ba1bfd1671ee4e..238368a98fb83f42c15f6846ed1db8773213d98e 100644 GIT binary patch delta 1183 zcma)3OKTHR7@eD$Ofu6<(r8|j$K?HN)7CC@VJ&%>Slgn~6m73Us@`iwkfPYF?ZO|B z^jisT#HAFK`2iLLaiuFkTnMEb5nQ-%p{3%TNsXr1>I~)iG%v6pZJLFffWacAFKLnK7>L+62Kv<5|svNhy+bJOhP!a$iWAc zf}Hi6s*x~`(g^ctG)f|-Cq^_JZ;$8O%`mKp;dFvTagxS~OcOLoVx}iW;yAs?5i1*A zH2@ppb2H^+PqhCD;T=wVRxNvVy@sNI2B_=0p^+?})~ zPbr4K3npH&kUSWI5!gjX$Qgq4C)r>J6JQ5478)W0c$gN+ARVH^q-ahzLWUY#epr90 z6ufY+zb^9ZP_eyEyIG_1ygxVZ)pL91laTjpfPp~R>x#`>zjvuzxEG^ z@YSQPxQ*<6i|s&l-?sl35(j;~69Zp75pxUjGHe!u@HA(Qm^&gE!*vU`PA*-)d?m*r zD7#LtMP$8{^as%qeeQ&eMzJ(`cA{KqR;L@--dQ$gv1gZ@D9<#fYiF9X<;rvoJ55%f zAODPE?<9_MgaoUWilG=1b_AP+x1i1~ZVR%0trS8oM=uGj@}sQO%NYT}4?*l@ElD_6 z4Z~{54oB;0cv7*$#d-|hu;+T!1|LiHL*jQq?rnm($_w`%js=ZWJy5EyXI;H+E%W!u e!E5LZ7{@c&*)&NvyIwY%>};~hZeE(*)h|)Rm%0cRJPde{KEpy0?4dV7ym}F` z1AxKwnh` zKxn`puG~#S7|fPzif6eeoP8B8~|VpiFmNw?Z97JYQF`mk=J zD!%*$MJJ}FwFt&x5}^p;U)a!f9sPNYV{BIG6@ogeb;xgCeVLkdCI$EeH|v!Dxc07N p{l&_8$d9hS%G-4wX8&J-A8vf^*!3h`mVrHfdzp!;4D@a0&o%6p@FeeuB0A0P?vHv`zusExIO z&UskMb>AjqBOds<4=LDG>2j{LO3E=EQ>>zL4$hIrP)FhIHY_T6XHdef`{PMtlhcQgg=b<@i#(hh zse#QcG>4&a*qg&v%y}udBaalKroc4~y?n6v&EUzx0>7!)6Gu^wbm2Vv+SzTCKBnXD zerd_}ZpQNqS*PuOFD=%u)Y9v>df#7VMsJd!^Gf>z3`$H0Sp0`jM+ryz>Cd z6%1DD*wNrQEreTu7=^@B zRm}L(6-d&C?ZqM=zXt30f12fU r?|me3Qvi#|gBfzA#^r$656JrUC3mNMyHSTrWv0RnVrEJB%SQML(dg8a delta 963 zcmZWn&ubGw6rOoIJ3HBI*0iQ=(xj!;RLP;#ABb3lqSjxv2)20WL5sQ&*@&f^cxh+t zK|u=kGzcCOZ(fR?{X>LaL z(xcx)AHxZ%IdJW6&H-Ai#Wj0DZR#-2H0)(Z6HsW!+^1T3)O=l)Bo5m1(eKQZvC~KjP;Zv1MPoIF|+g zpvwmbd;m7rjcgo-!h?{#_DJ)NcC4htv|D1SeCol6)#Fl$cV0`Em6$!{u#3>40lC#8 zA}sDpJ-nS(e|)q-NgKA!T4)Gsw+A{bRa$`=Y>2sJ3&v2p7?Jk0>NuR?SP997!Q1++ zu#5_98mn`x&T<{m)m9F*=DBy8UoaoMGnvOLPolAjW^Kg$@J^U!O*plaYNc}cK0T{)7Y{A98BB}g6#R&`kA0;HMRl05c zmKoTvb9%+zFb{}qFY!wvLh)66JNn$B*ePMIEMK-LVzu8*(b~1igzLALPW%^<;SF$zKKuz(vTK51V~LAvVxk`K?xR0`pQ-m zJNDPP+=iA~wxMpC)x7c3duR{cM^^no!kjxI;6PpQZyI_N z#`*dy$WQ!KC!{Q@+?YaDm6Uqo_I?@rD)kH`4kn|FlN9+gY Cz)h3@ delta 326 zcmYMuF-`+95Cu@r*t-eAPC{4;Bp@^hB@&^{2`FhoZ$+DkW+l+BX}}SM4?wXO*fjJg z6&K(JG&w`=0G^@1BR_rFqtSetcVixm>4 z2y%s-k+byBq#nIoW9(F}6{xe#?y((qpVh2kyKIl`vj^-TfFA>myzhBo54~tIT4Nz* zVkB>G?nX!3qmgOMsys70BF0z=eY9!mYy2aa4xmdpdpjLmM28> diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-310.pyc index 2a99d0cd8cc263239a48bf5038cab1329adc5144..5bc5e7f1bb028d58953fe6a21406c92d3dac983e 100644 GIT binary patch delta 1003 zcmZWoyKmD#7{5E)=SSl{(zH!^MM#y}Fr+LP>F5`{shE7;SDwRq9z&DCNeWI-@L@eqWjV^Ha@uuYF_ zBl(GZhQ<&_ngdi80jG?(|NIhEf&lE%#(7u>gKY{)LvzO&D*Kx`e8qY_=fO61a$dCJnltkq%V zz|3Oo#jSJBa^_EhAfL64s`Bda!h3LJuesPiMAZ+HxS5_d@uQFnAoS7f;I@esHxvDL-t4An(~q?H32KcVf}kkULp80U*w&Jh!LlUTrQI~y#MvpdxFtgL z=phaW9tzomV9$E??BB2_!IOW2Ak;UTsEE6~nfHG0&70qQ`}R%#IB$1s+eGj@Uz~4z z9@ynoj9lc(Ew!yxwNzJHdfTWPsjjxncBYzXTU86A`^eQ?{UvgB5BH_2?HUzSG{0lW zHu!mZ@M(JR_DnfndHA4G?gY%+XLo{H>mc;QB2H`pJC!wOZDVEiQIRCpW7?_v!FGk! zn3q^80Z9_was0q%jzdLastU|#bX;KJgl#Gdd&c!cM*TX!LME`nZ<7x= z%fFG*%|CojLD;{1BGi;d%*4G^w6`eJ3~bck%TftvKX#=_+*1J2K*}KDGPEsCgZuEV zpsj;L0*S~_if}~cQH&3z2nuZ~yM$f>k2=&`D7vYG7!iqOXoT6!K>6@#f@&ITL+mv` zvtx84MJE95MW_eKb1^!UBjOT(wj%7pMUZaNm6pUlHO!}$9LWXf;Va>lV}gZmdgL3~ z&(v`=P<5p_h$7v=7`g+!sXVB1TimKRVPdYhO544)H<$)Y+hsu!@v*VXrVg-!{#UO!+S zxM_lYZfTb{uL62Ye3W~zYVQSMUR=i-Z9a1q|ykguiE#P569n;b;Tj1`# diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-310.pyc index 62b6a92d9856c3492b96d46feaec1799cf1433f1..3ad84d47c30c6640aedc2d1d13d52f13e4663a0c 100644 GIT binary patch delta 2536 zcmZ`*U2Gdg5WZdCozLg<+3`=^{5XI8%O$jw^hf=pG=G$c;#MS~RSH;+_maj<>~!x! z)#74RDH7tT<(`nLHsP&rRFQb)r|G)n9QxZd%i)lHIH?AFaPSijM3?EmaWH;33MKDXTUqU9~J z-q~Oanf8jokxsq`;;S!*@DPCt4@>W|qQ77)w3RxoHyHpG~^RNTiRf_5g;X4?G?2?&sHvktmSUSEw zr@?$^nu5eZrf!nxMF|#!nE|G)&s1xRGh!+PQ(2~OS`=GXtApCGQ2Rcl@dm@p0P~=w z7-W%ViIGLZ=LHXF*pO5-+(^;9O!*z4qsyQVtb7E#Cd{{LDX~Q)4kA)9Q6Xsw1n+=g z5(O)SnT&i)n?Yp`*QA{L?zSZyrEpYCyW5M+VCEYfEw`W<;I!5`#WumutVoTRftyvV z3k^S$ApR=|wmUz#9ng0!VO3~H&L)+Qkt0;LFM~=k>Z%__WA__0H(jQ;2|opr-M5L8 zbawy++N(2Ypc@D7&f>095(q*0DRwXKcK0kn1jPNtQBPw8x4G>GtGiID7w(~?$9o((Z&`3re_4Z{)h9B;*JqvC5|p1( z!S+K~4)UDmuknPpV0M!x&olRjv3zmN8@|{3-aL93lf@5>j18@4kjR!WG8IwBI95PE zG(0jsGBiG#J?+cWw#~f#Q7a`z$f2X$@_G}m9THVa)GJY{u%7q|v!@nkY6Yqm zepK=*f~c?~-n~TH8Wy5+<*PR52XPJ~>4!(h&gRaKW^->1obv-Sw#)mx9~0^Bw2&Si z8JsxH`%xNSbU#=tZ;ln>884kYmJ@Lon&U$A^S7~-pSO80t}$kKd2wO=vD|V-zEYSg zJ2qTz$(aLTH6%(Sgv$uTpm|>NrS??Mpih+Bey~uUUznY<`ElUzlL&7hWDyhqKQM6S4DUorgMBa9 z+`Yzk;Os7h-3a0pz>CH&AT(~Epz!791^~v}LD1fmz}Xl&4!4ft9c+B+A7+@EcpGa? z3upmzA%$M2XoP81^Ui)Vv Sw`ySx-Xeo0A+Gf=9{3l^X&+Gl delta 1908 zcmZuy-EZ7P5cjTqKA-J#e3#2zzQ0JCUQ4P{l#qU?X_`bOsD!jps8k7#nqLg>gO67%*geUq~Ox%+8Hx z=YBl%!{Esvoi-J??hLe)e>trvzvJTQrNQD7JmI}hPX_rb3Nx8?UtyM)-BfQjGCHdi z?ML4|BBDxLNkx1{=Q>%2W$!CD9oEQl@NQsDEDvv&6@c8lb4vY^W~Lz|Q>scySwbXC z{Fdl=tx7;nM#feuGPhB-B*(5QTj_0ufCoe%(?ut4EO}wMRDOS+hh8LJ*S|6vA>u=Y zw~5F4ozykVI1eD!lcNp=0e{ChYTp*Gq$b@7yxFi+3~3Y4=`s>ddu z>}l+D-Y0h5vqfz0I5jytzTfk*)01e&gBELxp2xTjqVO|Cy%!B>@lEDJ4UbGwtsevf z_bP=E=lw`{?mUcuE`TR|0H8Y>F{nmN3MWFfDO`jS^Qoa~MBk%YePyZ#`a>zJQWdSn zQ(be&v`#c)Yc?Dwo4ADT8PuUR95$O|iB1g)&#tL!PaH=l4zZ~NXo3y4fd_)XhIH4_ zO``pyIXmBGzoy;CF#7?7E`Vv?3HYJ090r3UBSU9-x7cVJ9gG9Gi*NB`@N=VlZDw z=OlY#^77mjenMQ!=SZtq%%AgQiDjs)40SLaOO^RmkN2RLy~Km{wbBd6Q=BNT1flmU z@WKj!o{|F!>SN3D;>WNPVlUr2Y(TZOJ^T__FgF1dC?S*$(1eMm!41y;LGkqiS=Ypv zl@mcBsb+XyY!n7+moX*Ey*OD8R@atSJpL+Z_%Omngb9QMK&*~ky~;aqDTgg~4#&Tc zBQ13}XDu*bq!2%wp+E+1eZFFs9NvAD=ue!Kkv1~+Do3Ycj^iH(A4I@1^XtNI{^*TZ p4;Fl{97)oPwv3Gns{vbI@h%eZlJi|_Gb{sYVbdH`r+(+u{{dwki@pE= diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d07ddd42f32f2230313db5c20220620ab336c496 GIT binary patch literal 5881 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 delta 345 zcmZ3(zmK0cpO=@50SKzqC6muh8WJqC1Va}Q8?;y)`izlEcKPfXWJ-8&X zB=r`LZ(?#rW?m|oH?dEA;^9>x%s~AhT&x8oN*GEQYZ#iD7BDSjU}Pv^E@5c~^5a=k z7=R>O4Z{L self.ENOUGH_DATA_THRESHOLD - def get_order(self, byte_str): + def get_order(self, _): # We do not handle characters based on the original encoding string, # but convert this encoding string to a number, here called order. # This allows multiple encodings of a language to share one frequency @@ -112,7 +129,7 @@ class CharDistributionAnalysis(object): class EUCTWDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - super(EUCTWDistributionAnalysis, self).__init__() + super().__init__() self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER self._table_size = EUCTW_TABLE_SIZE self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO @@ -125,13 +142,12 @@ class EUCTWDistributionAnalysis(CharDistributionAnalysis): first_char = byte_str[0] if first_char >= 0xC4: return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 - else: - return -1 + return -1 class EUCKRDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - super(EUCKRDistributionAnalysis, self).__init__() + super().__init__() self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER self._table_size = EUCKR_TABLE_SIZE self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO @@ -144,13 +160,27 @@ class EUCKRDistributionAnalysis(CharDistributionAnalysis): first_char = byte_str[0] if first_char >= 0xB0: return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 - else: - return -1 + return -1 + + +class JOHABDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super().__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + first_char = byte_str[0] + if 0x88 <= first_char < 0xD4: + code = first_char * 256 + byte_str[1] + return JOHAB_TO_EUCKR_ORDER_TABLE.get(code, -1) + return -1 class GB2312DistributionAnalysis(CharDistributionAnalysis): def __init__(self): - super(GB2312DistributionAnalysis, self).__init__() + super().__init__() self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER self._table_size = GB2312_TABLE_SIZE self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO @@ -163,13 +193,12 @@ class GB2312DistributionAnalysis(CharDistributionAnalysis): first_char, second_char = byte_str[0], byte_str[1] if (first_char >= 0xB0) and (second_char >= 0xA1): return 94 * (first_char - 0xB0) + second_char - 0xA1 - else: - return -1 + return -1 class Big5DistributionAnalysis(CharDistributionAnalysis): def __init__(self): - super(Big5DistributionAnalysis, self).__init__() + super().__init__() self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER self._table_size = BIG5_TABLE_SIZE self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO @@ -183,15 +212,13 @@ class Big5DistributionAnalysis(CharDistributionAnalysis): if first_char >= 0xA4: if second_char >= 0xA1: return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 + return 157 * (first_char - 0xA4) + second_char - 0x40 + return -1 class SJISDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - super(SJISDistributionAnalysis, self).__init__() + super().__init__() self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER self._table_size = JIS_TABLE_SIZE self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO @@ -202,9 +229,9 @@ class SJISDistributionAnalysis(CharDistributionAnalysis): # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe # no validation needed here. State machine has done that first_char, second_char = byte_str[0], byte_str[1] - if (first_char >= 0x81) and (first_char <= 0x9F): + if 0x81 <= first_char <= 0x9F: order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): + elif 0xE0 <= first_char <= 0xEF: order = 188 * (first_char - 0xE0 + 31) else: return -1 @@ -216,7 +243,7 @@ class SJISDistributionAnalysis(CharDistributionAnalysis): class EUCJPDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - super(EUCJPDistributionAnalysis, self).__init__() + super().__init__() self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER self._table_size = JIS_TABLE_SIZE self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO @@ -228,6 +255,5 @@ class EUCJPDistributionAnalysis(CharDistributionAnalysis): # no validation needed here. State machine has done that char = byte_str[0] if char >= 0xA0: - return 94 * (char - 0xA1) + byte_str[1] - 0xa1 - else: - return -1 + return 94 * (char - 0xA1) + byte_str[1] - 0xA1 + return -1 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py index 5812cef..778ff33 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -25,19 +25,19 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .enums import ProbingState from .charsetprober import CharSetProber +from .enums import ProbingState class CharSetGroupProber(CharSetProber): def __init__(self, lang_filter=None): - super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + super().__init__(lang_filter=lang_filter) self._active_num = 0 self.probers = [] self._best_guess_prober = None def reset(self): - super(CharSetGroupProber, self).reset() + super().reset() self._active_num = 0 for prober in self.probers: if prober: @@ -75,7 +75,7 @@ class CharSetGroupProber(CharSetProber): self._best_guess_prober = prober self._state = ProbingState.FOUND_IT return self.state - elif state == ProbingState.NOT_ME: + if state == ProbingState.NOT_ME: prober.active = False self._active_num -= 1 if self._active_num <= 0: @@ -87,7 +87,7 @@ class CharSetGroupProber(CharSetProber): state = self.state if state == ProbingState.FOUND_IT: return 0.99 - elif state == ProbingState.NOT_ME: + if state == ProbingState.NOT_ME: return 0.01 best_conf = 0.0 self._best_guess_prober = None @@ -95,10 +95,12 @@ class CharSetGroupProber(CharSetProber): if not prober: continue if not prober.active: - self.logger.debug('%s not active', prober.charset_name) + self.logger.debug("%s not active", prober.charset_name) continue conf = prober.get_confidence() - self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + self.logger.debug( + "%s %s confidence = %s", prober.charset_name, prober.language, conf + ) if best_conf < conf: best_conf = conf self._best_guess_prober = prober diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetprober.py index eac4e59..9f1afd9 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetprober.py @@ -31,8 +31,12 @@ import re from .enums import ProbingState +INTERNATIONAL_WORDS_PATTERN = re.compile( + b"[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?" +) -class CharSetProber(object): + +class CharSetProber: SHORTCUT_THRESHOLD = 0.95 @@ -48,8 +52,8 @@ class CharSetProber(object): def charset_name(self): return None - def feed(self, buf): - pass + def feed(self, byte_str): + raise NotImplementedError @property def state(self): @@ -60,7 +64,7 @@ class CharSetProber(object): @staticmethod def filter_high_byte_only(buf): - buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + buf = re.sub(b"([\x00-\x7F])+", b" ", buf) return buf @staticmethod @@ -70,12 +74,10 @@ class CharSetProber(object): alphabet: english alphabets [a-zA-Z] international: international characters [\x80-\xFF] marker: everything else [^a-zA-Z\x80-\xFF] - The input buffer can be thought to contain a series of words delimited by markers. This function works to filter all words that contain at least one international character. All contiguous sequences of markers are replaced by a single space ascii character. - This filter applies to all scripts which do not use English characters. """ filtered = bytearray() @@ -83,8 +85,7 @@ class CharSetProber(object): # This regex expression filters out only words that have at-least one # international character. The word may include one marker character at # the end. - words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', - buf) + words = INTERNATIONAL_WORDS_PATTERN.findall(buf) for word in words: filtered.extend(word[:-1]) @@ -94,20 +95,17 @@ class CharSetProber(object): # similarly across all languages and may thus have similar # frequencies). last_char = word[-1:] - if not last_char.isalpha() and last_char < b'\x80': - last_char = b' ' + if not last_char.isalpha() and last_char < b"\x80": + last_char = b" " filtered.extend(last_char) return filtered @staticmethod - def filter_with_english_letters(buf): + def remove_xml_tags(buf): """ Returns a copy of ``buf`` that retains only the sequences of English alphabet and high byte characters that are not between <> characters. - Also retains English alphabet and high byte characters immediately - before occurrences of >. - This filter can be applied to all scripts which contain both English characters and extended ASCII characters, but is currently only used by ``Latin1Prober``. @@ -115,26 +113,21 @@ class CharSetProber(object): filtered = bytearray() in_tag = False prev = 0 + buf = memoryview(buf).cast("c") - for curr in range(len(buf)): - # Slice here to get bytes instead of an int with Python 3 - buf_char = buf[curr:curr + 1] - # Check if we're coming out of or entering an HTML tag - if buf_char == b'>': + for curr, buf_char in enumerate(buf): + # Check if we're coming out of or entering an XML tag + if buf_char == b">": + prev = curr + 1 in_tag = False - elif buf_char == b'<': - in_tag = True - - # If current character is not extended-ASCII and not alphabetic... - if buf_char < b'\x80' and not buf_char.isalpha(): - # ...and we're not in a tag + elif buf_char == b"<": if curr > prev and not in_tag: # Keep everything after last non-extended-ASCII, # non-alphabetic character filtered.extend(buf[prev:curr]) # Output a space to delimit stretch we kept - filtered.extend(b' ') - prev = curr + 1 + filtered.extend(b" ") + in_tag = True # If we're not in a tag... if not in_tag: diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py index 8b13789..e69de29 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py @@ -1 +0,0 @@ - diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-310.pyc index 7f3ebbff435b097ff433256cac6eceb9efb0cc36..86696c949248e8ba64fafc56a012b770a3554fc4 100644 GIT binary patch delta 21 bcmX@Yc!ZHRpO=@50SHPD%O^8TTyl^&oiE{sb@nhMarx zcPj7eGfy8QlcYr?NZN-MlyBOi(vYlg3|NZ+L2UNT0dH}{j*ew4Up_5BbL|Jk6&~bO-`@^Z8YQvsXE*3FY-Eq<>f(q=m?mmz1V`9* z$q*Tc*fcpJ$L2aIYvwUM`%W3GiZE^`GK#yqbj96mxUV9;;kJ{w6G^OuZf;+Z-Rg=P zC$0+9VPAV(v22og*%q4?4!ZhGR3rPqUe8S;NvAMyTYvx?I4+_Wf^uXt$kjx4*SraD zvM1);^Pbt`U69tH323cHr6_JfTWFTb>Y-6&PsE6v!X6#bUgZIK*4#5j#)*AO)UvKh zN3)(IYljqwuIkzdYrXmbJpdqE-r2eN3$9n@7dBPW^-|ZPIS<+z?@i5QKdrAYmVFd= z_H!fMNtKD7bN*u3>4Zud1+g~+m4<$xx~XcG)hG?L-pS2P6~#K|sg|f!6IfGq3?9oF zs<(4qcB+!4IdoK`kd$G(7{mra6fYr47YW%XtU`fbFh+rbpm>1)VZy3?7bym;`SIePT!U(jby9=zlhl=W4|kb^e#uiyKh^mRG9K_I=B4dS z1fsE7+R3^>7ww+pvi&6lJ=vE+cF^jpE!n+K^joTb=HLqYar63H(KYz#>jU`6r}b8J zuPoAqQDKtJ3vKHDTqn5+CyP8bNs-rsMV`ckRAHJJrK7aG<3rsE!(*jOjE5n*^zJ7& zs$bz299K`^-P?xg!zHX+hOgTjY-U4NuyiFEI{KERYq9*-L(UyK8(WrV*$q63i3=aH zWSSRR)m-Ixa*|IU4o_CMM<=V%=ZQHQ#YH|zB*qj{wRrA6?Ac{`G197Bq{i>)R`osg zU)Kz^u9;M}kD8Vb%6fOI%p^$_+D2v1&Z*g?&{vLU9{SsC2NzJ0>{`AY$o2{SWQuRmc#%qlbdK>%D9HD0S7L$q6ddD)J zWyCzvr3xcGE%nvveZGIXZ(}ba_-^eYe_XR>jc&ZMhKaW7JcT{Ghnq!7{svm*D+q3z z0J~t6fFRqz{^A}-Ul2h!YUfh+_qOXk(Kl@-4?~-4XR0aChdZbKpl*esEaEV%MTm20 z7Fva&CYYe91=qr%1>0Hh!aSLeaXfQb=y7}$X{k)pT(I{)k#SsP^T<3Mk%Rv(xNpYz z1K44YQrt+zrqH@&4{L;ZR(2j`wy5VyG*%-Ae KuJCID$LAj#5f;?| diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py index 6d6f93a..7926fa3 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -12,17 +12,15 @@ If no paths are provided, it takes its input from stdin. """ -from __future__ import absolute_import, print_function, unicode_literals import argparse import sys -from pip._vendor.chardet import __version__ -from pip._vendor.chardet.compat import PY2 -from pip._vendor.chardet.universaldetector import UniversalDetector +from .. import __version__ +from ..universaldetector import UniversalDetector -def description_of(lines, name='stdin'): +def description_of(lines, name="stdin"): """ Return a string describing the probable encoding of a file or list of strings. @@ -41,13 +39,9 @@ def description_of(lines, name='stdin'): break u.close() result = u.result - if PY2: - name = name.decode(sys.getfilesystemencoding(), 'ignore') - if result['encoding']: - return '{}: {} with confidence {}'.format(name, result['encoding'], - result['confidence']) - else: - return '{}: no result'.format(name) + if result["encoding"]: + return f'{name}: {result["encoding"]} with confidence {result["confidence"]}' + return f"{name}: no result" def main(argv=None): @@ -61,24 +55,32 @@ def main(argv=None): # Get command line arguments parser = argparse.ArgumentParser( description="Takes one or more file paths and reports their detected \ - encodings") - parser.add_argument('input', - help='File whose encoding we would like to determine. \ - (default: stdin)', - type=argparse.FileType('rb'), nargs='*', - default=[sys.stdin if PY2 else sys.stdin.buffer]) - parser.add_argument('--version', action='version', - version='%(prog)s {}'.format(__version__)) + encodings" + ) + parser.add_argument( + "input", + help="File whose encoding we would like to determine. \ + (default: stdin)", + type=argparse.FileType("rb"), + nargs="*", + default=[sys.stdin.buffer], + ) + parser.add_argument( + "--version", action="version", version=f"%(prog)s {__version__}" + ) args = parser.parse_args(argv) for f in args.input: if f.isatty(): - print("You are running chardetect interactively. Press " + - "CTRL-D twice at the start of a blank line to signal the " + - "end of your input. If you want help, run chardetect " + - "--help\n", file=sys.stderr) + print( + "You are running chardetect interactively. Press " + "CTRL-D twice at the start of a blank line to signal the " + "end of your input. If you want help, run chardetect " + "--help\n", + file=sys.stderr, + ) print(description_of(f, f.name)) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py index 68fba44..d3e3e82 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py @@ -30,7 +30,7 @@ import logging from .enums import MachineState -class CodingStateMachine(object): +class CodingStateMachine: """ A state machine to verify a byte sequence for a particular encoding. For each byte the detector receives, it will feed that byte to every active @@ -52,6 +52,7 @@ class CodingStateMachine(object): negative answer for this encoding. Detector will exclude this encoding from consideration from here on. """ + def __init__(self, sm): self._model = sm self._curr_byte_pos = 0 @@ -66,14 +67,13 @@ class CodingStateMachine(object): def next_state(self, c): # for each byte we get its class # if it is first byte, we also get byte length - byte_class = self._model['class_table'][c] + byte_class = self._model["class_table"][c] if self._curr_state == MachineState.START: self._curr_byte_pos = 0 - self._curr_char_len = self._model['char_len_table'][byte_class] + self._curr_char_len = self._model["char_len_table"][byte_class] # from byte's class and state_table, we get its next state - curr_state = (self._curr_state * self._model['class_factor'] - + byte_class) - self._curr_state = self._model['state_table'][curr_state] + curr_state = self._curr_state * self._model["class_factor"] + byte_class + self._curr_state = self._model["state_table"][curr_state] self._curr_byte_pos += 1 return self._curr_state @@ -81,8 +81,8 @@ class CodingStateMachine(object): return self._curr_char_len def get_coding_state_machine(self): - return self._model['name'] + return self._model["name"] @property def language(self): - return self._model['language'] + return self._model["language"] diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cp949prober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cp949prober.py index efd793a..28a1f3d 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cp949prober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/cp949prober.py @@ -33,7 +33,7 @@ from .mbcssm import CP949_SM_MODEL class CP949Prober(MultiByteCharSetProber): def __init__(self): - super(CP949Prober, self).__init__() + super().__init__() self.coding_sm = CodingStateMachine(CP949_SM_MODEL) # NOTE: CP949 is a superset of EUC-KR, so the distribution should be # not different. diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/enums.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/enums.py index 0451207..32a77e7 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/enums.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/enums.py @@ -5,20 +5,22 @@ All of the Enums that are used throughout the chardet package. """ -class InputState(object): +class InputState: """ This enum represents the different states a universal detector can be in. """ + PURE_ASCII = 0 ESC_ASCII = 1 HIGH_BYTE = 2 -class LanguageFilter(object): +class LanguageFilter: """ This enum represents the different language filters we can apply to a ``UniversalDetector``. """ + CHINESE_SIMPLIFIED = 0x01 CHINESE_TRADITIONAL = 0x02 JAPANESE = 0x04 @@ -29,28 +31,31 @@ class LanguageFilter(object): CJK = CHINESE | JAPANESE | KOREAN -class ProbingState(object): +class ProbingState: """ This enum represents the different states a prober can be in. """ + DETECTING = 0 FOUND_IT = 1 NOT_ME = 2 -class MachineState(object): +class MachineState: """ This enum represents the different states a state machine can be in. """ + START = 0 ERROR = 1 ITS_ME = 2 -class SequenceLikelihood(object): +class SequenceLikelihood: """ This enum represents the likelihood of a character following the previous one. """ + NEGATIVE = 0 UNLIKELY = 1 LIKELY = 2 @@ -62,13 +67,14 @@ class SequenceLikelihood(object): return 4 -class CharacterCategory(object): +class CharacterCategory: """ This enum represents the different categories language models for ``SingleByteCharsetProber`` put characters into. Anything less than CONTROL is considered a letter. """ + UNDEFINED = 255 LINE_BREAK = 254 SYMBOL = 253 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/escprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/escprober.py index c70493f..d992611 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/escprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/escprober.py @@ -27,9 +27,13 @@ from .charsetprober import CharSetProber from .codingstatemachine import CodingStateMachine -from .enums import LanguageFilter, ProbingState, MachineState -from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, - ISO2022KR_SM_MODEL) +from .enums import LanguageFilter, MachineState, ProbingState +from .escsm import ( + HZ_SM_MODEL, + ISO2022CN_SM_MODEL, + ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL, +) class EscCharSetProber(CharSetProber): @@ -40,7 +44,7 @@ class EscCharSetProber(CharSetProber): """ def __init__(self, lang_filter=None): - super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + super().__init__(lang_filter=lang_filter) self.coding_sm = [] if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) @@ -56,7 +60,7 @@ class EscCharSetProber(CharSetProber): self.reset() def reset(self): - super(EscCharSetProber, self).reset() + super().reset() for coding_sm in self.coding_sm: if not coding_sm: continue @@ -75,10 +79,7 @@ class EscCharSetProber(CharSetProber): return self._detected_language def get_confidence(self): - if self._detected_charset: - return 0.99 - else: - return 0.00 + return 0.99 if self._detected_charset else 0.00 def feed(self, byte_str): for c in byte_str: diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/escsm.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/escsm.py index 0069523..3aa0f4d 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/escsm.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/escsm.py @@ -12,7 +12,7 @@ # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. +# version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -20,227 +20,241 @@ # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .enums import MachineState +# fmt: off HZ_CLS = ( -1,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,0,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,4,0,5,2,0, # 78 - 7f -1,1,1,1,1,1,1,1, # 80 - 87 -1,1,1,1,1,1,1,1, # 88 - 8f -1,1,1,1,1,1,1,1, # 90 - 97 -1,1,1,1,1,1,1,1, # 98 - 9f -1,1,1,1,1,1,1,1, # a0 - a7 -1,1,1,1,1,1,1,1, # a8 - af -1,1,1,1,1,1,1,1, # b0 - b7 -1,1,1,1,1,1,1,1, # b8 - bf -1,1,1,1,1,1,1,1, # c0 - c7 -1,1,1,1,1,1,1,1, # c8 - cf -1,1,1,1,1,1,1,1, # d0 - d7 -1,1,1,1,1,1,1,1, # d8 - df -1,1,1,1,1,1,1,1, # e0 - e7 -1,1,1,1,1,1,1,1, # e8 - ef -1,1,1,1,1,1,1,1, # f0 - f7 -1,1,1,1,1,1,1,1, # f8 - ff + 1, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 + 0, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 4, 0, 5, 2, 0, # 78 - 7f + 1, 1, 1, 1, 1, 1, 1, 1, # 80 - 87 + 1, 1, 1, 1, 1, 1, 1, 1, # 88 - 8f + 1, 1, 1, 1, 1, 1, 1, 1, # 90 - 97 + 1, 1, 1, 1, 1, 1, 1, 1, # 98 - 9f + 1, 1, 1, 1, 1, 1, 1, 1, # a0 - a7 + 1, 1, 1, 1, 1, 1, 1, 1, # a8 - af + 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7 + 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf + 1, 1, 1, 1, 1, 1, 1, 1, # c0 - c7 + 1, 1, 1, 1, 1, 1, 1, 1, # c8 - cf + 1, 1, 1, 1, 1, 1, 1, 1, # d0 - d7 + 1, 1, 1, 1, 1, 1, 1, 1, # d8 - df + 1, 1, 1, 1, 1, 1, 1, 1, # e0 - e7 + 1, 1, 1, 1, 1, 1, 1, 1, # e8 - ef + 1, 1, 1, 1, 1, 1, 1, 1, # f0 - f7 + 1, 1, 1, 1, 1, 1, 1, 1, # f8 - ff ) HZ_ST = ( -MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 - 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f - 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 - 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +MachineState.START, MachineState.ERROR, 3, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07 +MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f +MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.START, MachineState.START, 4, MachineState.ERROR, # 10-17 + 5, MachineState.ERROR, 6, MachineState.ERROR, 5, 5, 4, MachineState.ERROR, # 18-1f + 4, MachineState.ERROR, 4, 4, 4, MachineState.ERROR, 4, MachineState.ERROR, # 20-27 + 4, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 28-2f ) +# fmt: on HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) -HZ_SM_MODEL = {'class_table': HZ_CLS, - 'class_factor': 6, - 'state_table': HZ_ST, - 'char_len_table': HZ_CHAR_LEN_TABLE, - 'name': "HZ-GB-2312", - 'language': 'Chinese'} +HZ_SM_MODEL = { + "class_table": HZ_CLS, + "class_factor": 6, + "state_table": HZ_ST, + "char_len_table": HZ_CHAR_LEN_TABLE, + "name": "HZ-GB-2312", + "language": "Chinese", +} +# fmt: off ISO2022CN_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,3,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,4,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff + 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 + 0, 3, 0, 0, 0, 0, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 4, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 + 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f + 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 + 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f + 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 + 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef + 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 + 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff ) ISO2022CN_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 -MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f -MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 - 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f + MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07 + MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f + MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17 + MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, # 18-1f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 20-27 + 5, 6, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 28-2f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 30-37 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, # 38-3f ) +# fmt: on ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) -ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, - 'class_factor': 9, - 'state_table': ISO2022CN_ST, - 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, - 'name': "ISO-2022-CN", - 'language': 'Chinese'} +ISO2022CN_SM_MODEL = { + "class_table": ISO2022CN_CLS, + "class_factor": 9, + "state_table": ISO2022CN_ST, + "char_len_table": ISO2022CN_CHAR_LEN_TABLE, + "name": "ISO-2022-CN", + "language": "Chinese", +} +# fmt: off ISO2022JP_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,2,2, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,7,0,0,0, # 20 - 27 -3,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -6,0,4,0,8,0,0,0, # 40 - 47 -0,9,5,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff + 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 0, 0, 0, 0, 2, 2, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 7, 0, 0, 0, # 20 - 27 + 3, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 6, 0, 4, 0, 8, 0, 0, 0, # 40 - 47 + 0, 9, 5, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 + 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f + 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 + 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f + 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 + 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef + 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 + 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff ) ISO2022JP_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 -MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f -MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 + MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07 + MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17 + MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, # 18-1f + MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 20-27 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 6, MachineState.ITS_ME, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, # 28-2f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, # 30-37 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 38-3f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, MachineState.START, # 40-47 ) +# fmt: on ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) -ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, - 'class_factor': 10, - 'state_table': ISO2022JP_ST, - 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, - 'name': "ISO-2022-JP", - 'language': 'Japanese'} +ISO2022JP_SM_MODEL = { + "class_table": ISO2022JP_CLS, + "class_factor": 10, + "state_table": ISO2022JP_ST, + "char_len_table": ISO2022JP_CHAR_LEN_TABLE, + "name": "ISO-2022-JP", + "language": "Japanese", +} +# fmt: off ISO2022KR_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,3,0,0,0, # 20 - 27 -0,4,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,5,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff + 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 3, 0, 0, 0, # 20 - 27 + 0, 4, 0, 0, 0, 0, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 5, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87 + 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f + 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97 + 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f + 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 + 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef + 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 + 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff ) ISO2022KR_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 + MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f + MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 10-17 + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 18-1f + MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 20-27 ) +# fmt: on ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) -ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, - 'class_factor': 6, - 'state_table': ISO2022KR_ST, - 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, - 'name': "ISO-2022-KR", - 'language': 'Korean'} - - +ISO2022KR_SM_MODEL = { + "class_table": ISO2022KR_CLS, + "class_factor": 6, + "state_table": ISO2022KR_ST, + "char_len_table": ISO2022KR_CHAR_LEN_TABLE, + "name": "ISO-2022-KR", + "language": "Korean", +} diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py index 20ce8f7..abf2e66 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -25,24 +25,24 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .enums import ProbingState, MachineState -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine from .chardistribution import EUCJPDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .enums import MachineState, ProbingState from .jpcntx import EUCJPContextAnalysis +from .mbcharsetprober import MultiByteCharSetProber from .mbcssm import EUCJP_SM_MODEL class EUCJPProber(MultiByteCharSetProber): def __init__(self): - super(EUCJPProber, self).__init__() + super().__init__() self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) self.distribution_analyzer = EUCJPDistributionAnalysis() self.context_analyzer = EUCJPContextAnalysis() self.reset() def reset(self): - super(EUCJPProber, self).reset() + super().reset() self.context_analyzer.reset() @property @@ -54,34 +54,37 @@ class EUCJPProber(MultiByteCharSetProber): return "Japanese" def feed(self, byte_str): - for i in range(len(byte_str)): - # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte - coding_state = self.coding_sm.next_state(byte_str[i]) + for i, byte in enumerate(byte_str): + # PY3K: byte_str is a byte array, so byte is an int, not a byte + coding_state = self.coding_sm.next_state(byte) if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) + self.logger.debug( + "%s %s prober hit error at byte %s", + self.charset_name, + self.language, + i, + ) self._state = ProbingState.NOT_ME break - elif coding_state == MachineState.ITS_ME: + if coding_state == MachineState.ITS_ME: self._state = ProbingState.FOUND_IT break - elif coding_state == MachineState.START: + if coding_state == MachineState.START: char_len = self.coding_sm.get_current_charlen() if i == 0: - self._last_char[1] = byte_str[0] + self._last_char[1] = byte self.context_analyzer.feed(self._last_char, char_len) self.distribution_analyzer.feed(self._last_char, char_len) else: - self.context_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) + self.context_analyzer.feed(byte_str[i - 1 : i + 1], char_len) + self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) self._last_char[0] = byte_str[-1] if self.state == ProbingState.DETECTING: - if (self.context_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + if self.context_analyzer.got_enough_data() and ( + self.get_confidence() > self.SHORTCUT_THRESHOLD + ): self._state = ProbingState.FOUND_IT return self.state diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py index b68078c..7dc3b10 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -43,6 +43,7 @@ EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 EUCKR_TABLE_SIZE = 2352 # Char to FreqOrder table , +# fmt: off EUCKR_CHAR_TO_FREQ_ORDER = ( 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, 1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, @@ -192,4 +193,4 @@ EUCKR_CHAR_TO_FREQ_ORDER = ( 2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 ) - +# fmt: on diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrprober.py index 345a060..154a6d2 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrprober.py @@ -25,15 +25,15 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber from .mbcssm import EUCKR_SM_MODEL class EUCKRProber(MultiByteCharSetProber): def __init__(self): - super(EUCKRProber, self).__init__() + super().__init__() self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) self.distribution_analyzer = EUCKRDistributionAnalysis() self.reset() diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py index ed7a995..4900ccc 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py @@ -43,345 +43,346 @@ EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 -# Char to FreqOrder table , +# Char to FreqOrder table EUCTW_TABLE_SIZE = 5376 +# fmt: off EUCTW_CHAR_TO_FREQ_ORDER = ( - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 + 1, 1800, 1506, 255, 1431, 198, 9, 82, 6, 7310, 177, 202, 3615, 1256, 2808, 110, # 2742 + 3735, 33, 3241, 261, 76, 44, 2113, 16, 2931, 2184, 1176, 659, 3868, 26, 3404, 2643, # 2758 + 1198, 3869, 3313, 4060, 410, 2211, 302, 590, 361, 1963, 8, 204, 58, 4296, 7311, 1931, # 2774 + 63, 7312, 7313, 317, 1614, 75, 222, 159, 4061, 2412, 1480, 7314, 3500, 3068, 224, 2809, # 2790 + 3616, 3, 10, 3870, 1471, 29, 2774, 1135, 2852, 1939, 873, 130, 3242, 1123, 312, 7315, # 2806 + 4297, 2051, 507, 252, 682, 7316, 142, 1914, 124, 206, 2932, 34, 3501, 3173, 64, 604, # 2822 + 7317, 2494, 1976, 1977, 155, 1990, 645, 641, 1606, 7318, 3405, 337, 72, 406, 7319, 80, # 2838 + 630, 238, 3174, 1509, 263, 939, 1092, 2644, 756, 1440, 1094, 3406, 449, 69, 2969, 591, # 2854 + 179, 2095, 471, 115, 2034, 1843, 60, 50, 2970, 134, 806, 1868, 734, 2035, 3407, 180, # 2870 + 995, 1607, 156, 537, 2893, 688, 7320, 319, 1305, 779, 2144, 514, 2374, 298, 4298, 359, # 2886 + 2495, 90, 2707, 1338, 663, 11, 906, 1099, 2545, 20, 2436, 182, 532, 1716, 7321, 732, # 2902 + 1376, 4062, 1311, 1420, 3175, 25, 2312, 1056, 113, 399, 382, 1949, 242, 3408, 2467, 529, # 2918 + 3243, 475, 1447, 3617, 7322, 117, 21, 656, 810, 1297, 2295, 2329, 3502, 7323, 126, 4063, # 2934 + 706, 456, 150, 613, 4299, 71, 1118, 2036, 4064, 145, 3069, 85, 835, 486, 2114, 1246, # 2950 + 1426, 428, 727, 1285, 1015, 800, 106, 623, 303, 1281, 7324, 2127, 2354, 347, 3736, 221, # 2966 + 3503, 3110, 7325, 1955, 1153, 4065, 83, 296, 1199, 3070, 192, 624, 93, 7326, 822, 1897, # 2982 + 2810, 3111, 795, 2064, 991, 1554, 1542, 1592, 27, 43, 2853, 859, 139, 1456, 860, 4300, # 2998 + 437, 712, 3871, 164, 2392, 3112, 695, 211, 3017, 2096, 195, 3872, 1608, 3504, 3505, 3618, # 3014 + 3873, 234, 811, 2971, 2097, 3874, 2229, 1441, 3506, 1615, 2375, 668, 2076, 1638, 305, 228, # 3030 + 1664, 4301, 467, 415, 7327, 262, 2098, 1593, 239, 108, 300, 200, 1033, 512, 1247, 2077, # 3046 + 7328, 7329, 2173, 3176, 3619, 2673, 593, 845, 1062, 3244, 88, 1723, 2037, 3875, 1950, 212, # 3062 + 266, 152, 149, 468, 1898, 4066, 4302, 77, 187, 7330, 3018, 37, 5, 2972, 7331, 3876, # 3078 + 7332, 7333, 39, 2517, 4303, 2894, 3177, 2078, 55, 148, 74, 4304, 545, 483, 1474, 1029, # 3094 + 1665, 217, 1869, 1531, 3113, 1104, 2645, 4067, 24, 172, 3507, 900, 3877, 3508, 3509, 4305, # 3110 + 32, 1408, 2811, 1312, 329, 487, 2355, 2247, 2708, 784, 2674, 4, 3019, 3314, 1427, 1788, # 3126 + 188, 109, 499, 7334, 3620, 1717, 1789, 888, 1217, 3020, 4306, 7335, 3510, 7336, 3315, 1520, # 3142 + 3621, 3878, 196, 1034, 775, 7337, 7338, 929, 1815, 249, 439, 38, 7339, 1063, 7340, 794, # 3158 + 3879, 1435, 2296, 46, 178, 3245, 2065, 7341, 2376, 7342, 214, 1709, 4307, 804, 35, 707, # 3174 + 324, 3622, 1601, 2546, 140, 459, 4068, 7343, 7344, 1365, 839, 272, 978, 2257, 2572, 3409, # 3190 + 2128, 1363, 3623, 1423, 697, 100, 3071, 48, 70, 1231, 495, 3114, 2193, 7345, 1294, 7346, # 3206 + 2079, 462, 586, 1042, 3246, 853, 256, 988, 185, 2377, 3410, 1698, 434, 1084, 7347, 3411, # 3222 + 314, 2615, 2775, 4308, 2330, 2331, 569, 2280, 637, 1816, 2518, 757, 1162, 1878, 1616, 3412, # 3238 + 287, 1577, 2115, 768, 4309, 1671, 2854, 3511, 2519, 1321, 3737, 909, 2413, 7348, 4069, 933, # 3254 + 3738, 7349, 2052, 2356, 1222, 4310, 765, 2414, 1322, 786, 4311, 7350, 1919, 1462, 1677, 2895, # 3270 + 1699, 7351, 4312, 1424, 2437, 3115, 3624, 2590, 3316, 1774, 1940, 3413, 3880, 4070, 309, 1369, # 3286 + 1130, 2812, 364, 2230, 1653, 1299, 3881, 3512, 3882, 3883, 2646, 525, 1085, 3021, 902, 2000, # 3302 + 1475, 964, 4313, 421, 1844, 1415, 1057, 2281, 940, 1364, 3116, 376, 4314, 4315, 1381, 7, # 3318 + 2520, 983, 2378, 336, 1710, 2675, 1845, 321, 3414, 559, 1131, 3022, 2742, 1808, 1132, 1313, # 3334 + 265, 1481, 1857, 7352, 352, 1203, 2813, 3247, 167, 1089, 420, 2814, 776, 792, 1724, 3513, # 3350 + 4071, 2438, 3248, 7353, 4072, 7354, 446, 229, 333, 2743, 901, 3739, 1200, 1557, 4316, 2647, # 3366 + 1920, 395, 2744, 2676, 3740, 4073, 1835, 125, 916, 3178, 2616, 4317, 7355, 7356, 3741, 7357, # 3382 + 7358, 7359, 4318, 3117, 3625, 1133, 2547, 1757, 3415, 1510, 2313, 1409, 3514, 7360, 2145, 438, # 3398 + 2591, 2896, 2379, 3317, 1068, 958, 3023, 461, 311, 2855, 2677, 4074, 1915, 3179, 4075, 1978, # 3414 + 383, 750, 2745, 2617, 4076, 274, 539, 385, 1278, 1442, 7361, 1154, 1964, 384, 561, 210, # 3430 + 98, 1295, 2548, 3515, 7362, 1711, 2415, 1482, 3416, 3884, 2897, 1257, 129, 7363, 3742, 642, # 3446 + 523, 2776, 2777, 2648, 7364, 141, 2231, 1333, 68, 176, 441, 876, 907, 4077, 603, 2592, # 3462 + 710, 171, 3417, 404, 549, 18, 3118, 2393, 1410, 3626, 1666, 7365, 3516, 4319, 2898, 4320, # 3478 + 7366, 2973, 368, 7367, 146, 366, 99, 871, 3627, 1543, 748, 807, 1586, 1185, 22, 2258, # 3494 + 379, 3743, 3180, 7368, 3181, 505, 1941, 2618, 1991, 1382, 2314, 7369, 380, 2357, 218, 702, # 3510 + 1817, 1248, 3418, 3024, 3517, 3318, 3249, 7370, 2974, 3628, 930, 3250, 3744, 7371, 59, 7372, # 3526 + 585, 601, 4078, 497, 3419, 1112, 1314, 4321, 1801, 7373, 1223, 1472, 2174, 7374, 749, 1836, # 3542 + 690, 1899, 3745, 1772, 3885, 1476, 429, 1043, 1790, 2232, 2116, 917, 4079, 447, 1086, 1629, # 3558 + 7375, 556, 7376, 7377, 2020, 1654, 844, 1090, 105, 550, 966, 1758, 2815, 1008, 1782, 686, # 3574 + 1095, 7378, 2282, 793, 1602, 7379, 3518, 2593, 4322, 4080, 2933, 2297, 4323, 3746, 980, 2496, # 3590 + 544, 353, 527, 4324, 908, 2678, 2899, 7380, 381, 2619, 1942, 1348, 7381, 1341, 1252, 560, # 3606 + 3072, 7382, 3420, 2856, 7383, 2053, 973, 886, 2080, 143, 4325, 7384, 7385, 157, 3886, 496, # 3622 + 4081, 57, 840, 540, 2038, 4326, 4327, 3421, 2117, 1445, 970, 2259, 1748, 1965, 2081, 4082, # 3638 + 3119, 1234, 1775, 3251, 2816, 3629, 773, 1206, 2129, 1066, 2039, 1326, 3887, 1738, 1725, 4083, # 3654 + 279, 3120, 51, 1544, 2594, 423, 1578, 2130, 2066, 173, 4328, 1879, 7386, 7387, 1583, 264, # 3670 + 610, 3630, 4329, 2439, 280, 154, 7388, 7389, 7390, 1739, 338, 1282, 3073, 693, 2857, 1411, # 3686 + 1074, 3747, 2440, 7391, 4330, 7392, 7393, 1240, 952, 2394, 7394, 2900, 1538, 2679, 685, 1483, # 3702 + 4084, 2468, 1436, 953, 4085, 2054, 4331, 671, 2395, 79, 4086, 2441, 3252, 608, 567, 2680, # 3718 + 3422, 4087, 4088, 1691, 393, 1261, 1791, 2396, 7395, 4332, 7396, 7397, 7398, 7399, 1383, 1672, # 3734 + 3748, 3182, 1464, 522, 1119, 661, 1150, 216, 675, 4333, 3888, 1432, 3519, 609, 4334, 2681, # 3750 + 2397, 7400, 7401, 7402, 4089, 3025, 0, 7403, 2469, 315, 231, 2442, 301, 3319, 4335, 2380, # 3766 + 7404, 233, 4090, 3631, 1818, 4336, 4337, 7405, 96, 1776, 1315, 2082, 7406, 257, 7407, 1809, # 3782 + 3632, 2709, 1139, 1819, 4091, 2021, 1124, 2163, 2778, 1777, 2649, 7408, 3074, 363, 1655, 3183, # 3798 + 7409, 2975, 7410, 7411, 7412, 3889, 1567, 3890, 718, 103, 3184, 849, 1443, 341, 3320, 2934, # 3814 + 1484, 7413, 1712, 127, 67, 339, 4092, 2398, 679, 1412, 821, 7414, 7415, 834, 738, 351, # 3830 + 2976, 2146, 846, 235, 1497, 1880, 418, 1992, 3749, 2710, 186, 1100, 2147, 2746, 3520, 1545, # 3846 + 1355, 2935, 2858, 1377, 583, 3891, 4093, 2573, 2977, 7416, 1298, 3633, 1078, 2549, 3634, 2358, # 3862 + 78, 3750, 3751, 267, 1289, 2099, 2001, 1594, 4094, 348, 369, 1274, 2194, 2175, 1837, 4338, # 3878 + 1820, 2817, 3635, 2747, 2283, 2002, 4339, 2936, 2748, 144, 3321, 882, 4340, 3892, 2749, 3423, # 3894 + 4341, 2901, 7417, 4095, 1726, 320, 7418, 3893, 3026, 788, 2978, 7419, 2818, 1773, 1327, 2859, # 3910 + 3894, 2819, 7420, 1306, 4342, 2003, 1700, 3752, 3521, 2359, 2650, 787, 2022, 506, 824, 3636, # 3926 + 534, 323, 4343, 1044, 3322, 2023, 1900, 946, 3424, 7421, 1778, 1500, 1678, 7422, 1881, 4344, # 3942 + 165, 243, 4345, 3637, 2521, 123, 683, 4096, 764, 4346, 36, 3895, 1792, 589, 2902, 816, # 3958 + 626, 1667, 3027, 2233, 1639, 1555, 1622, 3753, 3896, 7423, 3897, 2860, 1370, 1228, 1932, 891, # 3974 + 2083, 2903, 304, 4097, 7424, 292, 2979, 2711, 3522, 691, 2100, 4098, 1115, 4347, 118, 662, # 3990 + 7425, 611, 1156, 854, 2381, 1316, 2861, 2, 386, 515, 2904, 7426, 7427, 3253, 868, 2234, # 4006 + 1486, 855, 2651, 785, 2212, 3028, 7428, 1040, 3185, 3523, 7429, 3121, 448, 7430, 1525, 7431, # 4022 + 2164, 4348, 7432, 3754, 7433, 4099, 2820, 3524, 3122, 503, 818, 3898, 3123, 1568, 814, 676, # 4038 + 1444, 306, 1749, 7434, 3755, 1416, 1030, 197, 1428, 805, 2821, 1501, 4349, 7435, 7436, 7437, # 4054 + 1993, 7438, 4350, 7439, 7440, 2195, 13, 2779, 3638, 2980, 3124, 1229, 1916, 7441, 3756, 2131, # 4070 + 7442, 4100, 4351, 2399, 3525, 7443, 2213, 1511, 1727, 1120, 7444, 7445, 646, 3757, 2443, 307, # 4086 + 7446, 7447, 1595, 3186, 7448, 7449, 7450, 3639, 1113, 1356, 3899, 1465, 2522, 2523, 7451, 519, # 4102 + 7452, 128, 2132, 92, 2284, 1979, 7453, 3900, 1512, 342, 3125, 2196, 7454, 2780, 2214, 1980, # 4118 + 3323, 7455, 290, 1656, 1317, 789, 827, 2360, 7456, 3758, 4352, 562, 581, 3901, 7457, 401, # 4134 + 4353, 2248, 94, 4354, 1399, 2781, 7458, 1463, 2024, 4355, 3187, 1943, 7459, 828, 1105, 4101, # 4150 + 1262, 1394, 7460, 4102, 605, 4356, 7461, 1783, 2862, 7462, 2822, 819, 2101, 578, 2197, 2937, # 4166 + 7463, 1502, 436, 3254, 4103, 3255, 2823, 3902, 2905, 3425, 3426, 7464, 2712, 2315, 7465, 7466, # 4182 + 2332, 2067, 23, 4357, 193, 826, 3759, 2102, 699, 1630, 4104, 3075, 390, 1793, 1064, 3526, # 4198 + 7467, 1579, 3076, 3077, 1400, 7468, 4105, 1838, 1640, 2863, 7469, 4358, 4359, 137, 4106, 598, # 4214 + 3078, 1966, 780, 104, 974, 2938, 7470, 278, 899, 253, 402, 572, 504, 493, 1339, 7471, # 4230 + 3903, 1275, 4360, 2574, 2550, 7472, 3640, 3029, 3079, 2249, 565, 1334, 2713, 863, 41, 7473, # 4246 + 7474, 4361, 7475, 1657, 2333, 19, 463, 2750, 4107, 606, 7476, 2981, 3256, 1087, 2084, 1323, # 4262 + 2652, 2982, 7477, 1631, 1623, 1750, 4108, 2682, 7478, 2864, 791, 2714, 2653, 2334, 232, 2416, # 4278 + 7479, 2983, 1498, 7480, 2654, 2620, 755, 1366, 3641, 3257, 3126, 2025, 1609, 119, 1917, 3427, # 4294 + 862, 1026, 4109, 7481, 3904, 3760, 4362, 3905, 4363, 2260, 1951, 2470, 7482, 1125, 817, 4110, # 4310 + 4111, 3906, 1513, 1766, 2040, 1487, 4112, 3030, 3258, 2824, 3761, 3127, 7483, 7484, 1507, 7485, # 4326 + 2683, 733, 40, 1632, 1106, 2865, 345, 4113, 841, 2524, 230, 4364, 2984, 1846, 3259, 3428, # 4342 + 7486, 1263, 986, 3429, 7487, 735, 879, 254, 1137, 857, 622, 1300, 1180, 1388, 1562, 3907, # 4358 + 3908, 2939, 967, 2751, 2655, 1349, 592, 2133, 1692, 3324, 2985, 1994, 4114, 1679, 3909, 1901, # 4374 + 2185, 7488, 739, 3642, 2715, 1296, 1290, 7489, 4115, 2198, 2199, 1921, 1563, 2595, 2551, 1870, # 4390 + 2752, 2986, 7490, 435, 7491, 343, 1108, 596, 17, 1751, 4365, 2235, 3430, 3643, 7492, 4366, # 4406 + 294, 3527, 2940, 1693, 477, 979, 281, 2041, 3528, 643, 2042, 3644, 2621, 2782, 2261, 1031, # 4422 + 2335, 2134, 2298, 3529, 4367, 367, 1249, 2552, 7493, 3530, 7494, 4368, 1283, 3325, 2004, 240, # 4438 + 1762, 3326, 4369, 4370, 836, 1069, 3128, 474, 7495, 2148, 2525, 268, 3531, 7496, 3188, 1521, # 4454 + 1284, 7497, 1658, 1546, 4116, 7498, 3532, 3533, 7499, 4117, 3327, 2684, 1685, 4118, 961, 1673, # 4470 + 2622, 190, 2005, 2200, 3762, 4371, 4372, 7500, 570, 2497, 3645, 1490, 7501, 4373, 2623, 3260, # 4486 + 1956, 4374, 584, 1514, 396, 1045, 1944, 7502, 4375, 1967, 2444, 7503, 7504, 4376, 3910, 619, # 4502 + 7505, 3129, 3261, 215, 2006, 2783, 2553, 3189, 4377, 3190, 4378, 763, 4119, 3763, 4379, 7506, # 4518 + 7507, 1957, 1767, 2941, 3328, 3646, 1174, 452, 1477, 4380, 3329, 3130, 7508, 2825, 1253, 2382, # 4534 + 2186, 1091, 2285, 4120, 492, 7509, 638, 1169, 1824, 2135, 1752, 3911, 648, 926, 1021, 1324, # 4550 + 4381, 520, 4382, 997, 847, 1007, 892, 4383, 3764, 2262, 1871, 3647, 7510, 2400, 1784, 4384, # 4566 + 1952, 2942, 3080, 3191, 1728, 4121, 2043, 3648, 4385, 2007, 1701, 3131, 1551, 30, 2263, 4122, # 4582 + 7511, 2026, 4386, 3534, 7512, 501, 7513, 4123, 594, 3431, 2165, 1821, 3535, 3432, 3536, 3192, # 4598 + 829, 2826, 4124, 7514, 1680, 3132, 1225, 4125, 7515, 3262, 4387, 4126, 3133, 2336, 7516, 4388, # 4614 + 4127, 7517, 3912, 3913, 7518, 1847, 2383, 2596, 3330, 7519, 4389, 374, 3914, 652, 4128, 4129, # 4630 + 375, 1140, 798, 7520, 7521, 7522, 2361, 4390, 2264, 546, 1659, 138, 3031, 2445, 4391, 7523, # 4646 + 2250, 612, 1848, 910, 796, 3765, 1740, 1371, 825, 3766, 3767, 7524, 2906, 2554, 7525, 692, # 4662 + 444, 3032, 2624, 801, 4392, 4130, 7526, 1491, 244, 1053, 3033, 4131, 4132, 340, 7527, 3915, # 4678 + 1041, 2987, 293, 1168, 87, 1357, 7528, 1539, 959, 7529, 2236, 721, 694, 4133, 3768, 219, # 4694 + 1478, 644, 1417, 3331, 2656, 1413, 1401, 1335, 1389, 3916, 7530, 7531, 2988, 2362, 3134, 1825, # 4710 + 730, 1515, 184, 2827, 66, 4393, 7532, 1660, 2943, 246, 3332, 378, 1457, 226, 3433, 975, # 4726 + 3917, 2944, 1264, 3537, 674, 696, 7533, 163, 7534, 1141, 2417, 2166, 713, 3538, 3333, 4394, # 4742 + 3918, 7535, 7536, 1186, 15, 7537, 1079, 1070, 7538, 1522, 3193, 3539, 276, 1050, 2716, 758, # 4758 + 1126, 653, 2945, 3263, 7539, 2337, 889, 3540, 3919, 3081, 2989, 903, 1250, 4395, 3920, 3434, # 4774 + 3541, 1342, 1681, 1718, 766, 3264, 286, 89, 2946, 3649, 7540, 1713, 7541, 2597, 3334, 2990, # 4790 + 7542, 2947, 2215, 3194, 2866, 7543, 4396, 2498, 2526, 181, 387, 1075, 3921, 731, 2187, 3335, # 4806 + 7544, 3265, 310, 313, 3435, 2299, 770, 4134, 54, 3034, 189, 4397, 3082, 3769, 3922, 7545, # 4822 + 1230, 1617, 1849, 355, 3542, 4135, 4398, 3336, 111, 4136, 3650, 1350, 3135, 3436, 3035, 4137, # 4838 + 2149, 3266, 3543, 7546, 2784, 3923, 3924, 2991, 722, 2008, 7547, 1071, 247, 1207, 2338, 2471, # 4854 + 1378, 4399, 2009, 864, 1437, 1214, 4400, 373, 3770, 1142, 2216, 667, 4401, 442, 2753, 2555, # 4870 + 3771, 3925, 1968, 4138, 3267, 1839, 837, 170, 1107, 934, 1336, 1882, 7548, 7549, 2118, 4139, # 4886 + 2828, 743, 1569, 7550, 4402, 4140, 582, 2384, 1418, 3437, 7551, 1802, 7552, 357, 1395, 1729, # 4902 + 3651, 3268, 2418, 1564, 2237, 7553, 3083, 3772, 1633, 4403, 1114, 2085, 4141, 1532, 7554, 482, # 4918 + 2446, 4404, 7555, 7556, 1492, 833, 1466, 7557, 2717, 3544, 1641, 2829, 7558, 1526, 1272, 3652, # 4934 + 4142, 1686, 1794, 416, 2556, 1902, 1953, 1803, 7559, 3773, 2785, 3774, 1159, 2316, 7560, 2867, # 4950 + 4405, 1610, 1584, 3036, 2419, 2754, 443, 3269, 1163, 3136, 7561, 7562, 3926, 7563, 4143, 2499, # 4966 + 3037, 4406, 3927, 3137, 2103, 1647, 3545, 2010, 1872, 4144, 7564, 4145, 431, 3438, 7565, 250, # 4982 + 97, 81, 4146, 7566, 1648, 1850, 1558, 160, 848, 7567, 866, 740, 1694, 7568, 2201, 2830, # 4998 + 3195, 4147, 4407, 3653, 1687, 950, 2472, 426, 469, 3196, 3654, 3655, 3928, 7569, 7570, 1188, # 5014 + 424, 1995, 861, 3546, 4148, 3775, 2202, 2685, 168, 1235, 3547, 4149, 7571, 2086, 1674, 4408, # 5030 + 3337, 3270, 220, 2557, 1009, 7572, 3776, 670, 2992, 332, 1208, 717, 7573, 7574, 3548, 2447, # 5046 + 3929, 3338, 7575, 513, 7576, 1209, 2868, 3339, 3138, 4409, 1080, 7577, 7578, 7579, 7580, 2527, # 5062 + 3656, 3549, 815, 1587, 3930, 3931, 7581, 3550, 3439, 3777, 1254, 4410, 1328, 3038, 1390, 3932, # 5078 + 1741, 3933, 3778, 3934, 7582, 236, 3779, 2448, 3271, 7583, 7584, 3657, 3780, 1273, 3781, 4411, # 5094 + 7585, 308, 7586, 4412, 245, 4413, 1851, 2473, 1307, 2575, 430, 715, 2136, 2449, 7587, 270, # 5110 + 199, 2869, 3935, 7588, 3551, 2718, 1753, 761, 1754, 725, 1661, 1840, 4414, 3440, 3658, 7589, # 5126 + 7590, 587, 14, 3272, 227, 2598, 326, 480, 2265, 943, 2755, 3552, 291, 650, 1883, 7591, # 5142 + 1702, 1226, 102, 1547, 62, 3441, 904, 4415, 3442, 1164, 4150, 7592, 7593, 1224, 1548, 2756, # 5158 + 391, 498, 1493, 7594, 1386, 1419, 7595, 2055, 1177, 4416, 813, 880, 1081, 2363, 566, 1145, # 5174 + 4417, 2286, 1001, 1035, 2558, 2599, 2238, 394, 1286, 7596, 7597, 2068, 7598, 86, 1494, 1730, # 5190 + 3936, 491, 1588, 745, 897, 2948, 843, 3340, 3937, 2757, 2870, 3273, 1768, 998, 2217, 2069, # 5206 + 397, 1826, 1195, 1969, 3659, 2993, 3341, 284, 7599, 3782, 2500, 2137, 2119, 1903, 7600, 3938, # 5222 + 2150, 3939, 4151, 1036, 3443, 1904, 114, 2559, 4152, 209, 1527, 7601, 7602, 2949, 2831, 2625, # 5238 + 2385, 2719, 3139, 812, 2560, 7603, 3274, 7604, 1559, 737, 1884, 3660, 1210, 885, 28, 2686, # 5254 + 3553, 3783, 7605, 4153, 1004, 1779, 4418, 7606, 346, 1981, 2218, 2687, 4419, 3784, 1742, 797, # 5270 + 1642, 3940, 1933, 1072, 1384, 2151, 896, 3941, 3275, 3661, 3197, 2871, 3554, 7607, 2561, 1958, # 5286 + 4420, 2450, 1785, 7608, 7609, 7610, 3942, 4154, 1005, 1308, 3662, 4155, 2720, 4421, 4422, 1528, # 5302 + 2600, 161, 1178, 4156, 1982, 987, 4423, 1101, 4157, 631, 3943, 1157, 3198, 2420, 1343, 1241, # 5318 + 1016, 2239, 2562, 372, 877, 2339, 2501, 1160, 555, 1934, 911, 3944, 7611, 466, 1170, 169, # 5334 + 1051, 2907, 2688, 3663, 2474, 2994, 1182, 2011, 2563, 1251, 2626, 7612, 992, 2340, 3444, 1540, # 5350 + 2721, 1201, 2070, 2401, 1996, 2475, 7613, 4424, 528, 1922, 2188, 1503, 1873, 1570, 2364, 3342, # 5366 + 3276, 7614, 557, 1073, 7615, 1827, 3445, 2087, 2266, 3140, 3039, 3084, 767, 3085, 2786, 4425, # 5382 + 1006, 4158, 4426, 2341, 1267, 2176, 3664, 3199, 778, 3945, 3200, 2722, 1597, 2657, 7616, 4427, # 5398 + 7617, 3446, 7618, 7619, 7620, 3277, 2689, 1433, 3278, 131, 95, 1504, 3946, 723, 4159, 3141, # 5414 + 1841, 3555, 2758, 2189, 3947, 2027, 2104, 3665, 7621, 2995, 3948, 1218, 7622, 3343, 3201, 3949, # 5430 + 4160, 2576, 248, 1634, 3785, 912, 7623, 2832, 3666, 3040, 3786, 654, 53, 7624, 2996, 7625, # 5446 + 1688, 4428, 777, 3447, 1032, 3950, 1425, 7626, 191, 820, 2120, 2833, 971, 4429, 931, 3202, # 5462 + 135, 664, 783, 3787, 1997, 772, 2908, 1935, 3951, 3788, 4430, 2909, 3203, 282, 2723, 640, # 5478 + 1372, 3448, 1127, 922, 325, 3344, 7627, 7628, 711, 2044, 7629, 7630, 3952, 2219, 2787, 1936, # 5494 + 3953, 3345, 2220, 2251, 3789, 2300, 7631, 4431, 3790, 1258, 3279, 3954, 3204, 2138, 2950, 3955, # 5510 + 3956, 7632, 2221, 258, 3205, 4432, 101, 1227, 7633, 3280, 1755, 7634, 1391, 3281, 7635, 2910, # 5526 + 2056, 893, 7636, 7637, 7638, 1402, 4161, 2342, 7639, 7640, 3206, 3556, 7641, 7642, 878, 1325, # 5542 + 1780, 2788, 4433, 259, 1385, 2577, 744, 1183, 2267, 4434, 7643, 3957, 2502, 7644, 684, 1024, # 5558 + 4162, 7645, 472, 3557, 3449, 1165, 3282, 3958, 3959, 322, 2152, 881, 455, 1695, 1152, 1340, # 5574 + 660, 554, 2153, 4435, 1058, 4436, 4163, 830, 1065, 3346, 3960, 4437, 1923, 7646, 1703, 1918, # 5590 + 7647, 932, 2268, 122, 7648, 4438, 947, 677, 7649, 3791, 2627, 297, 1905, 1924, 2269, 4439, # 5606 + 2317, 3283, 7650, 7651, 4164, 7652, 4165, 84, 4166, 112, 989, 7653, 547, 1059, 3961, 701, # 5622 + 3558, 1019, 7654, 4167, 7655, 3450, 942, 639, 457, 2301, 2451, 993, 2951, 407, 851, 494, # 5638 + 4440, 3347, 927, 7656, 1237, 7657, 2421, 3348, 573, 4168, 680, 921, 2911, 1279, 1874, 285, # 5654 + 790, 1448, 1983, 719, 2167, 7658, 7659, 4441, 3962, 3963, 1649, 7660, 1541, 563, 7661, 1077, # 5670 + 7662, 3349, 3041, 3451, 511, 2997, 3964, 3965, 3667, 3966, 1268, 2564, 3350, 3207, 4442, 4443, # 5686 + 7663, 535, 1048, 1276, 1189, 2912, 2028, 3142, 1438, 1373, 2834, 2952, 1134, 2012, 7664, 4169, # 5702 + 1238, 2578, 3086, 1259, 7665, 700, 7666, 2953, 3143, 3668, 4170, 7667, 4171, 1146, 1875, 1906, # 5718 + 4444, 2601, 3967, 781, 2422, 132, 1589, 203, 147, 273, 2789, 2402, 898, 1786, 2154, 3968, # 5734 + 3969, 7668, 3792, 2790, 7669, 7670, 4445, 4446, 7671, 3208, 7672, 1635, 3793, 965, 7673, 1804, # 5750 + 2690, 1516, 3559, 1121, 1082, 1329, 3284, 3970, 1449, 3794, 65, 1128, 2835, 2913, 2759, 1590, # 5766 + 3795, 7674, 7675, 12, 2658, 45, 976, 2579, 3144, 4447, 517, 2528, 1013, 1037, 3209, 7676, # 5782 + 3796, 2836, 7677, 3797, 7678, 3452, 7679, 2602, 614, 1998, 2318, 3798, 3087, 2724, 2628, 7680, # 5798 + 2580, 4172, 599, 1269, 7681, 1810, 3669, 7682, 2691, 3088, 759, 1060, 489, 1805, 3351, 3285, # 5814 + 1358, 7683, 7684, 2386, 1387, 1215, 2629, 2252, 490, 7685, 7686, 4173, 1759, 2387, 2343, 7687, # 5830 + 4448, 3799, 1907, 3971, 2630, 1806, 3210, 4449, 3453, 3286, 2760, 2344, 874, 7688, 7689, 3454, # 5846 + 3670, 1858, 91, 2914, 3671, 3042, 3800, 4450, 7690, 3145, 3972, 2659, 7691, 3455, 1202, 1403, # 5862 + 3801, 2954, 2529, 1517, 2503, 4451, 3456, 2504, 7692, 4452, 7693, 2692, 1885, 1495, 1731, 3973, # 5878 + 2365, 4453, 7694, 2029, 7695, 7696, 3974, 2693, 1216, 237, 2581, 4174, 2319, 3975, 3802, 4454, # 5894 + 4455, 2694, 3560, 3457, 445, 4456, 7697, 7698, 7699, 7700, 2761, 61, 3976, 3672, 1822, 3977, # 5910 + 7701, 687, 2045, 935, 925, 405, 2660, 703, 1096, 1859, 2725, 4457, 3978, 1876, 1367, 2695, # 5926 + 3352, 918, 2105, 1781, 2476, 334, 3287, 1611, 1093, 4458, 564, 3146, 3458, 3673, 3353, 945, # 5942 + 2631, 2057, 4459, 7702, 1925, 872, 4175, 7703, 3459, 2696, 3089, 349, 4176, 3674, 3979, 4460, # 5958 + 3803, 4177, 3675, 2155, 3980, 4461, 4462, 4178, 4463, 2403, 2046, 782, 3981, 400, 251, 4179, # 5974 + 1624, 7704, 7705, 277, 3676, 299, 1265, 476, 1191, 3804, 2121, 4180, 4181, 1109, 205, 7706, # 5990 + 2582, 1000, 2156, 3561, 1860, 7707, 7708, 7709, 4464, 7710, 4465, 2565, 107, 2477, 2157, 3982, # 6006 + 3460, 3147, 7711, 1533, 541, 1301, 158, 753, 4182, 2872, 3562, 7712, 1696, 370, 1088, 4183, # 6022 + 4466, 3563, 579, 327, 440, 162, 2240, 269, 1937, 1374, 3461, 968, 3043, 56, 1396, 3090, # 6038 + 2106, 3288, 3354, 7713, 1926, 2158, 4467, 2998, 7714, 3564, 7715, 7716, 3677, 4468, 2478, 7717, # 6054 + 2791, 7718, 1650, 4469, 7719, 2603, 7720, 7721, 3983, 2661, 3355, 1149, 3356, 3984, 3805, 3985, # 6070 + 7722, 1076, 49, 7723, 951, 3211, 3289, 3290, 450, 2837, 920, 7724, 1811, 2792, 2366, 4184, # 6086 + 1908, 1138, 2367, 3806, 3462, 7725, 3212, 4470, 1909, 1147, 1518, 2423, 4471, 3807, 7726, 4472, # 6102 + 2388, 2604, 260, 1795, 3213, 7727, 7728, 3808, 3291, 708, 7729, 3565, 1704, 7730, 3566, 1351, # 6118 + 1618, 3357, 2999, 1886, 944, 4185, 3358, 4186, 3044, 3359, 4187, 7731, 3678, 422, 413, 1714, # 6134 + 3292, 500, 2058, 2345, 4188, 2479, 7732, 1344, 1910, 954, 7733, 1668, 7734, 7735, 3986, 2404, # 6150 + 4189, 3567, 3809, 4190, 7736, 2302, 1318, 2505, 3091, 133, 3092, 2873, 4473, 629, 31, 2838, # 6166 + 2697, 3810, 4474, 850, 949, 4475, 3987, 2955, 1732, 2088, 4191, 1496, 1852, 7737, 3988, 620, # 6182 + 3214, 981, 1242, 3679, 3360, 1619, 3680, 1643, 3293, 2139, 2452, 1970, 1719, 3463, 2168, 7738, # 6198 + 3215, 7739, 7740, 3361, 1828, 7741, 1277, 4476, 1565, 2047, 7742, 1636, 3568, 3093, 7743, 869, # 6214 + 2839, 655, 3811, 3812, 3094, 3989, 3000, 3813, 1310, 3569, 4477, 7744, 7745, 7746, 1733, 558, # 6230 + 4478, 3681, 335, 1549, 3045, 1756, 4192, 3682, 1945, 3464, 1829, 1291, 1192, 470, 2726, 2107, # 6246 + 2793, 913, 1054, 3990, 7747, 1027, 7748, 3046, 3991, 4479, 982, 2662, 3362, 3148, 3465, 3216, # 6262 + 3217, 1946, 2794, 7749, 571, 4480, 7750, 1830, 7751, 3570, 2583, 1523, 2424, 7752, 2089, 984, # 6278 + 4481, 3683, 1959, 7753, 3684, 852, 923, 2795, 3466, 3685, 969, 1519, 999, 2048, 2320, 1705, # 6294 + 7754, 3095, 615, 1662, 151, 597, 3992, 2405, 2321, 1049, 275, 4482, 3686, 4193, 568, 3687, # 6310 + 3571, 2480, 4194, 3688, 7755, 2425, 2270, 409, 3218, 7756, 1566, 2874, 3467, 1002, 769, 2840, # 6326 + 194, 2090, 3149, 3689, 2222, 3294, 4195, 628, 1505, 7757, 7758, 1763, 2177, 3001, 3993, 521, # 6342 + 1161, 2584, 1787, 2203, 2406, 4483, 3994, 1625, 4196, 4197, 412, 42, 3096, 464, 7759, 2632, # 6358 + 4484, 3363, 1760, 1571, 2875, 3468, 2530, 1219, 2204, 3814, 2633, 2140, 2368, 4485, 4486, 3295, # 6374 + 1651, 3364, 3572, 7760, 7761, 3573, 2481, 3469, 7762, 3690, 7763, 7764, 2271, 2091, 460, 7765, # 6390 + 4487, 7766, 3002, 962, 588, 3574, 289, 3219, 2634, 1116, 52, 7767, 3047, 1796, 7768, 7769, # 6406 + 7770, 1467, 7771, 1598, 1143, 3691, 4198, 1984, 1734, 1067, 4488, 1280, 3365, 465, 4489, 1572, # 6422 + 510, 7772, 1927, 2241, 1812, 1644, 3575, 7773, 4490, 3692, 7774, 7775, 2663, 1573, 1534, 7776, # 6438 + 7777, 4199, 536, 1807, 1761, 3470, 3815, 3150, 2635, 7778, 7779, 7780, 4491, 3471, 2915, 1911, # 6454 + 2796, 7781, 3296, 1122, 377, 3220, 7782, 360, 7783, 7784, 4200, 1529, 551, 7785, 2059, 3693, # 6470 + 1769, 2426, 7786, 2916, 4201, 3297, 3097, 2322, 2108, 2030, 4492, 1404, 136, 1468, 1479, 672, # 6486 + 1171, 3221, 2303, 271, 3151, 7787, 2762, 7788, 2049, 678, 2727, 865, 1947, 4493, 7789, 2013, # 6502 + 3995, 2956, 7790, 2728, 2223, 1397, 3048, 3694, 4494, 4495, 1735, 2917, 3366, 3576, 7791, 3816, # 6518 + 509, 2841, 2453, 2876, 3817, 7792, 7793, 3152, 3153, 4496, 4202, 2531, 4497, 2304, 1166, 1010, # 6534 + 552, 681, 1887, 7794, 7795, 2957, 2958, 3996, 1287, 1596, 1861, 3154, 358, 453, 736, 175, # 6550 + 478, 1117, 905, 1167, 1097, 7796, 1853, 1530, 7797, 1706, 7798, 2178, 3472, 2287, 3695, 3473, # 6566 + 3577, 4203, 2092, 4204, 7799, 3367, 1193, 2482, 4205, 1458, 2190, 2205, 1862, 1888, 1421, 3298, # 6582 + 2918, 3049, 2179, 3474, 595, 2122, 7800, 3997, 7801, 7802, 4206, 1707, 2636, 223, 3696, 1359, # 6598 + 751, 3098, 183, 3475, 7803, 2797, 3003, 419, 2369, 633, 704, 3818, 2389, 241, 7804, 7805, # 6614 + 7806, 838, 3004, 3697, 2272, 2763, 2454, 3819, 1938, 2050, 3998, 1309, 3099, 2242, 1181, 7807, # 6630 + 1136, 2206, 3820, 2370, 1446, 4207, 2305, 4498, 7808, 7809, 4208, 1055, 2605, 484, 3698, 7810, # 6646 + 3999, 625, 4209, 2273, 3368, 1499, 4210, 4000, 7811, 4001, 4211, 3222, 2274, 2275, 3476, 7812, # 6662 + 7813, 2764, 808, 2606, 3699, 3369, 4002, 4212, 3100, 2532, 526, 3370, 3821, 4213, 955, 7814, # 6678 + 1620, 4214, 2637, 2427, 7815, 1429, 3700, 1669, 1831, 994, 928, 7816, 3578, 1260, 7817, 7818, # 6694 + 7819, 1948, 2288, 741, 2919, 1626, 4215, 2729, 2455, 867, 1184, 362, 3371, 1392, 7820, 7821, # 6710 + 4003, 4216, 1770, 1736, 3223, 2920, 4499, 4500, 1928, 2698, 1459, 1158, 7822, 3050, 3372, 2877, # 6726 + 1292, 1929, 2506, 2842, 3701, 1985, 1187, 2071, 2014, 2607, 4217, 7823, 2566, 2507, 2169, 3702, # 6742 + 2483, 3299, 7824, 3703, 4501, 7825, 7826, 666, 1003, 3005, 1022, 3579, 4218, 7827, 4502, 1813, # 6758 + 2253, 574, 3822, 1603, 295, 1535, 705, 3823, 4219, 283, 858, 417, 7828, 7829, 3224, 4503, # 6774 + 4504, 3051, 1220, 1889, 1046, 2276, 2456, 4004, 1393, 1599, 689, 2567, 388, 4220, 7830, 2484, # 6790 + 802, 7831, 2798, 3824, 2060, 1405, 2254, 7832, 4505, 3825, 2109, 1052, 1345, 3225, 1585, 7833, # 6806 + 809, 7834, 7835, 7836, 575, 2730, 3477, 956, 1552, 1469, 1144, 2323, 7837, 2324, 1560, 2457, # 6822 + 3580, 3226, 4005, 616, 2207, 3155, 2180, 2289, 7838, 1832, 7839, 3478, 4506, 7840, 1319, 3704, # 6838 + 3705, 1211, 3581, 1023, 3227, 1293, 2799, 7841, 7842, 7843, 3826, 607, 2306, 3827, 762, 2878, # 6854 + 1439, 4221, 1360, 7844, 1485, 3052, 7845, 4507, 1038, 4222, 1450, 2061, 2638, 4223, 1379, 4508, # 6870 + 2585, 7846, 7847, 4224, 1352, 1414, 2325, 2921, 1172, 7848, 7849, 3828, 3829, 7850, 1797, 1451, # 6886 + 7851, 7852, 7853, 7854, 2922, 4006, 4007, 2485, 2346, 411, 4008, 4009, 3582, 3300, 3101, 4509, # 6902 + 1561, 2664, 1452, 4010, 1375, 7855, 7856, 47, 2959, 316, 7857, 1406, 1591, 2923, 3156, 7858, # 6918 + 1025, 2141, 3102, 3157, 354, 2731, 884, 2224, 4225, 2407, 508, 3706, 726, 3583, 996, 2428, # 6934 + 3584, 729, 7859, 392, 2191, 1453, 4011, 4510, 3707, 7860, 7861, 2458, 3585, 2608, 1675, 2800, # 6950 + 919, 2347, 2960, 2348, 1270, 4511, 4012, 73, 7862, 7863, 647, 7864, 3228, 2843, 2255, 1550, # 6966 + 1346, 3006, 7865, 1332, 883, 3479, 7866, 7867, 7868, 7869, 3301, 2765, 7870, 1212, 831, 1347, # 6982 + 4226, 4512, 2326, 3830, 1863, 3053, 720, 3831, 4513, 4514, 3832, 7871, 4227, 7872, 7873, 4515, # 6998 + 7874, 7875, 1798, 4516, 3708, 2609, 4517, 3586, 1645, 2371, 7876, 7877, 2924, 669, 2208, 2665, # 7014 + 2429, 7878, 2879, 7879, 7880, 1028, 3229, 7881, 4228, 2408, 7882, 2256, 1353, 7883, 7884, 4518, # 7030 + 3158, 518, 7885, 4013, 7886, 4229, 1960, 7887, 2142, 4230, 7888, 7889, 3007, 2349, 2350, 3833, # 7046 + 516, 1833, 1454, 4014, 2699, 4231, 4519, 2225, 2610, 1971, 1129, 3587, 7890, 2766, 7891, 2961, # 7062 + 1422, 577, 1470, 3008, 1524, 3373, 7892, 7893, 432, 4232, 3054, 3480, 7894, 2586, 1455, 2508, # 7078 + 2226, 1972, 1175, 7895, 1020, 2732, 4015, 3481, 4520, 7896, 2733, 7897, 1743, 1361, 3055, 3482, # 7094 + 2639, 4016, 4233, 4521, 2290, 895, 924, 4234, 2170, 331, 2243, 3056, 166, 1627, 3057, 1098, # 7110 + 7898, 1232, 2880, 2227, 3374, 4522, 657, 403, 1196, 2372, 542, 3709, 3375, 1600, 4235, 3483, # 7126 + 7899, 4523, 2767, 3230, 576, 530, 1362, 7900, 4524, 2533, 2666, 3710, 4017, 7901, 842, 3834, # 7142 + 7902, 2801, 2031, 1014, 4018, 213, 2700, 3376, 665, 621, 4236, 7903, 3711, 2925, 2430, 7904, # 7158 + 2431, 3302, 3588, 3377, 7905, 4237, 2534, 4238, 4525, 3589, 1682, 4239, 3484, 1380, 7906, 724, # 7174 + 2277, 600, 1670, 7907, 1337, 1233, 4526, 3103, 2244, 7908, 1621, 4527, 7909, 651, 4240, 7910, # 7190 + 1612, 4241, 2611, 7911, 2844, 7912, 2734, 2307, 3058, 7913, 716, 2459, 3059, 174, 1255, 2701, # 7206 + 4019, 3590, 548, 1320, 1398, 728, 4020, 1574, 7914, 1890, 1197, 3060, 4021, 7915, 3061, 3062, # 7222 + 3712, 3591, 3713, 747, 7916, 635, 4242, 4528, 7917, 7918, 7919, 4243, 7920, 7921, 4529, 7922, # 7238 + 3378, 4530, 2432, 451, 7923, 3714, 2535, 2072, 4244, 2735, 4245, 4022, 7924, 1764, 4531, 7925, # 7254 + 4246, 350, 7926, 2278, 2390, 2486, 7927, 4247, 4023, 2245, 1434, 4024, 488, 4532, 458, 4248, # 7270 + 4025, 3715, 771, 1330, 2391, 3835, 2568, 3159, 2159, 2409, 1553, 2667, 3160, 4249, 7928, 2487, # 7286 + 2881, 2612, 1720, 2702, 4250, 3379, 4533, 7929, 2536, 4251, 7930, 3231, 4252, 2768, 7931, 2015, # 7302 + 2736, 7932, 1155, 1017, 3716, 3836, 7933, 3303, 2308, 201, 1864, 4253, 1430, 7934, 4026, 7935, # 7318 + 7936, 7937, 7938, 7939, 4254, 1604, 7940, 414, 1865, 371, 2587, 4534, 4535, 3485, 2016, 3104, # 7334 + 4536, 1708, 960, 4255, 887, 389, 2171, 1536, 1663, 1721, 7941, 2228, 4027, 2351, 2926, 1580, # 7350 + 7942, 7943, 7944, 1744, 7945, 2537, 4537, 4538, 7946, 4539, 7947, 2073, 7948, 7949, 3592, 3380, # 7366 + 2882, 4256, 7950, 4257, 2640, 3381, 2802, 673, 2703, 2460, 709, 3486, 4028, 3593, 4258, 7951, # 7382 + 1148, 502, 634, 7952, 7953, 1204, 4540, 3594, 1575, 4541, 2613, 3717, 7954, 3718, 3105, 948, # 7398 + 3232, 121, 1745, 3837, 1110, 7955, 4259, 3063, 2509, 3009, 4029, 3719, 1151, 1771, 3838, 1488, # 7414 + 4030, 1986, 7956, 2433, 3487, 7957, 7958, 2093, 7959, 4260, 3839, 1213, 1407, 2803, 531, 2737, # 7430 + 2538, 3233, 1011, 1537, 7960, 2769, 4261, 3106, 1061, 7961, 3720, 3721, 1866, 2883, 7962, 2017, # 7446 + 120, 4262, 4263, 2062, 3595, 3234, 2309, 3840, 2668, 3382, 1954, 4542, 7963, 7964, 3488, 1047, # 7462 + 2704, 1266, 7965, 1368, 4543, 2845, 649, 3383, 3841, 2539, 2738, 1102, 2846, 2669, 7966, 7967, # 7478 + 1999, 7968, 1111, 3596, 2962, 7969, 2488, 3842, 3597, 2804, 1854, 3384, 3722, 7970, 7971, 3385, # 7494 + 2410, 2884, 3304, 3235, 3598, 7972, 2569, 7973, 3599, 2805, 4031, 1460, 856, 7974, 3600, 7975, # 7510 + 2885, 2963, 7976, 2886, 3843, 7977, 4264, 632, 2510, 875, 3844, 1697, 3845, 2291, 7978, 7979, # 7526 + 4544, 3010, 1239, 580, 4545, 4265, 7980, 914, 936, 2074, 1190, 4032, 1039, 2123, 7981, 7982, # 7542 + 7983, 3386, 1473, 7984, 1354, 4266, 3846, 7985, 2172, 3064, 4033, 915, 3305, 4267, 4268, 3306, # 7558 + 1605, 1834, 7986, 2739, 398, 3601, 4269, 3847, 4034, 328, 1912, 2847, 4035, 3848, 1331, 4270, # 7574 + 3011, 937, 4271, 7987, 3602, 4036, 4037, 3387, 2160, 4546, 3388, 524, 742, 538, 3065, 1012, # 7590 + 7988, 7989, 3849, 2461, 7990, 658, 1103, 225, 3850, 7991, 7992, 4547, 7993, 4548, 7994, 3236, # 7606 + 1243, 7995, 4038, 963, 2246, 4549, 7996, 2705, 3603, 3161, 7997, 7998, 2588, 2327, 7999, 4550, # 7622 + 8000, 8001, 8002, 3489, 3307, 957, 3389, 2540, 2032, 1930, 2927, 2462, 870, 2018, 3604, 1746, # 7638 + 2770, 2771, 2434, 2463, 8003, 3851, 8004, 3723, 3107, 3724, 3490, 3390, 3725, 8005, 1179, 3066, # 7654 + 8006, 3162, 2373, 4272, 3726, 2541, 3163, 3108, 2740, 4039, 8007, 3391, 1556, 2542, 2292, 977, # 7670 + 2887, 2033, 4040, 1205, 3392, 8008, 1765, 3393, 3164, 2124, 1271, 1689, 714, 4551, 3491, 8009, # 7686 + 2328, 3852, 533, 4273, 3605, 2181, 617, 8010, 2464, 3308, 3492, 2310, 8011, 8012, 3165, 8013, # 7702 + 8014, 3853, 1987, 618, 427, 2641, 3493, 3394, 8015, 8016, 1244, 1690, 8017, 2806, 4274, 4552, # 7718 + 8018, 3494, 8019, 8020, 2279, 1576, 473, 3606, 4275, 3395, 972, 8021, 3607, 8022, 3067, 8023, # 7734 + 8024, 4553, 4554, 8025, 3727, 4041, 4042, 8026, 153, 4555, 356, 8027, 1891, 2888, 4276, 2143, # 7750 + 408, 803, 2352, 8028, 3854, 8029, 4277, 1646, 2570, 2511, 4556, 4557, 3855, 8030, 3856, 4278, # 7766 + 8031, 2411, 3396, 752, 8032, 8033, 1961, 2964, 8034, 746, 3012, 2465, 8035, 4279, 3728, 698, # 7782 + 4558, 1892, 4280, 3608, 2543, 4559, 3609, 3857, 8036, 3166, 3397, 8037, 1823, 1302, 4043, 2706, # 7798 + 3858, 1973, 4281, 8038, 4282, 3167, 823, 1303, 1288, 1236, 2848, 3495, 4044, 3398, 774, 3859, # 7814 + 8039, 1581, 4560, 1304, 2849, 3860, 4561, 8040, 2435, 2161, 1083, 3237, 4283, 4045, 4284, 344, # 7830 + 1173, 288, 2311, 454, 1683, 8041, 8042, 1461, 4562, 4046, 2589, 8043, 8044, 4563, 985, 894, # 7846 + 8045, 3399, 3168, 8046, 1913, 2928, 3729, 1988, 8047, 2110, 1974, 8048, 4047, 8049, 2571, 1194, # 7862 + 425, 8050, 4564, 3169, 1245, 3730, 4285, 8051, 8052, 2850, 8053, 636, 4565, 1855, 3861, 760, # 7878 + 1799, 8054, 4286, 2209, 1508, 4566, 4048, 1893, 1684, 2293, 8055, 8056, 8057, 4287, 4288, 2210, # 7894 + 479, 8058, 8059, 832, 8060, 4049, 2489, 8061, 2965, 2490, 3731, 990, 3109, 627, 1814, 2642, # 7910 + 4289, 1582, 4290, 2125, 2111, 3496, 4567, 8062, 799, 4291, 3170, 8063, 4568, 2112, 1737, 3013, # 7926 + 1018, 543, 754, 4292, 3309, 1676, 4569, 4570, 4050, 8064, 1489, 8065, 3497, 8066, 2614, 2889, # 7942 + 4051, 8067, 8068, 2966, 8069, 8070, 8071, 8072, 3171, 4571, 4572, 2182, 1722, 8073, 3238, 3239, # 7958 + 1842, 3610, 1715, 481, 365, 1975, 1856, 8074, 8075, 1962, 2491, 4573, 8076, 2126, 3611, 3240, # 7974 + 433, 1894, 2063, 2075, 8077, 602, 2741, 8078, 8079, 8080, 8081, 8082, 3014, 1628, 3400, 8083, # 7990 + 3172, 4574, 4052, 2890, 4575, 2512, 8084, 2544, 2772, 8085, 8086, 8087, 3310, 4576, 2891, 8088, # 8006 + 4577, 8089, 2851, 4578, 4579, 1221, 2967, 4053, 2513, 8090, 8091, 8092, 1867, 1989, 8093, 8094, # 8022 + 8095, 1895, 8096, 8097, 4580, 1896, 4054, 318, 8098, 2094, 4055, 4293, 8099, 8100, 485, 8101, # 8038 + 938, 3862, 553, 2670, 116, 8102, 3863, 3612, 8103, 3498, 2671, 2773, 3401, 3311, 2807, 8104, # 8054 + 3613, 2929, 4056, 1747, 2930, 2968, 8105, 8106, 207, 8107, 8108, 2672, 4581, 2514, 8109, 3015, # 8070 + 890, 3614, 3864, 8110, 1877, 3732, 3402, 8111, 2183, 2353, 3403, 1652, 8112, 8113, 8114, 941, # 8086 + 2294, 208, 3499, 4057, 2019, 330, 4294, 3865, 2892, 2492, 3733, 4295, 8115, 8116, 8117, 8118, # 8102 ) - +# fmt: on diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwprober.py index 35669cc..ca10a23 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwprober.py @@ -25,14 +25,15 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine from .chardistribution import EUCTWDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber from .mbcssm import EUCTW_SM_MODEL + class EUCTWProber(MultiByteCharSetProber): def __init__(self): - super(EUCTWProber, self).__init__() + super().__init__() self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) self.distribution_analyzer = EUCTWDistributionAnalysis() self.reset() diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py index 697837b..b32bfc7 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py @@ -43,6 +43,7 @@ GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 GB2312_TABLE_SIZE = 3760 +# fmt: off GB2312_CHAR_TO_FREQ_ORDER = ( 1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, 2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, @@ -280,4 +281,4 @@ GB2312_CHAR_TO_FREQ_ORDER = ( 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 ) - +# fmt: on diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py index 8446d2d..251c042 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -25,14 +25,15 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine from .chardistribution import GB2312DistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber from .mbcssm import GB2312_SM_MODEL + class GB2312Prober(MultiByteCharSetProber): def __init__(self): - super(GB2312Prober, self).__init__() + super().__init__() self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) self.distribution_analyzer = GB2312DistributionAnalysis() self.reset() diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py index b0e1bf4..3ca634b 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -125,18 +125,19 @@ from .enums import ProbingState # model probers scores. The answer is returned in the form of the name of the # charset identified, either "windows-1255" or "ISO-8859-8". + class HebrewProber(CharSetProber): # windows-1255 / ISO-8859-8 code points of interest - FINAL_KAF = 0xea - NORMAL_KAF = 0xeb - FINAL_MEM = 0xed - NORMAL_MEM = 0xee - FINAL_NUN = 0xef - NORMAL_NUN = 0xf0 - FINAL_PE = 0xf3 - NORMAL_PE = 0xf4 - FINAL_TSADI = 0xf5 - NORMAL_TSADI = 0xf6 + FINAL_KAF = 0xEA + NORMAL_KAF = 0xEB + FINAL_MEM = 0xED + NORMAL_MEM = 0xEE + FINAL_NUN = 0xEF + NORMAL_NUN = 0xF0 + FINAL_PE = 0xF3 + NORMAL_PE = 0xF4 + FINAL_TSADI = 0xF5 + NORMAL_TSADI = 0xF6 # Minimum Visual vs Logical final letter score difference. # If the difference is below this, don't rely solely on the final letter score @@ -152,7 +153,7 @@ class HebrewProber(CharSetProber): LOGICAL_HEBREW_NAME = "windows-1255" def __init__(self): - super(HebrewProber, self).__init__() + super().__init__() self._final_char_logical_score = None self._final_char_visual_score = None self._prev = None @@ -167,17 +168,22 @@ class HebrewProber(CharSetProber): # The two last characters seen in the previous buffer, # mPrev and mBeforePrev are initialized to space in order to simulate # a word delimiter at the beginning of the data - self._prev = ' ' - self._before_prev = ' ' + self._prev = " " + self._before_prev = " " # These probers are owned by the group prober. - def set_model_probers(self, logicalProber, visualProber): - self._logical_prober = logicalProber - self._visual_prober = visualProber + def set_model_probers(self, logical_prober, visual_prober): + self._logical_prober = logical_prober + self._visual_prober = visual_prober def is_final(self, c): - return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, - self.FINAL_PE, self.FINAL_TSADI] + return c in [ + self.FINAL_KAF, + self.FINAL_MEM, + self.FINAL_NUN, + self.FINAL_PE, + self.FINAL_TSADI, + ] def is_non_final(self, c): # The normal Tsadi is not a good Non-Final letter due to words like @@ -190,8 +196,7 @@ class HebrewProber(CharSetProber): # for example legally end with a Non-Final Pe or Kaf. However, the # benefit of these letters as Non-Final letters outweighs the damage # since these words are quite rare. - return c in [self.NORMAL_KAF, self.NORMAL_MEM, - self.NORMAL_NUN, self.NORMAL_PE] + return c in [self.NORMAL_KAF, self.NORMAL_MEM, self.NORMAL_NUN, self.NORMAL_PE] def feed(self, byte_str): # Final letter analysis for logical-visual decision. @@ -227,9 +232,9 @@ class HebrewProber(CharSetProber): byte_str = self.filter_high_byte_only(byte_str) for cur in byte_str: - if cur == ' ': + if cur == " ": # We stand on a space - a word just ended - if self._before_prev != ' ': + if self._before_prev != " ": # next-to-last char was not a space so self._prev is not a # 1 letter word if self.is_final(self._prev): @@ -241,8 +246,11 @@ class HebrewProber(CharSetProber): self._final_char_visual_score += 1 else: # Not standing on a space - if ((self._before_prev == ' ') and - (self.is_final(self._prev)) and (cur != ' ')): + if ( + (self._before_prev == " ") + and (self.is_final(self._prev)) + and (cur != " ") + ): # case (3) [-2:space][-1:final letter][cur:not space] self._final_char_visual_score += 1 self._before_prev = self._prev @@ -263,8 +271,9 @@ class HebrewProber(CharSetProber): return self.VISUAL_HEBREW_NAME # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._logical_prober.get_confidence() - - self._visual_prober.get_confidence()) + modelsub = ( + self._logical_prober.get_confidence() - self._visual_prober.get_confidence() + ) if modelsub > self.MIN_MODEL_DISTANCE: return self.LOGICAL_HEBREW_NAME if modelsub < -self.MIN_MODEL_DISTANCE: @@ -281,12 +290,13 @@ class HebrewProber(CharSetProber): @property def language(self): - return 'Hebrew' + return "Hebrew" @property def state(self): # Remain active as long as any of the model probers are active. - if (self._logical_prober.state == ProbingState.NOT_ME) and \ - (self._visual_prober.state == ProbingState.NOT_ME): + if (self._logical_prober.state == ProbingState.NOT_ME) and ( + self._visual_prober.state == ProbingState.NOT_ME + ): return ProbingState.NOT_ME return ProbingState.DETECTING diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/jisfreq.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/jisfreq.py index 83fc082..3293576 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/jisfreq.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/jisfreq.py @@ -46,6 +46,7 @@ JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 # Char to FreqOrder table , JIS_TABLE_SIZE = 4368 +# fmt: off JIS_CHAR_TO_FREQ_ORDER = ( 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 @@ -321,5 +322,4 @@ JIS_CHAR_TO_FREQ_ORDER = ( 1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 ) - - +# fmt: on diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/johabfreq.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/johabfreq.py new file mode 100644 index 0000000..c129699 --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/johabfreq.py @@ -0,0 +1,2382 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# The frequency data itself is the same as euc-kr. +# This is just a mapping table to euc-kr. + +JOHAB_TO_EUCKR_ORDER_TABLE = { + 0x8861: 0, + 0x8862: 1, + 0x8865: 2, + 0x8868: 3, + 0x8869: 4, + 0x886A: 5, + 0x886B: 6, + 0x8871: 7, + 0x8873: 8, + 0x8874: 9, + 0x8875: 10, + 0x8876: 11, + 0x8877: 12, + 0x8878: 13, + 0x8879: 14, + 0x887B: 15, + 0x887C: 16, + 0x887D: 17, + 0x8881: 18, + 0x8882: 19, + 0x8885: 20, + 0x8889: 21, + 0x8891: 22, + 0x8893: 23, + 0x8895: 24, + 0x8896: 25, + 0x8897: 26, + 0x88A1: 27, + 0x88A2: 28, + 0x88A5: 29, + 0x88A9: 30, + 0x88B5: 31, + 0x88B7: 32, + 0x88C1: 33, + 0x88C5: 34, + 0x88C9: 35, + 0x88E1: 36, + 0x88E2: 37, + 0x88E5: 38, + 0x88E8: 39, + 0x88E9: 40, + 0x88EB: 41, + 0x88F1: 42, + 0x88F3: 43, + 0x88F5: 44, + 0x88F6: 45, + 0x88F7: 46, + 0x88F8: 47, + 0x88FB: 48, + 0x88FC: 49, + 0x88FD: 50, + 0x8941: 51, + 0x8945: 52, + 0x8949: 53, + 0x8951: 54, + 0x8953: 55, + 0x8955: 56, + 0x8956: 57, + 0x8957: 58, + 0x8961: 59, + 0x8962: 60, + 0x8963: 61, + 0x8965: 62, + 0x8968: 63, + 0x8969: 64, + 0x8971: 65, + 0x8973: 66, + 0x8975: 67, + 0x8976: 68, + 0x8977: 69, + 0x897B: 70, + 0x8981: 71, + 0x8985: 72, + 0x8989: 73, + 0x8993: 74, + 0x8995: 75, + 0x89A1: 76, + 0x89A2: 77, + 0x89A5: 78, + 0x89A8: 79, + 0x89A9: 80, + 0x89AB: 81, + 0x89AD: 82, + 0x89B0: 83, + 0x89B1: 84, + 0x89B3: 85, + 0x89B5: 86, + 0x89B7: 87, + 0x89B8: 88, + 0x89C1: 89, + 0x89C2: 90, + 0x89C5: 91, + 0x89C9: 92, + 0x89CB: 93, + 0x89D1: 94, + 0x89D3: 95, + 0x89D5: 96, + 0x89D7: 97, + 0x89E1: 98, + 0x89E5: 99, + 0x89E9: 100, + 0x89F3: 101, + 0x89F6: 102, + 0x89F7: 103, + 0x8A41: 104, + 0x8A42: 105, + 0x8A45: 106, + 0x8A49: 107, + 0x8A51: 108, + 0x8A53: 109, + 0x8A55: 110, + 0x8A57: 111, + 0x8A61: 112, + 0x8A65: 113, + 0x8A69: 114, + 0x8A73: 115, + 0x8A75: 116, + 0x8A81: 117, + 0x8A82: 118, + 0x8A85: 119, + 0x8A88: 120, + 0x8A89: 121, + 0x8A8A: 122, + 0x8A8B: 123, + 0x8A90: 124, + 0x8A91: 125, + 0x8A93: 126, + 0x8A95: 127, + 0x8A97: 128, + 0x8A98: 129, + 0x8AA1: 130, + 0x8AA2: 131, + 0x8AA5: 132, + 0x8AA9: 133, + 0x8AB6: 134, + 0x8AB7: 135, + 0x8AC1: 136, + 0x8AD5: 137, + 0x8AE1: 138, + 0x8AE2: 139, + 0x8AE5: 140, + 0x8AE9: 141, + 0x8AF1: 142, + 0x8AF3: 143, + 0x8AF5: 144, + 0x8B41: 145, + 0x8B45: 146, + 0x8B49: 147, + 0x8B61: 148, + 0x8B62: 149, + 0x8B65: 150, + 0x8B68: 151, + 0x8B69: 152, + 0x8B6A: 153, + 0x8B71: 154, + 0x8B73: 155, + 0x8B75: 156, + 0x8B77: 157, + 0x8B81: 158, + 0x8BA1: 159, + 0x8BA2: 160, + 0x8BA5: 161, + 0x8BA8: 162, + 0x8BA9: 163, + 0x8BAB: 164, + 0x8BB1: 165, + 0x8BB3: 166, + 0x8BB5: 167, + 0x8BB7: 168, + 0x8BB8: 169, + 0x8BBC: 170, + 0x8C61: 171, + 0x8C62: 172, + 0x8C63: 173, + 0x8C65: 174, + 0x8C69: 175, + 0x8C6B: 176, + 0x8C71: 177, + 0x8C73: 178, + 0x8C75: 179, + 0x8C76: 180, + 0x8C77: 181, + 0x8C7B: 182, + 0x8C81: 183, + 0x8C82: 184, + 0x8C85: 185, + 0x8C89: 186, + 0x8C91: 187, + 0x8C93: 188, + 0x8C95: 189, + 0x8C96: 190, + 0x8C97: 191, + 0x8CA1: 192, + 0x8CA2: 193, + 0x8CA9: 194, + 0x8CE1: 195, + 0x8CE2: 196, + 0x8CE3: 197, + 0x8CE5: 198, + 0x8CE9: 199, + 0x8CF1: 200, + 0x8CF3: 201, + 0x8CF5: 202, + 0x8CF6: 203, + 0x8CF7: 204, + 0x8D41: 205, + 0x8D42: 206, + 0x8D45: 207, + 0x8D51: 208, + 0x8D55: 209, + 0x8D57: 210, + 0x8D61: 211, + 0x8D65: 212, + 0x8D69: 213, + 0x8D75: 214, + 0x8D76: 215, + 0x8D7B: 216, + 0x8D81: 217, + 0x8DA1: 218, + 0x8DA2: 219, + 0x8DA5: 220, + 0x8DA7: 221, + 0x8DA9: 222, + 0x8DB1: 223, + 0x8DB3: 224, + 0x8DB5: 225, + 0x8DB7: 226, + 0x8DB8: 227, + 0x8DB9: 228, + 0x8DC1: 229, + 0x8DC2: 230, + 0x8DC9: 231, + 0x8DD6: 232, + 0x8DD7: 233, + 0x8DE1: 234, + 0x8DE2: 235, + 0x8DF7: 236, + 0x8E41: 237, + 0x8E45: 238, + 0x8E49: 239, + 0x8E51: 240, + 0x8E53: 241, + 0x8E57: 242, + 0x8E61: 243, + 0x8E81: 244, + 0x8E82: 245, + 0x8E85: 246, + 0x8E89: 247, + 0x8E90: 248, + 0x8E91: 249, + 0x8E93: 250, + 0x8E95: 251, + 0x8E97: 252, + 0x8E98: 253, + 0x8EA1: 254, + 0x8EA9: 255, + 0x8EB6: 256, + 0x8EB7: 257, + 0x8EC1: 258, + 0x8EC2: 259, + 0x8EC5: 260, + 0x8EC9: 261, + 0x8ED1: 262, + 0x8ED3: 263, + 0x8ED6: 264, + 0x8EE1: 265, + 0x8EE5: 266, + 0x8EE9: 267, + 0x8EF1: 268, + 0x8EF3: 269, + 0x8F41: 270, + 0x8F61: 271, + 0x8F62: 272, + 0x8F65: 273, + 0x8F67: 274, + 0x8F69: 275, + 0x8F6B: 276, + 0x8F70: 277, + 0x8F71: 278, + 0x8F73: 279, + 0x8F75: 280, + 0x8F77: 281, + 0x8F7B: 282, + 0x8FA1: 283, + 0x8FA2: 284, + 0x8FA5: 285, + 0x8FA9: 286, + 0x8FB1: 287, + 0x8FB3: 288, + 0x8FB5: 289, + 0x8FB7: 290, + 0x9061: 291, + 0x9062: 292, + 0x9063: 293, + 0x9065: 294, + 0x9068: 295, + 0x9069: 296, + 0x906A: 297, + 0x906B: 298, + 0x9071: 299, + 0x9073: 300, + 0x9075: 301, + 0x9076: 302, + 0x9077: 303, + 0x9078: 304, + 0x9079: 305, + 0x907B: 306, + 0x907D: 307, + 0x9081: 308, + 0x9082: 309, + 0x9085: 310, + 0x9089: 311, + 0x9091: 312, + 0x9093: 313, + 0x9095: 314, + 0x9096: 315, + 0x9097: 316, + 0x90A1: 317, + 0x90A2: 318, + 0x90A5: 319, + 0x90A9: 320, + 0x90B1: 321, + 0x90B7: 322, + 0x90E1: 323, + 0x90E2: 324, + 0x90E4: 325, + 0x90E5: 326, + 0x90E9: 327, + 0x90EB: 328, + 0x90EC: 329, + 0x90F1: 330, + 0x90F3: 331, + 0x90F5: 332, + 0x90F6: 333, + 0x90F7: 334, + 0x90FD: 335, + 0x9141: 336, + 0x9142: 337, + 0x9145: 338, + 0x9149: 339, + 0x9151: 340, + 0x9153: 341, + 0x9155: 342, + 0x9156: 343, + 0x9157: 344, + 0x9161: 345, + 0x9162: 346, + 0x9165: 347, + 0x9169: 348, + 0x9171: 349, + 0x9173: 350, + 0x9176: 351, + 0x9177: 352, + 0x917A: 353, + 0x9181: 354, + 0x9185: 355, + 0x91A1: 356, + 0x91A2: 357, + 0x91A5: 358, + 0x91A9: 359, + 0x91AB: 360, + 0x91B1: 361, + 0x91B3: 362, + 0x91B5: 363, + 0x91B7: 364, + 0x91BC: 365, + 0x91BD: 366, + 0x91C1: 367, + 0x91C5: 368, + 0x91C9: 369, + 0x91D6: 370, + 0x9241: 371, + 0x9245: 372, + 0x9249: 373, + 0x9251: 374, + 0x9253: 375, + 0x9255: 376, + 0x9261: 377, + 0x9262: 378, + 0x9265: 379, + 0x9269: 380, + 0x9273: 381, + 0x9275: 382, + 0x9277: 383, + 0x9281: 384, + 0x9282: 385, + 0x9285: 386, + 0x9288: 387, + 0x9289: 388, + 0x9291: 389, + 0x9293: 390, + 0x9295: 391, + 0x9297: 392, + 0x92A1: 393, + 0x92B6: 394, + 0x92C1: 395, + 0x92E1: 396, + 0x92E5: 397, + 0x92E9: 398, + 0x92F1: 399, + 0x92F3: 400, + 0x9341: 401, + 0x9342: 402, + 0x9349: 403, + 0x9351: 404, + 0x9353: 405, + 0x9357: 406, + 0x9361: 407, + 0x9362: 408, + 0x9365: 409, + 0x9369: 410, + 0x936A: 411, + 0x936B: 412, + 0x9371: 413, + 0x9373: 414, + 0x9375: 415, + 0x9377: 416, + 0x9378: 417, + 0x937C: 418, + 0x9381: 419, + 0x9385: 420, + 0x9389: 421, + 0x93A1: 422, + 0x93A2: 423, + 0x93A5: 424, + 0x93A9: 425, + 0x93AB: 426, + 0x93B1: 427, + 0x93B3: 428, + 0x93B5: 429, + 0x93B7: 430, + 0x93BC: 431, + 0x9461: 432, + 0x9462: 433, + 0x9463: 434, + 0x9465: 435, + 0x9468: 436, + 0x9469: 437, + 0x946A: 438, + 0x946B: 439, + 0x946C: 440, + 0x9470: 441, + 0x9471: 442, + 0x9473: 443, + 0x9475: 444, + 0x9476: 445, + 0x9477: 446, + 0x9478: 447, + 0x9479: 448, + 0x947D: 449, + 0x9481: 450, + 0x9482: 451, + 0x9485: 452, + 0x9489: 453, + 0x9491: 454, + 0x9493: 455, + 0x9495: 456, + 0x9496: 457, + 0x9497: 458, + 0x94A1: 459, + 0x94E1: 460, + 0x94E2: 461, + 0x94E3: 462, + 0x94E5: 463, + 0x94E8: 464, + 0x94E9: 465, + 0x94EB: 466, + 0x94EC: 467, + 0x94F1: 468, + 0x94F3: 469, + 0x94F5: 470, + 0x94F7: 471, + 0x94F9: 472, + 0x94FC: 473, + 0x9541: 474, + 0x9542: 475, + 0x9545: 476, + 0x9549: 477, + 0x9551: 478, + 0x9553: 479, + 0x9555: 480, + 0x9556: 481, + 0x9557: 482, + 0x9561: 483, + 0x9565: 484, + 0x9569: 485, + 0x9576: 486, + 0x9577: 487, + 0x9581: 488, + 0x9585: 489, + 0x95A1: 490, + 0x95A2: 491, + 0x95A5: 492, + 0x95A8: 493, + 0x95A9: 494, + 0x95AB: 495, + 0x95AD: 496, + 0x95B1: 497, + 0x95B3: 498, + 0x95B5: 499, + 0x95B7: 500, + 0x95B9: 501, + 0x95BB: 502, + 0x95C1: 503, + 0x95C5: 504, + 0x95C9: 505, + 0x95E1: 506, + 0x95F6: 507, + 0x9641: 508, + 0x9645: 509, + 0x9649: 510, + 0x9651: 511, + 0x9653: 512, + 0x9655: 513, + 0x9661: 514, + 0x9681: 515, + 0x9682: 516, + 0x9685: 517, + 0x9689: 518, + 0x9691: 519, + 0x9693: 520, + 0x9695: 521, + 0x9697: 522, + 0x96A1: 523, + 0x96B6: 524, + 0x96C1: 525, + 0x96D7: 526, + 0x96E1: 527, + 0x96E5: 528, + 0x96E9: 529, + 0x96F3: 530, + 0x96F5: 531, + 0x96F7: 532, + 0x9741: 533, + 0x9745: 534, + 0x9749: 535, + 0x9751: 536, + 0x9757: 537, + 0x9761: 538, + 0x9762: 539, + 0x9765: 540, + 0x9768: 541, + 0x9769: 542, + 0x976B: 543, + 0x9771: 544, + 0x9773: 545, + 0x9775: 546, + 0x9777: 547, + 0x9781: 548, + 0x97A1: 549, + 0x97A2: 550, + 0x97A5: 551, + 0x97A8: 552, + 0x97A9: 553, + 0x97B1: 554, + 0x97B3: 555, + 0x97B5: 556, + 0x97B6: 557, + 0x97B7: 558, + 0x97B8: 559, + 0x9861: 560, + 0x9862: 561, + 0x9865: 562, + 0x9869: 563, + 0x9871: 564, + 0x9873: 565, + 0x9875: 566, + 0x9876: 567, + 0x9877: 568, + 0x987D: 569, + 0x9881: 570, + 0x9882: 571, + 0x9885: 572, + 0x9889: 573, + 0x9891: 574, + 0x9893: 575, + 0x9895: 576, + 0x9896: 577, + 0x9897: 578, + 0x98E1: 579, + 0x98E2: 580, + 0x98E5: 581, + 0x98E9: 582, + 0x98EB: 583, + 0x98EC: 584, + 0x98F1: 585, + 0x98F3: 586, + 0x98F5: 587, + 0x98F6: 588, + 0x98F7: 589, + 0x98FD: 590, + 0x9941: 591, + 0x9942: 592, + 0x9945: 593, + 0x9949: 594, + 0x9951: 595, + 0x9953: 596, + 0x9955: 597, + 0x9956: 598, + 0x9957: 599, + 0x9961: 600, + 0x9976: 601, + 0x99A1: 602, + 0x99A2: 603, + 0x99A5: 604, + 0x99A9: 605, + 0x99B7: 606, + 0x99C1: 607, + 0x99C9: 608, + 0x99E1: 609, + 0x9A41: 610, + 0x9A45: 611, + 0x9A81: 612, + 0x9A82: 613, + 0x9A85: 614, + 0x9A89: 615, + 0x9A90: 616, + 0x9A91: 617, + 0x9A97: 618, + 0x9AC1: 619, + 0x9AE1: 620, + 0x9AE5: 621, + 0x9AE9: 622, + 0x9AF1: 623, + 0x9AF3: 624, + 0x9AF7: 625, + 0x9B61: 626, + 0x9B62: 627, + 0x9B65: 628, + 0x9B68: 629, + 0x9B69: 630, + 0x9B71: 631, + 0x9B73: 632, + 0x9B75: 633, + 0x9B81: 634, + 0x9B85: 635, + 0x9B89: 636, + 0x9B91: 637, + 0x9B93: 638, + 0x9BA1: 639, + 0x9BA5: 640, + 0x9BA9: 641, + 0x9BB1: 642, + 0x9BB3: 643, + 0x9BB5: 644, + 0x9BB7: 645, + 0x9C61: 646, + 0x9C62: 647, + 0x9C65: 648, + 0x9C69: 649, + 0x9C71: 650, + 0x9C73: 651, + 0x9C75: 652, + 0x9C76: 653, + 0x9C77: 654, + 0x9C78: 655, + 0x9C7C: 656, + 0x9C7D: 657, + 0x9C81: 658, + 0x9C82: 659, + 0x9C85: 660, + 0x9C89: 661, + 0x9C91: 662, + 0x9C93: 663, + 0x9C95: 664, + 0x9C96: 665, + 0x9C97: 666, + 0x9CA1: 667, + 0x9CA2: 668, + 0x9CA5: 669, + 0x9CB5: 670, + 0x9CB7: 671, + 0x9CE1: 672, + 0x9CE2: 673, + 0x9CE5: 674, + 0x9CE9: 675, + 0x9CF1: 676, + 0x9CF3: 677, + 0x9CF5: 678, + 0x9CF6: 679, + 0x9CF7: 680, + 0x9CFD: 681, + 0x9D41: 682, + 0x9D42: 683, + 0x9D45: 684, + 0x9D49: 685, + 0x9D51: 686, + 0x9D53: 687, + 0x9D55: 688, + 0x9D57: 689, + 0x9D61: 690, + 0x9D62: 691, + 0x9D65: 692, + 0x9D69: 693, + 0x9D71: 694, + 0x9D73: 695, + 0x9D75: 696, + 0x9D76: 697, + 0x9D77: 698, + 0x9D81: 699, + 0x9D85: 700, + 0x9D93: 701, + 0x9D95: 702, + 0x9DA1: 703, + 0x9DA2: 704, + 0x9DA5: 705, + 0x9DA9: 706, + 0x9DB1: 707, + 0x9DB3: 708, + 0x9DB5: 709, + 0x9DB7: 710, + 0x9DC1: 711, + 0x9DC5: 712, + 0x9DD7: 713, + 0x9DF6: 714, + 0x9E41: 715, + 0x9E45: 716, + 0x9E49: 717, + 0x9E51: 718, + 0x9E53: 719, + 0x9E55: 720, + 0x9E57: 721, + 0x9E61: 722, + 0x9E65: 723, + 0x9E69: 724, + 0x9E73: 725, + 0x9E75: 726, + 0x9E77: 727, + 0x9E81: 728, + 0x9E82: 729, + 0x9E85: 730, + 0x9E89: 731, + 0x9E91: 732, + 0x9E93: 733, + 0x9E95: 734, + 0x9E97: 735, + 0x9EA1: 736, + 0x9EB6: 737, + 0x9EC1: 738, + 0x9EE1: 739, + 0x9EE2: 740, + 0x9EE5: 741, + 0x9EE9: 742, + 0x9EF1: 743, + 0x9EF5: 744, + 0x9EF7: 745, + 0x9F41: 746, + 0x9F42: 747, + 0x9F45: 748, + 0x9F49: 749, + 0x9F51: 750, + 0x9F53: 751, + 0x9F55: 752, + 0x9F57: 753, + 0x9F61: 754, + 0x9F62: 755, + 0x9F65: 756, + 0x9F69: 757, + 0x9F71: 758, + 0x9F73: 759, + 0x9F75: 760, + 0x9F77: 761, + 0x9F78: 762, + 0x9F7B: 763, + 0x9F7C: 764, + 0x9FA1: 765, + 0x9FA2: 766, + 0x9FA5: 767, + 0x9FA9: 768, + 0x9FB1: 769, + 0x9FB3: 770, + 0x9FB5: 771, + 0x9FB7: 772, + 0xA061: 773, + 0xA062: 774, + 0xA065: 775, + 0xA067: 776, + 0xA068: 777, + 0xA069: 778, + 0xA06A: 779, + 0xA06B: 780, + 0xA071: 781, + 0xA073: 782, + 0xA075: 783, + 0xA077: 784, + 0xA078: 785, + 0xA07B: 786, + 0xA07D: 787, + 0xA081: 788, + 0xA082: 789, + 0xA085: 790, + 0xA089: 791, + 0xA091: 792, + 0xA093: 793, + 0xA095: 794, + 0xA096: 795, + 0xA097: 796, + 0xA098: 797, + 0xA0A1: 798, + 0xA0A2: 799, + 0xA0A9: 800, + 0xA0B7: 801, + 0xA0E1: 802, + 0xA0E2: 803, + 0xA0E5: 804, + 0xA0E9: 805, + 0xA0EB: 806, + 0xA0F1: 807, + 0xA0F3: 808, + 0xA0F5: 809, + 0xA0F7: 810, + 0xA0F8: 811, + 0xA0FD: 812, + 0xA141: 813, + 0xA142: 814, + 0xA145: 815, + 0xA149: 816, + 0xA151: 817, + 0xA153: 818, + 0xA155: 819, + 0xA156: 820, + 0xA157: 821, + 0xA161: 822, + 0xA162: 823, + 0xA165: 824, + 0xA169: 825, + 0xA175: 826, + 0xA176: 827, + 0xA177: 828, + 0xA179: 829, + 0xA181: 830, + 0xA1A1: 831, + 0xA1A2: 832, + 0xA1A4: 833, + 0xA1A5: 834, + 0xA1A9: 835, + 0xA1AB: 836, + 0xA1B1: 837, + 0xA1B3: 838, + 0xA1B5: 839, + 0xA1B7: 840, + 0xA1C1: 841, + 0xA1C5: 842, + 0xA1D6: 843, + 0xA1D7: 844, + 0xA241: 845, + 0xA245: 846, + 0xA249: 847, + 0xA253: 848, + 0xA255: 849, + 0xA257: 850, + 0xA261: 851, + 0xA265: 852, + 0xA269: 853, + 0xA273: 854, + 0xA275: 855, + 0xA281: 856, + 0xA282: 857, + 0xA283: 858, + 0xA285: 859, + 0xA288: 860, + 0xA289: 861, + 0xA28A: 862, + 0xA28B: 863, + 0xA291: 864, + 0xA293: 865, + 0xA295: 866, + 0xA297: 867, + 0xA29B: 868, + 0xA29D: 869, + 0xA2A1: 870, + 0xA2A5: 871, + 0xA2A9: 872, + 0xA2B3: 873, + 0xA2B5: 874, + 0xA2C1: 875, + 0xA2E1: 876, + 0xA2E5: 877, + 0xA2E9: 878, + 0xA341: 879, + 0xA345: 880, + 0xA349: 881, + 0xA351: 882, + 0xA355: 883, + 0xA361: 884, + 0xA365: 885, + 0xA369: 886, + 0xA371: 887, + 0xA375: 888, + 0xA3A1: 889, + 0xA3A2: 890, + 0xA3A5: 891, + 0xA3A8: 892, + 0xA3A9: 893, + 0xA3AB: 894, + 0xA3B1: 895, + 0xA3B3: 896, + 0xA3B5: 897, + 0xA3B6: 898, + 0xA3B7: 899, + 0xA3B9: 900, + 0xA3BB: 901, + 0xA461: 902, + 0xA462: 903, + 0xA463: 904, + 0xA464: 905, + 0xA465: 906, + 0xA468: 907, + 0xA469: 908, + 0xA46A: 909, + 0xA46B: 910, + 0xA46C: 911, + 0xA471: 912, + 0xA473: 913, + 0xA475: 914, + 0xA477: 915, + 0xA47B: 916, + 0xA481: 917, + 0xA482: 918, + 0xA485: 919, + 0xA489: 920, + 0xA491: 921, + 0xA493: 922, + 0xA495: 923, + 0xA496: 924, + 0xA497: 925, + 0xA49B: 926, + 0xA4A1: 927, + 0xA4A2: 928, + 0xA4A5: 929, + 0xA4B3: 930, + 0xA4E1: 931, + 0xA4E2: 932, + 0xA4E5: 933, + 0xA4E8: 934, + 0xA4E9: 935, + 0xA4EB: 936, + 0xA4F1: 937, + 0xA4F3: 938, + 0xA4F5: 939, + 0xA4F7: 940, + 0xA4F8: 941, + 0xA541: 942, + 0xA542: 943, + 0xA545: 944, + 0xA548: 945, + 0xA549: 946, + 0xA551: 947, + 0xA553: 948, + 0xA555: 949, + 0xA556: 950, + 0xA557: 951, + 0xA561: 952, + 0xA562: 953, + 0xA565: 954, + 0xA569: 955, + 0xA573: 956, + 0xA575: 957, + 0xA576: 958, + 0xA577: 959, + 0xA57B: 960, + 0xA581: 961, + 0xA585: 962, + 0xA5A1: 963, + 0xA5A2: 964, + 0xA5A3: 965, + 0xA5A5: 966, + 0xA5A9: 967, + 0xA5B1: 968, + 0xA5B3: 969, + 0xA5B5: 970, + 0xA5B7: 971, + 0xA5C1: 972, + 0xA5C5: 973, + 0xA5D6: 974, + 0xA5E1: 975, + 0xA5F6: 976, + 0xA641: 977, + 0xA642: 978, + 0xA645: 979, + 0xA649: 980, + 0xA651: 981, + 0xA653: 982, + 0xA661: 983, + 0xA665: 984, + 0xA681: 985, + 0xA682: 986, + 0xA685: 987, + 0xA688: 988, + 0xA689: 989, + 0xA68A: 990, + 0xA68B: 991, + 0xA691: 992, + 0xA693: 993, + 0xA695: 994, + 0xA697: 995, + 0xA69B: 996, + 0xA69C: 997, + 0xA6A1: 998, + 0xA6A9: 999, + 0xA6B6: 1000, + 0xA6C1: 1001, + 0xA6E1: 1002, + 0xA6E2: 1003, + 0xA6E5: 1004, + 0xA6E9: 1005, + 0xA6F7: 1006, + 0xA741: 1007, + 0xA745: 1008, + 0xA749: 1009, + 0xA751: 1010, + 0xA755: 1011, + 0xA757: 1012, + 0xA761: 1013, + 0xA762: 1014, + 0xA765: 1015, + 0xA769: 1016, + 0xA771: 1017, + 0xA773: 1018, + 0xA775: 1019, + 0xA7A1: 1020, + 0xA7A2: 1021, + 0xA7A5: 1022, + 0xA7A9: 1023, + 0xA7AB: 1024, + 0xA7B1: 1025, + 0xA7B3: 1026, + 0xA7B5: 1027, + 0xA7B7: 1028, + 0xA7B8: 1029, + 0xA7B9: 1030, + 0xA861: 1031, + 0xA862: 1032, + 0xA865: 1033, + 0xA869: 1034, + 0xA86B: 1035, + 0xA871: 1036, + 0xA873: 1037, + 0xA875: 1038, + 0xA876: 1039, + 0xA877: 1040, + 0xA87D: 1041, + 0xA881: 1042, + 0xA882: 1043, + 0xA885: 1044, + 0xA889: 1045, + 0xA891: 1046, + 0xA893: 1047, + 0xA895: 1048, + 0xA896: 1049, + 0xA897: 1050, + 0xA8A1: 1051, + 0xA8A2: 1052, + 0xA8B1: 1053, + 0xA8E1: 1054, + 0xA8E2: 1055, + 0xA8E5: 1056, + 0xA8E8: 1057, + 0xA8E9: 1058, + 0xA8F1: 1059, + 0xA8F5: 1060, + 0xA8F6: 1061, + 0xA8F7: 1062, + 0xA941: 1063, + 0xA957: 1064, + 0xA961: 1065, + 0xA962: 1066, + 0xA971: 1067, + 0xA973: 1068, + 0xA975: 1069, + 0xA976: 1070, + 0xA977: 1071, + 0xA9A1: 1072, + 0xA9A2: 1073, + 0xA9A5: 1074, + 0xA9A9: 1075, + 0xA9B1: 1076, + 0xA9B3: 1077, + 0xA9B7: 1078, + 0xAA41: 1079, + 0xAA61: 1080, + 0xAA77: 1081, + 0xAA81: 1082, + 0xAA82: 1083, + 0xAA85: 1084, + 0xAA89: 1085, + 0xAA91: 1086, + 0xAA95: 1087, + 0xAA97: 1088, + 0xAB41: 1089, + 0xAB57: 1090, + 0xAB61: 1091, + 0xAB65: 1092, + 0xAB69: 1093, + 0xAB71: 1094, + 0xAB73: 1095, + 0xABA1: 1096, + 0xABA2: 1097, + 0xABA5: 1098, + 0xABA9: 1099, + 0xABB1: 1100, + 0xABB3: 1101, + 0xABB5: 1102, + 0xABB7: 1103, + 0xAC61: 1104, + 0xAC62: 1105, + 0xAC64: 1106, + 0xAC65: 1107, + 0xAC68: 1108, + 0xAC69: 1109, + 0xAC6A: 1110, + 0xAC6B: 1111, + 0xAC71: 1112, + 0xAC73: 1113, + 0xAC75: 1114, + 0xAC76: 1115, + 0xAC77: 1116, + 0xAC7B: 1117, + 0xAC81: 1118, + 0xAC82: 1119, + 0xAC85: 1120, + 0xAC89: 1121, + 0xAC91: 1122, + 0xAC93: 1123, + 0xAC95: 1124, + 0xAC96: 1125, + 0xAC97: 1126, + 0xACA1: 1127, + 0xACA2: 1128, + 0xACA5: 1129, + 0xACA9: 1130, + 0xACB1: 1131, + 0xACB3: 1132, + 0xACB5: 1133, + 0xACB7: 1134, + 0xACC1: 1135, + 0xACC5: 1136, + 0xACC9: 1137, + 0xACD1: 1138, + 0xACD7: 1139, + 0xACE1: 1140, + 0xACE2: 1141, + 0xACE3: 1142, + 0xACE4: 1143, + 0xACE5: 1144, + 0xACE8: 1145, + 0xACE9: 1146, + 0xACEB: 1147, + 0xACEC: 1148, + 0xACF1: 1149, + 0xACF3: 1150, + 0xACF5: 1151, + 0xACF6: 1152, + 0xACF7: 1153, + 0xACFC: 1154, + 0xAD41: 1155, + 0xAD42: 1156, + 0xAD45: 1157, + 0xAD49: 1158, + 0xAD51: 1159, + 0xAD53: 1160, + 0xAD55: 1161, + 0xAD56: 1162, + 0xAD57: 1163, + 0xAD61: 1164, + 0xAD62: 1165, + 0xAD65: 1166, + 0xAD69: 1167, + 0xAD71: 1168, + 0xAD73: 1169, + 0xAD75: 1170, + 0xAD76: 1171, + 0xAD77: 1172, + 0xAD81: 1173, + 0xAD85: 1174, + 0xAD89: 1175, + 0xAD97: 1176, + 0xADA1: 1177, + 0xADA2: 1178, + 0xADA3: 1179, + 0xADA5: 1180, + 0xADA9: 1181, + 0xADAB: 1182, + 0xADB1: 1183, + 0xADB3: 1184, + 0xADB5: 1185, + 0xADB7: 1186, + 0xADBB: 1187, + 0xADC1: 1188, + 0xADC2: 1189, + 0xADC5: 1190, + 0xADC9: 1191, + 0xADD7: 1192, + 0xADE1: 1193, + 0xADE5: 1194, + 0xADE9: 1195, + 0xADF1: 1196, + 0xADF5: 1197, + 0xADF6: 1198, + 0xAE41: 1199, + 0xAE45: 1200, + 0xAE49: 1201, + 0xAE51: 1202, + 0xAE53: 1203, + 0xAE55: 1204, + 0xAE61: 1205, + 0xAE62: 1206, + 0xAE65: 1207, + 0xAE69: 1208, + 0xAE71: 1209, + 0xAE73: 1210, + 0xAE75: 1211, + 0xAE77: 1212, + 0xAE81: 1213, + 0xAE82: 1214, + 0xAE85: 1215, + 0xAE88: 1216, + 0xAE89: 1217, + 0xAE91: 1218, + 0xAE93: 1219, + 0xAE95: 1220, + 0xAE97: 1221, + 0xAE99: 1222, + 0xAE9B: 1223, + 0xAE9C: 1224, + 0xAEA1: 1225, + 0xAEB6: 1226, + 0xAEC1: 1227, + 0xAEC2: 1228, + 0xAEC5: 1229, + 0xAEC9: 1230, + 0xAED1: 1231, + 0xAED7: 1232, + 0xAEE1: 1233, + 0xAEE2: 1234, + 0xAEE5: 1235, + 0xAEE9: 1236, + 0xAEF1: 1237, + 0xAEF3: 1238, + 0xAEF5: 1239, + 0xAEF7: 1240, + 0xAF41: 1241, + 0xAF42: 1242, + 0xAF49: 1243, + 0xAF51: 1244, + 0xAF55: 1245, + 0xAF57: 1246, + 0xAF61: 1247, + 0xAF62: 1248, + 0xAF65: 1249, + 0xAF69: 1250, + 0xAF6A: 1251, + 0xAF71: 1252, + 0xAF73: 1253, + 0xAF75: 1254, + 0xAF77: 1255, + 0xAFA1: 1256, + 0xAFA2: 1257, + 0xAFA5: 1258, + 0xAFA8: 1259, + 0xAFA9: 1260, + 0xAFB0: 1261, + 0xAFB1: 1262, + 0xAFB3: 1263, + 0xAFB5: 1264, + 0xAFB7: 1265, + 0xAFBC: 1266, + 0xB061: 1267, + 0xB062: 1268, + 0xB064: 1269, + 0xB065: 1270, + 0xB069: 1271, + 0xB071: 1272, + 0xB073: 1273, + 0xB076: 1274, + 0xB077: 1275, + 0xB07D: 1276, + 0xB081: 1277, + 0xB082: 1278, + 0xB085: 1279, + 0xB089: 1280, + 0xB091: 1281, + 0xB093: 1282, + 0xB096: 1283, + 0xB097: 1284, + 0xB0B7: 1285, + 0xB0E1: 1286, + 0xB0E2: 1287, + 0xB0E5: 1288, + 0xB0E9: 1289, + 0xB0EB: 1290, + 0xB0F1: 1291, + 0xB0F3: 1292, + 0xB0F6: 1293, + 0xB0F7: 1294, + 0xB141: 1295, + 0xB145: 1296, + 0xB149: 1297, + 0xB185: 1298, + 0xB1A1: 1299, + 0xB1A2: 1300, + 0xB1A5: 1301, + 0xB1A8: 1302, + 0xB1A9: 1303, + 0xB1AB: 1304, + 0xB1B1: 1305, + 0xB1B3: 1306, + 0xB1B7: 1307, + 0xB1C1: 1308, + 0xB1C2: 1309, + 0xB1C5: 1310, + 0xB1D6: 1311, + 0xB1E1: 1312, + 0xB1F6: 1313, + 0xB241: 1314, + 0xB245: 1315, + 0xB249: 1316, + 0xB251: 1317, + 0xB253: 1318, + 0xB261: 1319, + 0xB281: 1320, + 0xB282: 1321, + 0xB285: 1322, + 0xB289: 1323, + 0xB291: 1324, + 0xB293: 1325, + 0xB297: 1326, + 0xB2A1: 1327, + 0xB2B6: 1328, + 0xB2C1: 1329, + 0xB2E1: 1330, + 0xB2E5: 1331, + 0xB357: 1332, + 0xB361: 1333, + 0xB362: 1334, + 0xB365: 1335, + 0xB369: 1336, + 0xB36B: 1337, + 0xB370: 1338, + 0xB371: 1339, + 0xB373: 1340, + 0xB381: 1341, + 0xB385: 1342, + 0xB389: 1343, + 0xB391: 1344, + 0xB3A1: 1345, + 0xB3A2: 1346, + 0xB3A5: 1347, + 0xB3A9: 1348, + 0xB3B1: 1349, + 0xB3B3: 1350, + 0xB3B5: 1351, + 0xB3B7: 1352, + 0xB461: 1353, + 0xB462: 1354, + 0xB465: 1355, + 0xB466: 1356, + 0xB467: 1357, + 0xB469: 1358, + 0xB46A: 1359, + 0xB46B: 1360, + 0xB470: 1361, + 0xB471: 1362, + 0xB473: 1363, + 0xB475: 1364, + 0xB476: 1365, + 0xB477: 1366, + 0xB47B: 1367, + 0xB47C: 1368, + 0xB481: 1369, + 0xB482: 1370, + 0xB485: 1371, + 0xB489: 1372, + 0xB491: 1373, + 0xB493: 1374, + 0xB495: 1375, + 0xB496: 1376, + 0xB497: 1377, + 0xB4A1: 1378, + 0xB4A2: 1379, + 0xB4A5: 1380, + 0xB4A9: 1381, + 0xB4AC: 1382, + 0xB4B1: 1383, + 0xB4B3: 1384, + 0xB4B5: 1385, + 0xB4B7: 1386, + 0xB4BB: 1387, + 0xB4BD: 1388, + 0xB4C1: 1389, + 0xB4C5: 1390, + 0xB4C9: 1391, + 0xB4D3: 1392, + 0xB4E1: 1393, + 0xB4E2: 1394, + 0xB4E5: 1395, + 0xB4E6: 1396, + 0xB4E8: 1397, + 0xB4E9: 1398, + 0xB4EA: 1399, + 0xB4EB: 1400, + 0xB4F1: 1401, + 0xB4F3: 1402, + 0xB4F4: 1403, + 0xB4F5: 1404, + 0xB4F6: 1405, + 0xB4F7: 1406, + 0xB4F8: 1407, + 0xB4FA: 1408, + 0xB4FC: 1409, + 0xB541: 1410, + 0xB542: 1411, + 0xB545: 1412, + 0xB549: 1413, + 0xB551: 1414, + 0xB553: 1415, + 0xB555: 1416, + 0xB557: 1417, + 0xB561: 1418, + 0xB562: 1419, + 0xB563: 1420, + 0xB565: 1421, + 0xB569: 1422, + 0xB56B: 1423, + 0xB56C: 1424, + 0xB571: 1425, + 0xB573: 1426, + 0xB574: 1427, + 0xB575: 1428, + 0xB576: 1429, + 0xB577: 1430, + 0xB57B: 1431, + 0xB57C: 1432, + 0xB57D: 1433, + 0xB581: 1434, + 0xB585: 1435, + 0xB589: 1436, + 0xB591: 1437, + 0xB593: 1438, + 0xB595: 1439, + 0xB596: 1440, + 0xB5A1: 1441, + 0xB5A2: 1442, + 0xB5A5: 1443, + 0xB5A9: 1444, + 0xB5AA: 1445, + 0xB5AB: 1446, + 0xB5AD: 1447, + 0xB5B0: 1448, + 0xB5B1: 1449, + 0xB5B3: 1450, + 0xB5B5: 1451, + 0xB5B7: 1452, + 0xB5B9: 1453, + 0xB5C1: 1454, + 0xB5C2: 1455, + 0xB5C5: 1456, + 0xB5C9: 1457, + 0xB5D1: 1458, + 0xB5D3: 1459, + 0xB5D5: 1460, + 0xB5D6: 1461, + 0xB5D7: 1462, + 0xB5E1: 1463, + 0xB5E2: 1464, + 0xB5E5: 1465, + 0xB5F1: 1466, + 0xB5F5: 1467, + 0xB5F7: 1468, + 0xB641: 1469, + 0xB642: 1470, + 0xB645: 1471, + 0xB649: 1472, + 0xB651: 1473, + 0xB653: 1474, + 0xB655: 1475, + 0xB657: 1476, + 0xB661: 1477, + 0xB662: 1478, + 0xB665: 1479, + 0xB669: 1480, + 0xB671: 1481, + 0xB673: 1482, + 0xB675: 1483, + 0xB677: 1484, + 0xB681: 1485, + 0xB682: 1486, + 0xB685: 1487, + 0xB689: 1488, + 0xB68A: 1489, + 0xB68B: 1490, + 0xB691: 1491, + 0xB693: 1492, + 0xB695: 1493, + 0xB697: 1494, + 0xB6A1: 1495, + 0xB6A2: 1496, + 0xB6A5: 1497, + 0xB6A9: 1498, + 0xB6B1: 1499, + 0xB6B3: 1500, + 0xB6B6: 1501, + 0xB6B7: 1502, + 0xB6C1: 1503, + 0xB6C2: 1504, + 0xB6C5: 1505, + 0xB6C9: 1506, + 0xB6D1: 1507, + 0xB6D3: 1508, + 0xB6D7: 1509, + 0xB6E1: 1510, + 0xB6E2: 1511, + 0xB6E5: 1512, + 0xB6E9: 1513, + 0xB6F1: 1514, + 0xB6F3: 1515, + 0xB6F5: 1516, + 0xB6F7: 1517, + 0xB741: 1518, + 0xB742: 1519, + 0xB745: 1520, + 0xB749: 1521, + 0xB751: 1522, + 0xB753: 1523, + 0xB755: 1524, + 0xB757: 1525, + 0xB759: 1526, + 0xB761: 1527, + 0xB762: 1528, + 0xB765: 1529, + 0xB769: 1530, + 0xB76F: 1531, + 0xB771: 1532, + 0xB773: 1533, + 0xB775: 1534, + 0xB777: 1535, + 0xB778: 1536, + 0xB779: 1537, + 0xB77A: 1538, + 0xB77B: 1539, + 0xB77C: 1540, + 0xB77D: 1541, + 0xB781: 1542, + 0xB785: 1543, + 0xB789: 1544, + 0xB791: 1545, + 0xB795: 1546, + 0xB7A1: 1547, + 0xB7A2: 1548, + 0xB7A5: 1549, + 0xB7A9: 1550, + 0xB7AA: 1551, + 0xB7AB: 1552, + 0xB7B0: 1553, + 0xB7B1: 1554, + 0xB7B3: 1555, + 0xB7B5: 1556, + 0xB7B6: 1557, + 0xB7B7: 1558, + 0xB7B8: 1559, + 0xB7BC: 1560, + 0xB861: 1561, + 0xB862: 1562, + 0xB865: 1563, + 0xB867: 1564, + 0xB868: 1565, + 0xB869: 1566, + 0xB86B: 1567, + 0xB871: 1568, + 0xB873: 1569, + 0xB875: 1570, + 0xB876: 1571, + 0xB877: 1572, + 0xB878: 1573, + 0xB881: 1574, + 0xB882: 1575, + 0xB885: 1576, + 0xB889: 1577, + 0xB891: 1578, + 0xB893: 1579, + 0xB895: 1580, + 0xB896: 1581, + 0xB897: 1582, + 0xB8A1: 1583, + 0xB8A2: 1584, + 0xB8A5: 1585, + 0xB8A7: 1586, + 0xB8A9: 1587, + 0xB8B1: 1588, + 0xB8B7: 1589, + 0xB8C1: 1590, + 0xB8C5: 1591, + 0xB8C9: 1592, + 0xB8E1: 1593, + 0xB8E2: 1594, + 0xB8E5: 1595, + 0xB8E9: 1596, + 0xB8EB: 1597, + 0xB8F1: 1598, + 0xB8F3: 1599, + 0xB8F5: 1600, + 0xB8F7: 1601, + 0xB8F8: 1602, + 0xB941: 1603, + 0xB942: 1604, + 0xB945: 1605, + 0xB949: 1606, + 0xB951: 1607, + 0xB953: 1608, + 0xB955: 1609, + 0xB957: 1610, + 0xB961: 1611, + 0xB965: 1612, + 0xB969: 1613, + 0xB971: 1614, + 0xB973: 1615, + 0xB976: 1616, + 0xB977: 1617, + 0xB981: 1618, + 0xB9A1: 1619, + 0xB9A2: 1620, + 0xB9A5: 1621, + 0xB9A9: 1622, + 0xB9AB: 1623, + 0xB9B1: 1624, + 0xB9B3: 1625, + 0xB9B5: 1626, + 0xB9B7: 1627, + 0xB9B8: 1628, + 0xB9B9: 1629, + 0xB9BD: 1630, + 0xB9C1: 1631, + 0xB9C2: 1632, + 0xB9C9: 1633, + 0xB9D3: 1634, + 0xB9D5: 1635, + 0xB9D7: 1636, + 0xB9E1: 1637, + 0xB9F6: 1638, + 0xB9F7: 1639, + 0xBA41: 1640, + 0xBA45: 1641, + 0xBA49: 1642, + 0xBA51: 1643, + 0xBA53: 1644, + 0xBA55: 1645, + 0xBA57: 1646, + 0xBA61: 1647, + 0xBA62: 1648, + 0xBA65: 1649, + 0xBA77: 1650, + 0xBA81: 1651, + 0xBA82: 1652, + 0xBA85: 1653, + 0xBA89: 1654, + 0xBA8A: 1655, + 0xBA8B: 1656, + 0xBA91: 1657, + 0xBA93: 1658, + 0xBA95: 1659, + 0xBA97: 1660, + 0xBAA1: 1661, + 0xBAB6: 1662, + 0xBAC1: 1663, + 0xBAE1: 1664, + 0xBAE2: 1665, + 0xBAE5: 1666, + 0xBAE9: 1667, + 0xBAF1: 1668, + 0xBAF3: 1669, + 0xBAF5: 1670, + 0xBB41: 1671, + 0xBB45: 1672, + 0xBB49: 1673, + 0xBB51: 1674, + 0xBB61: 1675, + 0xBB62: 1676, + 0xBB65: 1677, + 0xBB69: 1678, + 0xBB71: 1679, + 0xBB73: 1680, + 0xBB75: 1681, + 0xBB77: 1682, + 0xBBA1: 1683, + 0xBBA2: 1684, + 0xBBA5: 1685, + 0xBBA8: 1686, + 0xBBA9: 1687, + 0xBBAB: 1688, + 0xBBB1: 1689, + 0xBBB3: 1690, + 0xBBB5: 1691, + 0xBBB7: 1692, + 0xBBB8: 1693, + 0xBBBB: 1694, + 0xBBBC: 1695, + 0xBC61: 1696, + 0xBC62: 1697, + 0xBC65: 1698, + 0xBC67: 1699, + 0xBC69: 1700, + 0xBC6C: 1701, + 0xBC71: 1702, + 0xBC73: 1703, + 0xBC75: 1704, + 0xBC76: 1705, + 0xBC77: 1706, + 0xBC81: 1707, + 0xBC82: 1708, + 0xBC85: 1709, + 0xBC89: 1710, + 0xBC91: 1711, + 0xBC93: 1712, + 0xBC95: 1713, + 0xBC96: 1714, + 0xBC97: 1715, + 0xBCA1: 1716, + 0xBCA5: 1717, + 0xBCB7: 1718, + 0xBCE1: 1719, + 0xBCE2: 1720, + 0xBCE5: 1721, + 0xBCE9: 1722, + 0xBCF1: 1723, + 0xBCF3: 1724, + 0xBCF5: 1725, + 0xBCF6: 1726, + 0xBCF7: 1727, + 0xBD41: 1728, + 0xBD57: 1729, + 0xBD61: 1730, + 0xBD76: 1731, + 0xBDA1: 1732, + 0xBDA2: 1733, + 0xBDA5: 1734, + 0xBDA9: 1735, + 0xBDB1: 1736, + 0xBDB3: 1737, + 0xBDB5: 1738, + 0xBDB7: 1739, + 0xBDB9: 1740, + 0xBDC1: 1741, + 0xBDC2: 1742, + 0xBDC9: 1743, + 0xBDD6: 1744, + 0xBDE1: 1745, + 0xBDF6: 1746, + 0xBE41: 1747, + 0xBE45: 1748, + 0xBE49: 1749, + 0xBE51: 1750, + 0xBE53: 1751, + 0xBE77: 1752, + 0xBE81: 1753, + 0xBE82: 1754, + 0xBE85: 1755, + 0xBE89: 1756, + 0xBE91: 1757, + 0xBE93: 1758, + 0xBE97: 1759, + 0xBEA1: 1760, + 0xBEB6: 1761, + 0xBEB7: 1762, + 0xBEE1: 1763, + 0xBF41: 1764, + 0xBF61: 1765, + 0xBF71: 1766, + 0xBF75: 1767, + 0xBF77: 1768, + 0xBFA1: 1769, + 0xBFA2: 1770, + 0xBFA5: 1771, + 0xBFA9: 1772, + 0xBFB1: 1773, + 0xBFB3: 1774, + 0xBFB7: 1775, + 0xBFB8: 1776, + 0xBFBD: 1777, + 0xC061: 1778, + 0xC062: 1779, + 0xC065: 1780, + 0xC067: 1781, + 0xC069: 1782, + 0xC071: 1783, + 0xC073: 1784, + 0xC075: 1785, + 0xC076: 1786, + 0xC077: 1787, + 0xC078: 1788, + 0xC081: 1789, + 0xC082: 1790, + 0xC085: 1791, + 0xC089: 1792, + 0xC091: 1793, + 0xC093: 1794, + 0xC095: 1795, + 0xC096: 1796, + 0xC097: 1797, + 0xC0A1: 1798, + 0xC0A5: 1799, + 0xC0A7: 1800, + 0xC0A9: 1801, + 0xC0B1: 1802, + 0xC0B7: 1803, + 0xC0E1: 1804, + 0xC0E2: 1805, + 0xC0E5: 1806, + 0xC0E9: 1807, + 0xC0F1: 1808, + 0xC0F3: 1809, + 0xC0F5: 1810, + 0xC0F6: 1811, + 0xC0F7: 1812, + 0xC141: 1813, + 0xC142: 1814, + 0xC145: 1815, + 0xC149: 1816, + 0xC151: 1817, + 0xC153: 1818, + 0xC155: 1819, + 0xC157: 1820, + 0xC161: 1821, + 0xC165: 1822, + 0xC176: 1823, + 0xC181: 1824, + 0xC185: 1825, + 0xC197: 1826, + 0xC1A1: 1827, + 0xC1A2: 1828, + 0xC1A5: 1829, + 0xC1A9: 1830, + 0xC1B1: 1831, + 0xC1B3: 1832, + 0xC1B5: 1833, + 0xC1B7: 1834, + 0xC1C1: 1835, + 0xC1C5: 1836, + 0xC1C9: 1837, + 0xC1D7: 1838, + 0xC241: 1839, + 0xC245: 1840, + 0xC249: 1841, + 0xC251: 1842, + 0xC253: 1843, + 0xC255: 1844, + 0xC257: 1845, + 0xC261: 1846, + 0xC271: 1847, + 0xC281: 1848, + 0xC282: 1849, + 0xC285: 1850, + 0xC289: 1851, + 0xC291: 1852, + 0xC293: 1853, + 0xC295: 1854, + 0xC297: 1855, + 0xC2A1: 1856, + 0xC2B6: 1857, + 0xC2C1: 1858, + 0xC2C5: 1859, + 0xC2E1: 1860, + 0xC2E5: 1861, + 0xC2E9: 1862, + 0xC2F1: 1863, + 0xC2F3: 1864, + 0xC2F5: 1865, + 0xC2F7: 1866, + 0xC341: 1867, + 0xC345: 1868, + 0xC349: 1869, + 0xC351: 1870, + 0xC357: 1871, + 0xC361: 1872, + 0xC362: 1873, + 0xC365: 1874, + 0xC369: 1875, + 0xC371: 1876, + 0xC373: 1877, + 0xC375: 1878, + 0xC377: 1879, + 0xC3A1: 1880, + 0xC3A2: 1881, + 0xC3A5: 1882, + 0xC3A8: 1883, + 0xC3A9: 1884, + 0xC3AA: 1885, + 0xC3B1: 1886, + 0xC3B3: 1887, + 0xC3B5: 1888, + 0xC3B7: 1889, + 0xC461: 1890, + 0xC462: 1891, + 0xC465: 1892, + 0xC469: 1893, + 0xC471: 1894, + 0xC473: 1895, + 0xC475: 1896, + 0xC477: 1897, + 0xC481: 1898, + 0xC482: 1899, + 0xC485: 1900, + 0xC489: 1901, + 0xC491: 1902, + 0xC493: 1903, + 0xC495: 1904, + 0xC496: 1905, + 0xC497: 1906, + 0xC4A1: 1907, + 0xC4A2: 1908, + 0xC4B7: 1909, + 0xC4E1: 1910, + 0xC4E2: 1911, + 0xC4E5: 1912, + 0xC4E8: 1913, + 0xC4E9: 1914, + 0xC4F1: 1915, + 0xC4F3: 1916, + 0xC4F5: 1917, + 0xC4F6: 1918, + 0xC4F7: 1919, + 0xC541: 1920, + 0xC542: 1921, + 0xC545: 1922, + 0xC549: 1923, + 0xC551: 1924, + 0xC553: 1925, + 0xC555: 1926, + 0xC557: 1927, + 0xC561: 1928, + 0xC565: 1929, + 0xC569: 1930, + 0xC571: 1931, + 0xC573: 1932, + 0xC575: 1933, + 0xC576: 1934, + 0xC577: 1935, + 0xC581: 1936, + 0xC5A1: 1937, + 0xC5A2: 1938, + 0xC5A5: 1939, + 0xC5A9: 1940, + 0xC5B1: 1941, + 0xC5B3: 1942, + 0xC5B5: 1943, + 0xC5B7: 1944, + 0xC5C1: 1945, + 0xC5C2: 1946, + 0xC5C5: 1947, + 0xC5C9: 1948, + 0xC5D1: 1949, + 0xC5D7: 1950, + 0xC5E1: 1951, + 0xC5F7: 1952, + 0xC641: 1953, + 0xC649: 1954, + 0xC661: 1955, + 0xC681: 1956, + 0xC682: 1957, + 0xC685: 1958, + 0xC689: 1959, + 0xC691: 1960, + 0xC693: 1961, + 0xC695: 1962, + 0xC697: 1963, + 0xC6A1: 1964, + 0xC6A5: 1965, + 0xC6A9: 1966, + 0xC6B7: 1967, + 0xC6C1: 1968, + 0xC6D7: 1969, + 0xC6E1: 1970, + 0xC6E2: 1971, + 0xC6E5: 1972, + 0xC6E9: 1973, + 0xC6F1: 1974, + 0xC6F3: 1975, + 0xC6F5: 1976, + 0xC6F7: 1977, + 0xC741: 1978, + 0xC745: 1979, + 0xC749: 1980, + 0xC751: 1981, + 0xC761: 1982, + 0xC762: 1983, + 0xC765: 1984, + 0xC769: 1985, + 0xC771: 1986, + 0xC773: 1987, + 0xC777: 1988, + 0xC7A1: 1989, + 0xC7A2: 1990, + 0xC7A5: 1991, + 0xC7A9: 1992, + 0xC7B1: 1993, + 0xC7B3: 1994, + 0xC7B5: 1995, + 0xC7B7: 1996, + 0xC861: 1997, + 0xC862: 1998, + 0xC865: 1999, + 0xC869: 2000, + 0xC86A: 2001, + 0xC871: 2002, + 0xC873: 2003, + 0xC875: 2004, + 0xC876: 2005, + 0xC877: 2006, + 0xC881: 2007, + 0xC882: 2008, + 0xC885: 2009, + 0xC889: 2010, + 0xC891: 2011, + 0xC893: 2012, + 0xC895: 2013, + 0xC896: 2014, + 0xC897: 2015, + 0xC8A1: 2016, + 0xC8B7: 2017, + 0xC8E1: 2018, + 0xC8E2: 2019, + 0xC8E5: 2020, + 0xC8E9: 2021, + 0xC8EB: 2022, + 0xC8F1: 2023, + 0xC8F3: 2024, + 0xC8F5: 2025, + 0xC8F6: 2026, + 0xC8F7: 2027, + 0xC941: 2028, + 0xC942: 2029, + 0xC945: 2030, + 0xC949: 2031, + 0xC951: 2032, + 0xC953: 2033, + 0xC955: 2034, + 0xC957: 2035, + 0xC961: 2036, + 0xC965: 2037, + 0xC976: 2038, + 0xC981: 2039, + 0xC985: 2040, + 0xC9A1: 2041, + 0xC9A2: 2042, + 0xC9A5: 2043, + 0xC9A9: 2044, + 0xC9B1: 2045, + 0xC9B3: 2046, + 0xC9B5: 2047, + 0xC9B7: 2048, + 0xC9BC: 2049, + 0xC9C1: 2050, + 0xC9C5: 2051, + 0xC9E1: 2052, + 0xCA41: 2053, + 0xCA45: 2054, + 0xCA55: 2055, + 0xCA57: 2056, + 0xCA61: 2057, + 0xCA81: 2058, + 0xCA82: 2059, + 0xCA85: 2060, + 0xCA89: 2061, + 0xCA91: 2062, + 0xCA93: 2063, + 0xCA95: 2064, + 0xCA97: 2065, + 0xCAA1: 2066, + 0xCAB6: 2067, + 0xCAC1: 2068, + 0xCAE1: 2069, + 0xCAE2: 2070, + 0xCAE5: 2071, + 0xCAE9: 2072, + 0xCAF1: 2073, + 0xCAF3: 2074, + 0xCAF7: 2075, + 0xCB41: 2076, + 0xCB45: 2077, + 0xCB49: 2078, + 0xCB51: 2079, + 0xCB57: 2080, + 0xCB61: 2081, + 0xCB62: 2082, + 0xCB65: 2083, + 0xCB68: 2084, + 0xCB69: 2085, + 0xCB6B: 2086, + 0xCB71: 2087, + 0xCB73: 2088, + 0xCB75: 2089, + 0xCB81: 2090, + 0xCB85: 2091, + 0xCB89: 2092, + 0xCB91: 2093, + 0xCB93: 2094, + 0xCBA1: 2095, + 0xCBA2: 2096, + 0xCBA5: 2097, + 0xCBA9: 2098, + 0xCBB1: 2099, + 0xCBB3: 2100, + 0xCBB5: 2101, + 0xCBB7: 2102, + 0xCC61: 2103, + 0xCC62: 2104, + 0xCC63: 2105, + 0xCC65: 2106, + 0xCC69: 2107, + 0xCC6B: 2108, + 0xCC71: 2109, + 0xCC73: 2110, + 0xCC75: 2111, + 0xCC76: 2112, + 0xCC77: 2113, + 0xCC7B: 2114, + 0xCC81: 2115, + 0xCC82: 2116, + 0xCC85: 2117, + 0xCC89: 2118, + 0xCC91: 2119, + 0xCC93: 2120, + 0xCC95: 2121, + 0xCC96: 2122, + 0xCC97: 2123, + 0xCCA1: 2124, + 0xCCA2: 2125, + 0xCCE1: 2126, + 0xCCE2: 2127, + 0xCCE5: 2128, + 0xCCE9: 2129, + 0xCCF1: 2130, + 0xCCF3: 2131, + 0xCCF5: 2132, + 0xCCF6: 2133, + 0xCCF7: 2134, + 0xCD41: 2135, + 0xCD42: 2136, + 0xCD45: 2137, + 0xCD49: 2138, + 0xCD51: 2139, + 0xCD53: 2140, + 0xCD55: 2141, + 0xCD57: 2142, + 0xCD61: 2143, + 0xCD65: 2144, + 0xCD69: 2145, + 0xCD71: 2146, + 0xCD73: 2147, + 0xCD76: 2148, + 0xCD77: 2149, + 0xCD81: 2150, + 0xCD89: 2151, + 0xCD93: 2152, + 0xCD95: 2153, + 0xCDA1: 2154, + 0xCDA2: 2155, + 0xCDA5: 2156, + 0xCDA9: 2157, + 0xCDB1: 2158, + 0xCDB3: 2159, + 0xCDB5: 2160, + 0xCDB7: 2161, + 0xCDC1: 2162, + 0xCDD7: 2163, + 0xCE41: 2164, + 0xCE45: 2165, + 0xCE61: 2166, + 0xCE65: 2167, + 0xCE69: 2168, + 0xCE73: 2169, + 0xCE75: 2170, + 0xCE81: 2171, + 0xCE82: 2172, + 0xCE85: 2173, + 0xCE88: 2174, + 0xCE89: 2175, + 0xCE8B: 2176, + 0xCE91: 2177, + 0xCE93: 2178, + 0xCE95: 2179, + 0xCE97: 2180, + 0xCEA1: 2181, + 0xCEB7: 2182, + 0xCEE1: 2183, + 0xCEE5: 2184, + 0xCEE9: 2185, + 0xCEF1: 2186, + 0xCEF5: 2187, + 0xCF41: 2188, + 0xCF45: 2189, + 0xCF49: 2190, + 0xCF51: 2191, + 0xCF55: 2192, + 0xCF57: 2193, + 0xCF61: 2194, + 0xCF65: 2195, + 0xCF69: 2196, + 0xCF71: 2197, + 0xCF73: 2198, + 0xCF75: 2199, + 0xCFA1: 2200, + 0xCFA2: 2201, + 0xCFA5: 2202, + 0xCFA9: 2203, + 0xCFB1: 2204, + 0xCFB3: 2205, + 0xCFB5: 2206, + 0xCFB7: 2207, + 0xD061: 2208, + 0xD062: 2209, + 0xD065: 2210, + 0xD069: 2211, + 0xD06E: 2212, + 0xD071: 2213, + 0xD073: 2214, + 0xD075: 2215, + 0xD077: 2216, + 0xD081: 2217, + 0xD082: 2218, + 0xD085: 2219, + 0xD089: 2220, + 0xD091: 2221, + 0xD093: 2222, + 0xD095: 2223, + 0xD096: 2224, + 0xD097: 2225, + 0xD0A1: 2226, + 0xD0B7: 2227, + 0xD0E1: 2228, + 0xD0E2: 2229, + 0xD0E5: 2230, + 0xD0E9: 2231, + 0xD0EB: 2232, + 0xD0F1: 2233, + 0xD0F3: 2234, + 0xD0F5: 2235, + 0xD0F7: 2236, + 0xD141: 2237, + 0xD142: 2238, + 0xD145: 2239, + 0xD149: 2240, + 0xD151: 2241, + 0xD153: 2242, + 0xD155: 2243, + 0xD157: 2244, + 0xD161: 2245, + 0xD162: 2246, + 0xD165: 2247, + 0xD169: 2248, + 0xD171: 2249, + 0xD173: 2250, + 0xD175: 2251, + 0xD176: 2252, + 0xD177: 2253, + 0xD181: 2254, + 0xD185: 2255, + 0xD189: 2256, + 0xD193: 2257, + 0xD1A1: 2258, + 0xD1A2: 2259, + 0xD1A5: 2260, + 0xD1A9: 2261, + 0xD1AE: 2262, + 0xD1B1: 2263, + 0xD1B3: 2264, + 0xD1B5: 2265, + 0xD1B7: 2266, + 0xD1BB: 2267, + 0xD1C1: 2268, + 0xD1C2: 2269, + 0xD1C5: 2270, + 0xD1C9: 2271, + 0xD1D5: 2272, + 0xD1D7: 2273, + 0xD1E1: 2274, + 0xD1E2: 2275, + 0xD1E5: 2276, + 0xD1F5: 2277, + 0xD1F7: 2278, + 0xD241: 2279, + 0xD242: 2280, + 0xD245: 2281, + 0xD249: 2282, + 0xD253: 2283, + 0xD255: 2284, + 0xD257: 2285, + 0xD261: 2286, + 0xD265: 2287, + 0xD269: 2288, + 0xD273: 2289, + 0xD275: 2290, + 0xD281: 2291, + 0xD282: 2292, + 0xD285: 2293, + 0xD289: 2294, + 0xD28E: 2295, + 0xD291: 2296, + 0xD295: 2297, + 0xD297: 2298, + 0xD2A1: 2299, + 0xD2A5: 2300, + 0xD2A9: 2301, + 0xD2B1: 2302, + 0xD2B7: 2303, + 0xD2C1: 2304, + 0xD2C2: 2305, + 0xD2C5: 2306, + 0xD2C9: 2307, + 0xD2D7: 2308, + 0xD2E1: 2309, + 0xD2E2: 2310, + 0xD2E5: 2311, + 0xD2E9: 2312, + 0xD2F1: 2313, + 0xD2F3: 2314, + 0xD2F5: 2315, + 0xD2F7: 2316, + 0xD341: 2317, + 0xD342: 2318, + 0xD345: 2319, + 0xD349: 2320, + 0xD351: 2321, + 0xD355: 2322, + 0xD357: 2323, + 0xD361: 2324, + 0xD362: 2325, + 0xD365: 2326, + 0xD367: 2327, + 0xD368: 2328, + 0xD369: 2329, + 0xD36A: 2330, + 0xD371: 2331, + 0xD373: 2332, + 0xD375: 2333, + 0xD377: 2334, + 0xD37B: 2335, + 0xD381: 2336, + 0xD385: 2337, + 0xD389: 2338, + 0xD391: 2339, + 0xD393: 2340, + 0xD397: 2341, + 0xD3A1: 2342, + 0xD3A2: 2343, + 0xD3A5: 2344, + 0xD3A9: 2345, + 0xD3B1: 2346, + 0xD3B3: 2347, + 0xD3B5: 2348, + 0xD3B7: 2349, +} diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/compat.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/johabprober.py similarity index 51% rename from sbsheriff/Lib/site-packages/pip/_vendor/chardet/compat.py rename to sbsheriff/Lib/site-packages/pip/_vendor/chardet/johabprober.py index 8941572..6f359d1 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/compat.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/johabprober.py @@ -1,7 +1,13 @@ ######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# # Contributor(s): -# Dan Blanchard -# Ian Cordasco +# Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -19,18 +25,23 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -import sys +from .chardistribution import JOHABDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import JOHAB_SM_MODEL -if sys.version_info < (3, 0): - PY2 = True - PY3 = False - string_types = (str, unicode) - text_type = unicode - iteritems = dict.iteritems -else: - PY2 = False - PY3 = True - string_types = (bytes, str) - text_type = str - iteritems = dict.items +class JOHABProber(MultiByteCharSetProber): + def __init__(self): + super().__init__() + self.coding_sm = CodingStateMachine(JOHAB_SM_MODEL) + self.distribution_analyzer = JOHABDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Johab" + + @property + def language(self): + return "Korean" diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/jpcntx.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/jpcntx.py index 20044e4..7a8e5be 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/jpcntx.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/jpcntx.py @@ -27,93 +27,96 @@ # This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), -(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), -(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), -(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), -(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), -(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), -(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), -(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), -(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), -(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), -(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), -(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), -(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), -(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), -(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), -(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), -(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), -(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), -(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), -(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), -(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), -(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), -(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), -(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), -(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), -(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), -(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), -(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), -(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), -(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), -(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), -(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), -(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), -(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), -(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), -(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), -(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), -(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), -(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), -(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), -(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), -(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), -(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), -(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), -(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), -(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), -(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), -(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), -(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), -(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), -(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), -(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), -(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), -(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), -(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), -(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), -(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), -(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), -(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), -(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), -(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), -(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), -(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), -(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), -(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), -(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), -(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), -(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), -(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), -(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), -(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), -(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), -(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), -(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +# fmt: off +jp2_char_context = ( + (0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), + (2, 4, 0, 4, 0, 3, 0, 4, 0, 3, 4, 4, 4, 2, 4, 3, 3, 4, 3, 2, 3, 3, 4, 2, 3, 3, 3, 2, 4, 1, 4, 3, 3, 1, 5, 4, 3, 4, 3, 4, 3, 5, 3, 0, 3, 5, 4, 2, 0, 3, 1, 0, 3, 3, 0, 3, 3, 0, 1, 1, 0, 4, 3, 0, 3, 3, 0, 4, 0, 2, 0, 3, 5, 5, 5, 5, 4, 0, 4, 1, 0, 3, 4), + (0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2), + (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 4, 4, 3, 5, 3, 5, 1, 5, 3, 4, 3, 4, 4, 3, 4, 3, 3, 4, 3, 5, 4, 4, 3, 5, 5, 3, 5, 5, 5, 3, 5, 5, 3, 4, 5, 5, 3, 1, 3, 2, 0, 3, 4, 0, 4, 2, 0, 4, 2, 1, 5, 3, 2, 3, 5, 0, 4, 0, 2, 0, 5, 4, 4, 5, 4, 5, 0, 4, 0, 0, 4, 4), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), + (0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 5, 4, 3, 3, 3, 3, 4, 3, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 4, 4, 4, 4, 5, 3, 4, 4, 3, 4, 5, 5, 4, 5, 5, 1, 4, 5, 4, 3, 0, 3, 3, 1, 3, 3, 0, 4, 4, 0, 3, 3, 1, 5, 3, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 0, 4, 1, 1, 3, 4), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), + (0, 4, 0, 3, 0, 3, 0, 4, 0, 3, 4, 4, 3, 2, 2, 1, 2, 1, 3, 1, 3, 3, 3, 3, 3, 4, 3, 1, 3, 3, 5, 3, 3, 0, 4, 3, 0, 5, 4, 3, 3, 5, 4, 4, 3, 4, 4, 5, 0, 1, 2, 0, 1, 2, 0, 2, 2, 0, 1, 0, 0, 5, 2, 2, 1, 4, 0, 3, 0, 1, 0, 4, 4, 3, 5, 4, 3, 0, 2, 1, 0, 4, 3), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), + (0, 3, 0, 5, 0, 4, 0, 2, 1, 4, 4, 2, 4, 1, 4, 2, 4, 2, 4, 3, 3, 3, 4, 3, 3, 3, 3, 1, 4, 2, 3, 3, 3, 1, 4, 4, 1, 1, 1, 4, 3, 3, 2, 0, 2, 4, 3, 2, 0, 3, 3, 0, 3, 1, 1, 0, 0, 0, 3, 3, 0, 4, 2, 2, 3, 4, 0, 4, 0, 3, 0, 4, 4, 5, 3, 4, 4, 0, 3, 0, 0, 1, 4), + (1, 4, 0, 4, 0, 4, 0, 4, 0, 3, 5, 4, 4, 3, 4, 3, 5, 4, 3, 3, 4, 3, 5, 4, 4, 4, 4, 3, 4, 2, 4, 3, 3, 1, 5, 4, 3, 2, 4, 5, 4, 5, 5, 4, 4, 5, 4, 4, 0, 3, 2, 2, 3, 3, 0, 4, 3, 1, 3, 2, 1, 4, 3, 3, 4, 5, 0, 3, 0, 2, 0, 4, 5, 5, 4, 5, 4, 0, 4, 0, 0, 5, 4), + (0, 5, 0, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 3, 4, 0, 4, 4, 4, 3, 4, 3, 4, 3, 3, 1, 4, 2, 4, 3, 4, 0, 5, 4, 1, 4, 5, 4, 4, 5, 3, 2, 4, 3, 4, 3, 2, 4, 1, 3, 3, 3, 2, 3, 2, 0, 4, 3, 3, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 4, 3, 0, 4, 1, 0, 1, 3), + (0, 3, 1, 4, 0, 3, 0, 2, 0, 3, 4, 4, 3, 1, 4, 2, 3, 3, 4, 3, 4, 3, 4, 3, 4, 4, 3, 2, 3, 1, 5, 4, 4, 1, 4, 4, 3, 5, 4, 4, 3, 5, 5, 4, 3, 4, 4, 3, 1, 2, 3, 1, 2, 2, 0, 3, 2, 0, 3, 1, 0, 5, 3, 3, 3, 4, 3, 3, 3, 3, 4, 4, 4, 4, 5, 4, 2, 0, 3, 3, 2, 4, 3), + (0, 2, 0, 3, 0, 1, 0, 1, 0, 0, 3, 2, 0, 0, 2, 0, 1, 0, 2, 1, 3, 3, 3, 1, 2, 3, 1, 0, 1, 0, 4, 2, 1, 1, 3, 3, 0, 4, 3, 3, 1, 4, 3, 3, 0, 3, 3, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 4, 1, 0, 2, 3, 2, 2, 2, 1, 3, 3, 3, 4, 4, 3, 2, 0, 3, 1, 0, 3, 3), + (0, 4, 0, 4, 0, 3, 0, 3, 0, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 3, 4, 2, 4, 3, 4, 3, 3, 2, 4, 3, 4, 5, 4, 1, 4, 5, 3, 5, 4, 5, 3, 5, 4, 0, 3, 5, 5, 3, 1, 3, 3, 2, 2, 3, 0, 3, 4, 1, 3, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 5, 3, 0, 4, 1, 0, 3, 4), + (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 2, 2, 1, 0, 1, 0, 0, 0, 3, 0, 3, 0, 3, 0, 1, 3, 1, 0, 3, 1, 3, 3, 3, 1, 3, 3, 3, 0, 1, 3, 1, 3, 4, 0, 0, 3, 1, 1, 0, 3, 2, 0, 0, 0, 0, 1, 3, 0, 1, 0, 0, 3, 3, 2, 0, 3, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 3, 0, 3, 0, 0, 2, 3), + (2, 3, 0, 3, 0, 2, 0, 1, 0, 3, 3, 4, 3, 1, 3, 1, 1, 1, 3, 1, 4, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 4, 3, 1, 4, 3, 2, 5, 5, 4, 4, 4, 4, 3, 3, 4, 4, 4, 0, 2, 1, 1, 3, 2, 0, 1, 2, 0, 0, 1, 0, 4, 1, 3, 3, 3, 0, 3, 0, 1, 0, 4, 4, 4, 5, 5, 3, 0, 2, 0, 0, 4, 4), + (0, 2, 0, 1, 0, 3, 1, 3, 0, 2, 3, 3, 3, 0, 3, 1, 0, 0, 3, 0, 3, 2, 3, 1, 3, 2, 1, 1, 0, 0, 4, 2, 1, 0, 2, 3, 1, 4, 3, 2, 0, 4, 4, 3, 1, 3, 1, 3, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 1, 1, 1, 2, 0, 3, 0, 0, 0, 3, 4, 2, 4, 3, 2, 0, 1, 0, 0, 3, 3), + (0, 1, 0, 4, 0, 5, 0, 4, 0, 2, 4, 4, 2, 3, 3, 2, 3, 3, 5, 3, 3, 3, 4, 3, 4, 2, 3, 0, 4, 3, 3, 3, 4, 1, 4, 3, 2, 1, 5, 5, 3, 4, 5, 1, 3, 5, 4, 2, 0, 3, 3, 0, 1, 3, 0, 4, 2, 0, 1, 3, 1, 4, 3, 3, 3, 3, 0, 3, 0, 1, 0, 3, 4, 4, 4, 5, 5, 0, 3, 0, 1, 4, 5), + (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 3, 1, 3, 0, 4, 0, 1, 1, 3, 0, 3, 4, 3, 2, 3, 1, 0, 3, 3, 2, 3, 1, 3, 0, 2, 3, 0, 2, 1, 4, 1, 2, 2, 0, 0, 3, 3, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 2, 2, 0, 3, 2, 1, 3, 3, 0, 2, 0, 2, 0, 0, 3, 3, 1, 2, 4, 0, 3, 0, 2, 2, 3), + (2, 4, 0, 5, 0, 4, 0, 4, 0, 2, 4, 4, 4, 3, 4, 3, 3, 3, 1, 2, 4, 3, 4, 3, 4, 4, 5, 0, 3, 3, 3, 3, 2, 0, 4, 3, 1, 4, 3, 4, 1, 4, 4, 3, 3, 4, 4, 3, 1, 2, 3, 0, 4, 2, 0, 4, 1, 0, 3, 3, 0, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 3, 5, 3, 4, 5, 2, 0, 3, 0, 0, 4, 5), + (0, 3, 0, 4, 0, 1, 0, 1, 0, 1, 3, 2, 2, 1, 3, 0, 3, 0, 2, 0, 2, 0, 3, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 0, 3, 1, 0, 0, 0, 4, 0, 3, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 3, 1, 0, 3, 0, 0, 0, 1, 4, 4, 4, 3, 0, 0, 4, 0, 0, 1, 4), + (1, 4, 1, 5, 0, 3, 0, 3, 0, 4, 5, 4, 4, 3, 5, 3, 3, 4, 4, 3, 4, 1, 3, 3, 3, 3, 2, 1, 4, 1, 5, 4, 3, 1, 4, 4, 3, 5, 4, 4, 3, 5, 4, 3, 3, 4, 4, 4, 0, 3, 3, 1, 2, 3, 0, 3, 1, 0, 3, 3, 0, 5, 4, 4, 4, 4, 4, 4, 3, 3, 5, 4, 4, 3, 3, 5, 4, 0, 3, 2, 0, 4, 4), + (0, 2, 0, 3, 0, 1, 0, 0, 0, 1, 3, 3, 3, 2, 4, 1, 3, 0, 3, 1, 3, 0, 2, 2, 1, 1, 0, 0, 2, 0, 4, 3, 1, 0, 4, 3, 0, 4, 4, 4, 1, 4, 3, 1, 1, 3, 3, 1, 0, 2, 0, 0, 1, 3, 0, 0, 0, 0, 2, 0, 0, 4, 3, 2, 4, 3, 5, 4, 3, 3, 3, 4, 3, 3, 4, 3, 3, 0, 2, 1, 0, 3, 3), + (0, 2, 0, 4, 0, 3, 0, 2, 0, 2, 5, 5, 3, 4, 4, 4, 4, 1, 4, 3, 3, 0, 4, 3, 4, 3, 1, 3, 3, 2, 4, 3, 0, 3, 4, 3, 0, 3, 4, 4, 2, 4, 4, 0, 4, 5, 3, 3, 2, 2, 1, 1, 1, 2, 0, 1, 5, 0, 3, 3, 2, 4, 3, 3, 3, 4, 0, 3, 0, 2, 0, 4, 4, 3, 5, 5, 0, 0, 3, 0, 2, 3, 3), + (0, 3, 0, 4, 0, 3, 0, 1, 0, 3, 4, 3, 3, 1, 3, 3, 3, 0, 3, 1, 3, 0, 4, 3, 3, 1, 1, 0, 3, 0, 3, 3, 0, 0, 4, 4, 0, 1, 5, 4, 3, 3, 5, 0, 3, 3, 4, 3, 0, 2, 0, 1, 1, 1, 0, 1, 3, 0, 1, 2, 1, 3, 3, 2, 3, 3, 0, 3, 0, 1, 0, 1, 3, 3, 4, 4, 1, 0, 1, 2, 2, 1, 3), + (0, 1, 0, 4, 0, 4, 0, 3, 0, 1, 3, 3, 3, 2, 3, 1, 1, 0, 3, 0, 3, 3, 4, 3, 2, 4, 2, 0, 1, 0, 4, 3, 2, 0, 4, 3, 0, 5, 3, 3, 2, 4, 4, 4, 3, 3, 3, 4, 0, 1, 3, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 4, 2, 3, 3, 3, 0, 3, 0, 0, 0, 4, 4, 4, 5, 3, 2, 0, 3, 3, 0, 3, 5), + (0, 2, 0, 3, 0, 0, 0, 3, 0, 1, 3, 0, 2, 0, 0, 0, 1, 0, 3, 1, 1, 3, 3, 0, 0, 3, 0, 0, 3, 0, 2, 3, 1, 0, 3, 1, 0, 3, 3, 2, 0, 4, 2, 2, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 1, 0, 1, 0, 0, 0, 1, 3, 1, 2, 0, 0, 0, 1, 0, 0, 1, 4), + (0, 3, 0, 3, 0, 5, 0, 1, 0, 2, 4, 3, 1, 3, 3, 2, 1, 1, 5, 2, 1, 0, 5, 1, 2, 0, 0, 0, 3, 3, 2, 2, 3, 2, 4, 3, 0, 0, 3, 3, 1, 3, 3, 0, 2, 5, 3, 4, 0, 3, 3, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 2, 2, 3, 3, 3, 0, 2, 0, 1, 0, 3, 4, 4, 2, 5, 4, 0, 3, 0, 0, 3, 5), + (0, 3, 0, 3, 0, 3, 0, 1, 0, 3, 3, 3, 3, 0, 3, 0, 2, 0, 2, 1, 1, 0, 2, 0, 1, 0, 0, 0, 2, 1, 0, 0, 1, 0, 3, 2, 0, 0, 3, 3, 1, 2, 3, 1, 0, 3, 3, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 3, 1, 2, 3, 0, 3, 0, 1, 0, 3, 2, 1, 0, 4, 3, 0, 1, 1, 0, 3, 3), + (0, 4, 0, 5, 0, 3, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 4, 3, 5, 3, 3, 2, 5, 3, 4, 4, 4, 3, 4, 3, 4, 5, 5, 3, 4, 4, 3, 4, 4, 5, 4, 4, 4, 3, 4, 5, 5, 4, 2, 3, 4, 2, 3, 4, 0, 3, 3, 1, 4, 3, 2, 4, 3, 3, 5, 5, 0, 3, 0, 3, 0, 5, 5, 5, 5, 4, 4, 0, 4, 0, 1, 4, 4), + (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 5, 4, 4, 2, 3, 2, 5, 1, 3, 2, 5, 1, 4, 2, 3, 2, 3, 3, 4, 3, 3, 3, 3, 2, 5, 4, 1, 3, 3, 5, 3, 4, 4, 0, 4, 4, 3, 1, 1, 3, 1, 0, 2, 3, 0, 2, 3, 0, 3, 0, 0, 4, 3, 1, 3, 4, 0, 3, 0, 2, 0, 4, 4, 4, 3, 4, 5, 0, 4, 0, 0, 3, 4), + (0, 3, 0, 3, 0, 3, 1, 2, 0, 3, 4, 4, 3, 3, 3, 0, 2, 2, 4, 3, 3, 1, 3, 3, 3, 1, 1, 0, 3, 1, 4, 3, 2, 3, 4, 4, 2, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 3, 1, 3, 3, 1, 3, 3, 0, 4, 1, 0, 2, 2, 1, 4, 3, 2, 3, 3, 5, 4, 3, 3, 5, 4, 4, 3, 3, 0, 4, 0, 3, 2, 2, 4, 4), + (0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 2, 0, 1, 2, 1, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 1, 1, 3, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 3, 4, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1), + (0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 4, 1, 4, 0, 3, 0, 4, 0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 1, 5, 1, 4, 0, 0, 3, 0, 5, 0, 5, 2, 0, 1, 0, 0, 0, 2, 1, 4, 0, 1, 3, 0, 0, 3, 0, 0, 3, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), + (1, 4, 0, 5, 0, 3, 0, 2, 0, 3, 5, 4, 4, 3, 4, 3, 5, 3, 4, 3, 3, 0, 4, 3, 3, 3, 3, 3, 3, 2, 4, 4, 3, 1, 3, 4, 4, 5, 4, 4, 3, 4, 4, 1, 3, 5, 4, 3, 3, 3, 1, 2, 2, 3, 3, 1, 3, 1, 3, 3, 3, 5, 3, 3, 4, 5, 0, 3, 0, 3, 0, 3, 4, 3, 4, 4, 3, 0, 3, 0, 2, 4, 3), + (0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 4, 0, 4, 1, 4, 2, 4, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 1, 1, 1, 0, 3, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 3, 2, 0, 2, 2, 0, 1, 0, 0, 0, 2, 3, 2, 3, 3, 0, 0, 0, 0, 2, 1, 0), + (0, 5, 1, 5, 0, 3, 0, 3, 0, 5, 4, 4, 5, 1, 5, 3, 3, 0, 4, 3, 4, 3, 5, 3, 4, 3, 3, 2, 4, 3, 4, 3, 3, 0, 3, 3, 1, 4, 4, 3, 4, 4, 4, 3, 4, 5, 5, 3, 2, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 2, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 5, 3, 3, 0, 3, 4, 0, 4, 3), + (0, 5, 0, 5, 0, 3, 0, 2, 0, 4, 4, 3, 5, 2, 4, 3, 3, 3, 4, 4, 4, 3, 5, 3, 5, 3, 3, 1, 4, 0, 4, 3, 3, 0, 3, 3, 0, 4, 4, 4, 4, 5, 4, 3, 3, 5, 5, 3, 2, 3, 1, 2, 3, 2, 0, 1, 0, 0, 3, 2, 2, 4, 4, 3, 1, 5, 0, 4, 0, 3, 0, 4, 3, 1, 3, 2, 1, 0, 3, 3, 0, 3, 3), + (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 5, 5, 3, 4, 3, 3, 2, 5, 4, 4, 3, 5, 3, 5, 3, 4, 0, 4, 3, 4, 4, 3, 2, 4, 4, 3, 4, 5, 4, 4, 5, 5, 0, 3, 5, 5, 4, 1, 3, 3, 2, 3, 3, 1, 3, 1, 0, 4, 3, 1, 4, 4, 3, 4, 5, 0, 4, 0, 2, 0, 4, 3, 4, 4, 3, 3, 0, 4, 0, 0, 5, 5), + (0, 4, 0, 4, 0, 5, 0, 1, 1, 3, 3, 4, 4, 3, 4, 1, 3, 0, 5, 1, 3, 0, 3, 1, 3, 1, 1, 0, 3, 0, 3, 3, 4, 0, 4, 3, 0, 4, 4, 4, 3, 4, 4, 0, 3, 5, 4, 1, 0, 3, 0, 0, 2, 3, 0, 3, 1, 0, 3, 1, 0, 3, 2, 1, 3, 5, 0, 3, 0, 1, 0, 3, 2, 3, 3, 4, 4, 0, 2, 2, 0, 4, 4), + (2, 4, 0, 5, 0, 4, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 5, 3, 5, 3, 5, 2, 5, 3, 4, 3, 3, 4, 3, 4, 5, 3, 2, 1, 5, 4, 3, 2, 3, 4, 5, 3, 4, 1, 2, 5, 4, 3, 0, 3, 3, 0, 3, 2, 0, 2, 3, 0, 4, 1, 0, 3, 4, 3, 3, 5, 0, 3, 0, 1, 0, 4, 5, 5, 5, 4, 3, 0, 4, 2, 0, 3, 5), + (0, 5, 0, 4, 0, 4, 0, 2, 0, 5, 4, 3, 4, 3, 4, 3, 3, 3, 4, 3, 4, 2, 5, 3, 5, 3, 4, 1, 4, 3, 4, 4, 4, 0, 3, 5, 0, 4, 4, 4, 4, 5, 3, 1, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 0, 2, 2, 0, 3, 3, 2, 4, 3, 3, 3, 5, 3, 4, 1, 3, 3, 5, 3, 2, 0, 0, 0, 0, 4, 3, 1, 3, 3), + (0, 1, 0, 3, 0, 3, 0, 1, 0, 1, 3, 3, 3, 2, 3, 3, 3, 0, 3, 0, 0, 0, 3, 1, 3, 0, 0, 0, 2, 2, 2, 3, 0, 0, 3, 2, 0, 1, 2, 4, 1, 3, 3, 0, 0, 3, 3, 3, 0, 1, 0, 0, 2, 1, 0, 0, 3, 0, 3, 1, 0, 3, 0, 0, 1, 3, 0, 2, 0, 1, 0, 3, 3, 1, 3, 3, 0, 0, 1, 1, 0, 3, 3), + (0, 2, 0, 3, 0, 2, 1, 4, 0, 2, 2, 3, 1, 1, 3, 1, 1, 0, 2, 0, 3, 1, 2, 3, 1, 3, 0, 0, 1, 0, 4, 3, 2, 3, 3, 3, 1, 4, 2, 3, 3, 3, 3, 1, 0, 3, 1, 4, 0, 1, 1, 0, 1, 2, 0, 1, 1, 0, 1, 1, 0, 3, 1, 3, 2, 2, 0, 1, 0, 0, 0, 2, 3, 3, 3, 1, 0, 0, 0, 0, 0, 2, 3), + (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 5, 5, 3, 3, 4, 3, 3, 1, 5, 4, 4, 2, 4, 4, 4, 3, 4, 2, 4, 3, 5, 5, 4, 3, 3, 4, 3, 3, 5, 5, 4, 5, 5, 1, 3, 4, 5, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 1, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 5, 3, 3, 1, 4, 3, 0, 4, 0, 1, 5, 3), + (0, 5, 0, 5, 0, 4, 0, 2, 0, 4, 4, 3, 4, 3, 3, 3, 3, 3, 5, 4, 4, 4, 4, 4, 4, 5, 3, 3, 5, 2, 4, 4, 4, 3, 4, 4, 3, 3, 4, 4, 5, 5, 3, 3, 4, 3, 4, 3, 3, 4, 3, 3, 3, 3, 1, 2, 2, 1, 4, 3, 3, 5, 4, 4, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 4, 4, 1, 0, 4, 2, 0, 2, 4), + (0, 4, 0, 4, 0, 3, 0, 1, 0, 3, 5, 2, 3, 0, 3, 0, 2, 1, 4, 2, 3, 3, 4, 1, 4, 3, 3, 2, 4, 1, 3, 3, 3, 0, 3, 3, 0, 0, 3, 3, 3, 5, 3, 3, 3, 3, 3, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 3, 1, 2, 2, 3, 0, 3, 0, 2, 0, 4, 4, 3, 3, 4, 1, 0, 3, 0, 0, 2, 4), + (0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 3, 1, 3, 0, 3, 2, 0, 0, 0, 1, 0, 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 2, 0, 0, 0, 0, 0, 0, 2), + (0, 2, 1, 3, 0, 2, 0, 2, 0, 3, 3, 3, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 4, 2, 2, 1, 2, 1, 4, 0, 4, 3, 1, 3, 3, 3, 2, 4, 3, 5, 4, 3, 3, 3, 3, 3, 3, 3, 0, 1, 3, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 4, 2, 0, 2, 3, 0, 3, 3, 0, 3, 3, 4, 2, 3, 1, 4, 0, 1, 2, 0, 2, 3), + (0, 3, 0, 3, 0, 1, 0, 3, 0, 2, 3, 3, 3, 0, 3, 1, 2, 0, 3, 3, 2, 3, 3, 2, 3, 2, 3, 1, 3, 0, 4, 3, 2, 0, 3, 3, 1, 4, 3, 3, 2, 3, 4, 3, 1, 3, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 4, 1, 1, 0, 3, 0, 3, 1, 0, 2, 3, 3, 3, 3, 3, 1, 0, 0, 2, 0, 3, 3), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3), + (0, 2, 0, 3, 1, 3, 0, 3, 0, 2, 3, 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 1, 3, 0, 2, 3, 1, 1, 4, 3, 3, 2, 3, 3, 1, 2, 2, 4, 1, 3, 3, 0, 1, 4, 2, 3, 0, 1, 3, 0, 3, 0, 0, 1, 3, 0, 2, 0, 0, 3, 3, 2, 1, 3, 0, 3, 0, 2, 0, 3, 4, 4, 4, 3, 1, 0, 3, 0, 0, 3, 3), + (0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 3, 2, 2, 1, 3, 0, 1, 1, 3, 0, 3, 2, 3, 1, 2, 0, 2, 0, 1, 1, 3, 3, 3, 0, 3, 3, 1, 1, 2, 3, 2, 3, 3, 1, 2, 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 2, 1, 2, 1, 3, 0, 3, 0, 0, 0, 3, 4, 4, 4, 3, 2, 0, 2, 0, 0, 2, 4), + (0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 3), + (0, 3, 0, 3, 0, 2, 0, 3, 0, 3, 3, 3, 2, 3, 2, 2, 2, 0, 3, 1, 3, 3, 3, 2, 3, 3, 0, 0, 3, 0, 3, 2, 2, 0, 2, 3, 1, 4, 3, 4, 3, 3, 2, 3, 1, 5, 4, 4, 0, 3, 1, 2, 1, 3, 0, 3, 1, 1, 2, 0, 2, 3, 1, 3, 1, 3, 0, 3, 0, 1, 0, 3, 3, 4, 4, 2, 1, 0, 2, 1, 0, 2, 4), + (0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 4, 2, 5, 1, 4, 0, 2, 0, 2, 1, 3, 1, 4, 0, 2, 1, 0, 0, 2, 1, 4, 1, 1, 0, 3, 3, 0, 5, 1, 3, 2, 3, 3, 1, 0, 3, 2, 3, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 1, 0, 3, 0, 2, 0, 1, 0, 3, 3, 3, 4, 3, 3, 0, 0, 0, 0, 2, 3), + (0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3), + (0, 1, 0, 3, 0, 4, 0, 3, 0, 2, 4, 3, 1, 0, 3, 2, 2, 1, 3, 1, 2, 2, 3, 1, 1, 1, 2, 1, 3, 0, 1, 2, 0, 1, 3, 2, 1, 3, 0, 5, 5, 1, 0, 0, 1, 3, 2, 1, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 3, 4, 0, 1, 1, 1, 3, 2, 0, 2, 0, 1, 0, 2, 3, 3, 1, 2, 3, 0, 1, 0, 1, 0, 4), + (0, 0, 0, 1, 0, 3, 0, 3, 0, 2, 2, 1, 0, 0, 4, 0, 3, 0, 3, 1, 3, 0, 3, 0, 3, 0, 1, 0, 3, 0, 3, 1, 3, 0, 3, 3, 0, 0, 1, 2, 1, 1, 1, 0, 1, 2, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2, 0, 0, 2, 0, 0, 0, 0, 2, 3, 3, 3, 3, 0, 0, 0, 0, 1, 4), + (0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 1, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 2, 3, 0, 0, 2, 2, 3, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 2, 3), + (2, 4, 0, 5, 0, 5, 0, 4, 0, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 2, 3, 0, 5, 5, 4, 1, 5, 4, 3, 1, 5, 4, 3, 4, 4, 3, 3, 4, 3, 3, 0, 3, 2, 0, 2, 3, 0, 3, 0, 0, 3, 3, 0, 5, 3, 2, 3, 3, 0, 3, 0, 3, 0, 3, 4, 5, 4, 5, 3, 0, 4, 3, 0, 3, 4), + (0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 3, 4, 3, 2, 3, 2, 3, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 1, 0, 2, 0, 0, 1, 1, 0, 2, 0, 0, 3, 1, 0, 5, 3, 2, 1, 3, 0, 3, 0, 1, 2, 4, 3, 2, 4, 3, 3, 0, 3, 2, 0, 4, 4), + (0, 3, 0, 3, 0, 1, 0, 0, 0, 1, 4, 3, 3, 2, 3, 1, 3, 1, 4, 2, 3, 2, 4, 2, 3, 4, 3, 0, 2, 2, 3, 3, 3, 0, 3, 3, 3, 0, 3, 4, 1, 3, 3, 0, 3, 4, 3, 3, 0, 1, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 0, 3, 1, 2, 1, 3, 0, 4, 0, 1, 0, 4, 3, 3, 4, 3, 3, 0, 2, 0, 0, 3, 3), + (0, 3, 0, 4, 0, 1, 0, 3, 0, 3, 4, 3, 3, 0, 3, 3, 3, 1, 3, 1, 3, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 3, 3, 1, 3, 3, 2, 5, 4, 3, 3, 4, 5, 3, 2, 5, 3, 4, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 0, 4, 2, 2, 1, 3, 0, 3, 0, 2, 0, 4, 4, 3, 5, 3, 2, 0, 1, 1, 0, 3, 4), + (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 4, 3, 3, 2, 3, 3, 3, 1, 4, 3, 4, 1, 5, 3, 4, 3, 4, 0, 4, 2, 4, 3, 4, 1, 5, 4, 0, 4, 4, 4, 4, 5, 4, 1, 3, 5, 4, 2, 1, 4, 1, 1, 3, 2, 0, 3, 1, 0, 3, 2, 1, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 3, 3, 3, 0, 4, 2, 0, 3, 4), + (1, 4, 0, 4, 0, 3, 0, 1, 0, 3, 3, 3, 1, 1, 3, 3, 2, 2, 3, 3, 1, 0, 3, 2, 2, 1, 2, 0, 3, 1, 2, 1, 2, 0, 3, 2, 0, 2, 2, 3, 3, 4, 3, 0, 3, 3, 1, 2, 0, 1, 1, 3, 1, 2, 0, 0, 3, 0, 1, 1, 0, 3, 2, 2, 3, 3, 0, 3, 0, 0, 0, 2, 3, 3, 4, 3, 3, 0, 1, 0, 0, 1, 4), + (0, 4, 0, 4, 0, 4, 0, 0, 0, 3, 4, 4, 3, 1, 4, 2, 3, 2, 3, 3, 3, 1, 4, 3, 4, 0, 3, 0, 4, 2, 3, 3, 2, 2, 5, 4, 2, 1, 3, 4, 3, 4, 3, 1, 3, 3, 4, 2, 0, 2, 1, 0, 3, 3, 0, 0, 2, 0, 3, 1, 0, 4, 4, 3, 4, 3, 0, 4, 0, 1, 0, 2, 4, 4, 4, 4, 4, 0, 3, 2, 0, 3, 3), + (0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2), + (0, 2, 0, 3, 0, 4, 0, 4, 0, 1, 3, 3, 3, 0, 4, 0, 2, 1, 2, 1, 1, 1, 2, 0, 3, 1, 1, 0, 1, 0, 3, 1, 0, 0, 3, 3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 2, 2, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 2, 0, 3, 0, 0, 0, 0, 1, 0, 0, 3, 3, 4, 3, 1, 0, 1, 0, 3, 0, 2), + (0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 1, 0, 2, 0, 3, 1, 0, 1, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 2, 3, 0, 1, 4, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 3), + (0, 2, 0, 5, 0, 5, 0, 1, 0, 2, 4, 3, 3, 2, 5, 1, 3, 2, 3, 3, 3, 0, 4, 1, 2, 0, 3, 0, 4, 0, 2, 2, 1, 1, 5, 3, 0, 0, 1, 4, 2, 3, 2, 0, 3, 3, 3, 2, 0, 2, 4, 1, 1, 2, 0, 1, 1, 0, 3, 1, 0, 1, 3, 1, 2, 3, 0, 2, 0, 0, 0, 1, 3, 5, 4, 4, 4, 0, 3, 0, 0, 1, 3), + (0, 4, 0, 5, 0, 4, 0, 4, 0, 4, 5, 4, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 3, 4, 5, 4, 2, 4, 2, 3, 4, 3, 1, 4, 4, 1, 3, 5, 4, 4, 5, 5, 4, 4, 5, 5, 5, 2, 3, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 4, 4, 4, 0, 3, 0, 4, 0, 3, 3, 4, 4, 5, 0, 0, 4, 3, 0, 4, 5), + (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 4, 4, 4, 3, 3, 2, 4, 3, 4, 3, 4, 3, 5, 3, 4, 3, 2, 1, 4, 2, 4, 4, 3, 1, 3, 4, 2, 4, 5, 5, 3, 4, 5, 4, 1, 5, 4, 3, 0, 3, 2, 2, 3, 2, 1, 3, 1, 0, 3, 3, 3, 5, 3, 3, 3, 5, 4, 4, 2, 3, 3, 4, 3, 3, 3, 2, 1, 0, 3, 2, 1, 4, 3), + (0, 4, 0, 5, 0, 4, 0, 3, 0, 3, 5, 5, 3, 2, 4, 3, 4, 0, 5, 4, 4, 1, 4, 4, 4, 3, 3, 3, 4, 3, 5, 5, 2, 3, 3, 4, 1, 2, 5, 5, 3, 5, 5, 2, 3, 5, 5, 4, 0, 3, 2, 0, 3, 3, 1, 1, 5, 1, 4, 1, 0, 4, 3, 2, 3, 5, 0, 4, 0, 3, 0, 5, 4, 3, 4, 3, 0, 0, 4, 1, 0, 4, 4), + (1, 3, 0, 4, 0, 2, 0, 2, 0, 2, 5, 5, 3, 3, 3, 3, 3, 0, 4, 2, 3, 4, 4, 4, 3, 4, 0, 0, 3, 4, 5, 4, 3, 3, 3, 3, 2, 5, 5, 4, 5, 5, 5, 4, 3, 5, 5, 5, 1, 3, 1, 0, 1, 0, 0, 3, 2, 0, 4, 2, 0, 5, 2, 3, 2, 4, 1, 3, 0, 3, 0, 4, 5, 4, 5, 4, 3, 0, 4, 2, 0, 5, 4), + (0, 3, 0, 4, 0, 5, 0, 3, 0, 3, 4, 4, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 4, 3, 3, 2, 2, 0, 3, 3, 3, 3, 3, 1, 3, 3, 3, 0, 4, 4, 3, 4, 4, 1, 1, 4, 4, 2, 0, 3, 1, 0, 1, 1, 0, 4, 1, 0, 2, 3, 1, 3, 3, 1, 3, 4, 0, 3, 0, 1, 0, 3, 1, 3, 0, 0, 1, 0, 2, 0, 0, 4, 4), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), + (0, 3, 0, 3, 0, 2, 0, 3, 0, 1, 5, 4, 3, 3, 3, 1, 4, 2, 1, 2, 3, 4, 4, 2, 4, 4, 5, 0, 3, 1, 4, 3, 4, 0, 4, 3, 3, 3, 2, 3, 2, 5, 3, 4, 3, 2, 2, 3, 0, 0, 3, 0, 2, 1, 0, 1, 2, 0, 0, 0, 0, 2, 1, 1, 3, 1, 0, 2, 0, 4, 0, 3, 4, 4, 4, 5, 2, 0, 2, 0, 0, 1, 3), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 4, 2, 1, 1, 0, 1, 0, 3, 2, 0, 0, 3, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 4, 0, 4, 2, 1, 0, 0, 0, 0, 0, 1), + (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 2, 0, 2, 1, 0, 0, 1, 2, 1, 0, 1, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2), + (0, 4, 0, 4, 0, 4, 0, 3, 0, 4, 4, 3, 4, 2, 4, 3, 2, 0, 4, 4, 4, 3, 5, 3, 5, 3, 3, 2, 4, 2, 4, 3, 4, 3, 1, 4, 0, 2, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 3, 4, 1, 3, 4, 3, 2, 1, 2, 1, 3, 3, 3, 4, 4, 3, 3, 5, 0, 4, 0, 3, 0, 4, 3, 3, 3, 2, 1, 0, 3, 0, 0, 3, 3), + (0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 5, 5, 3, 3, 3, 3, 4, 3, 4, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 4, 3, 5, 3, 3, 1, 3, 2, 4, 5, 5, 5, 5, 4, 3, 4, 5, 5, 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 1, 2, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 4, 3, 2, 2, 1, 2, 0, 3, 0, 0, 4, 1), ) +# fmt: on -class JapaneseContextAnalysis(object): + +class JapaneseContextAnalysis: NUM_OF_CATEGORY = 6 DONT_KNOW = -1 ENOUGH_REL_THRESHOLD = 100 @@ -153,7 +156,7 @@ class JapaneseContextAnalysis(object): # this character will simply our logic and improve performance. i = self._need_to_skip_char_num while i < num_bytes: - order, char_len = self.get_order(byte_str[i:i + 2]) + order, char_len = self.get_order(byte_str[i : i + 2]) i += char_len if i > num_bytes: self._need_to_skip_char_num = i - num_bytes @@ -164,7 +167,9 @@ class JapaneseContextAnalysis(object): if self._total_rel > self.MAX_REL_THRESHOLD: self._done = True break - self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._rel_sample[ + jp2_char_context[self._last_char_order][order] + ] += 1 self._last_char_order = order def got_enough_data(self): @@ -174,15 +179,15 @@ class JapaneseContextAnalysis(object): # This is just one way to calculate confidence. It works well for me. if self._total_rel > self.MINIMUM_DATA_THRESHOLD: return (self._total_rel - self._rel_sample[0]) / self._total_rel - else: - return self.DONT_KNOW + return self.DONT_KNOW - def get_order(self, byte_str): + def get_order(self, _): return -1, 1 + class SJISContextAnalysis(JapaneseContextAnalysis): def __init__(self): - super(SJISContextAnalysis, self).__init__() + super().__init__() self._charset_name = "SHIFT_JIS" @property @@ -209,6 +214,7 @@ class SJISContextAnalysis(JapaneseContextAnalysis): return -1, char_len + class EUCJPContextAnalysis(JapaneseContextAnalysis): def get_order(self, byte_str): if not byte_str: @@ -229,5 +235,3 @@ class EUCJPContextAnalysis(JapaneseContextAnalysis): return second_char - 0xA1, char_len return -1, char_len - - diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py index e963a50..9946682 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py @@ -1,9 +1,5 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - # 3: Positive # 2: Likely # 1: Unlikely @@ -4115,536 +4111,539 @@ BULGARIAN_LANG_MODEL = { # Character Mapping Table(s): ISO_8859_5_BULGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 77, # 'A' - 66: 90, # 'B' - 67: 99, # 'C' - 68: 100, # 'D' - 69: 72, # 'E' - 70: 109, # 'F' - 71: 107, # 'G' - 72: 101, # 'H' - 73: 79, # 'I' - 74: 185, # 'J' - 75: 81, # 'K' - 76: 102, # 'L' - 77: 76, # 'M' - 78: 94, # 'N' - 79: 82, # 'O' - 80: 110, # 'P' - 81: 186, # 'Q' - 82: 108, # 'R' - 83: 91, # 'S' - 84: 74, # 'T' - 85: 119, # 'U' - 86: 84, # 'V' - 87: 96, # 'W' - 88: 111, # 'X' - 89: 187, # 'Y' - 90: 115, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 65, # 'a' - 98: 69, # 'b' - 99: 70, # 'c' - 100: 66, # 'd' - 101: 63, # 'e' - 102: 68, # 'f' - 103: 112, # 'g' - 104: 103, # 'h' - 105: 92, # 'i' - 106: 194, # 'j' - 107: 104, # 'k' - 108: 95, # 'l' - 109: 86, # 'm' - 110: 87, # 'n' - 111: 71, # 'o' - 112: 116, # 'p' - 113: 195, # 'q' - 114: 85, # 'r' - 115: 93, # 's' - 116: 97, # 't' - 117: 113, # 'u' - 118: 196, # 'v' - 119: 197, # 'w' - 120: 198, # 'x' - 121: 199, # 'y' - 122: 200, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 194, # '\x80' - 129: 195, # '\x81' - 130: 196, # '\x82' - 131: 197, # '\x83' - 132: 198, # '\x84' - 133: 199, # '\x85' - 134: 200, # '\x86' - 135: 201, # '\x87' - 136: 202, # '\x88' - 137: 203, # '\x89' - 138: 204, # '\x8a' - 139: 205, # '\x8b' - 140: 206, # '\x8c' - 141: 207, # '\x8d' - 142: 208, # '\x8e' - 143: 209, # '\x8f' - 144: 210, # '\x90' - 145: 211, # '\x91' - 146: 212, # '\x92' - 147: 213, # '\x93' - 148: 214, # '\x94' - 149: 215, # '\x95' - 150: 216, # '\x96' - 151: 217, # '\x97' - 152: 218, # '\x98' - 153: 219, # '\x99' - 154: 220, # '\x9a' - 155: 221, # '\x9b' - 156: 222, # '\x9c' - 157: 223, # '\x9d' - 158: 224, # '\x9e' - 159: 225, # '\x9f' - 160: 81, # '\xa0' - 161: 226, # 'Ё' - 162: 227, # 'Ђ' - 163: 228, # 'Ѓ' - 164: 229, # 'Є' - 165: 230, # 'Ѕ' - 166: 105, # 'І' - 167: 231, # 'Ї' - 168: 232, # 'Ј' - 169: 233, # 'Љ' - 170: 234, # 'Њ' - 171: 235, # 'Ћ' - 172: 236, # 'Ќ' - 173: 45, # '\xad' - 174: 237, # 'Ў' - 175: 238, # 'Џ' - 176: 31, # 'А' - 177: 32, # 'Б' - 178: 35, # 'В' - 179: 43, # 'Г' - 180: 37, # 'Д' - 181: 44, # 'Е' - 182: 55, # 'Ж' - 183: 47, # 'З' - 184: 40, # 'И' - 185: 59, # 'Й' - 186: 33, # 'К' - 187: 46, # 'Л' - 188: 38, # 'М' - 189: 36, # 'Н' - 190: 41, # 'О' - 191: 30, # 'П' - 192: 39, # 'Р' - 193: 28, # 'С' - 194: 34, # 'Т' - 195: 51, # 'У' - 196: 48, # 'Ф' - 197: 49, # 'Х' - 198: 53, # 'Ц' - 199: 50, # 'Ч' - 200: 54, # 'Ш' - 201: 57, # 'Щ' - 202: 61, # 'Ъ' - 203: 239, # 'Ы' - 204: 67, # 'Ь' - 205: 240, # 'Э' - 206: 60, # 'Ю' - 207: 56, # 'Я' - 208: 1, # 'а' - 209: 18, # 'б' - 210: 9, # 'в' - 211: 20, # 'г' - 212: 11, # 'д' - 213: 3, # 'е' - 214: 23, # 'ж' - 215: 15, # 'з' - 216: 2, # 'и' - 217: 26, # 'й' - 218: 12, # 'к' - 219: 10, # 'л' - 220: 14, # 'м' - 221: 6, # 'н' - 222: 4, # 'о' - 223: 13, # 'п' - 224: 7, # 'р' - 225: 8, # 'с' - 226: 5, # 'т' - 227: 19, # 'у' - 228: 29, # 'ф' - 229: 25, # 'х' - 230: 22, # 'ц' - 231: 21, # 'ч' - 232: 27, # 'ш' - 233: 24, # 'щ' - 234: 17, # 'ъ' - 235: 75, # 'ы' - 236: 52, # 'ь' - 237: 241, # 'э' - 238: 42, # 'ю' - 239: 16, # 'я' - 240: 62, # '№' - 241: 242, # 'ё' - 242: 243, # 'ђ' - 243: 244, # 'ѓ' - 244: 58, # 'є' - 245: 245, # 'ѕ' - 246: 98, # 'і' - 247: 246, # 'ї' - 248: 247, # 'ј' - 249: 248, # 'љ' - 250: 249, # 'њ' - 251: 250, # 'ћ' - 252: 251, # 'ќ' - 253: 91, # '§' - 254: 252, # 'ў' - 255: 253, # 'џ' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 77, # 'A' + 66: 90, # 'B' + 67: 99, # 'C' + 68: 100, # 'D' + 69: 72, # 'E' + 70: 109, # 'F' + 71: 107, # 'G' + 72: 101, # 'H' + 73: 79, # 'I' + 74: 185, # 'J' + 75: 81, # 'K' + 76: 102, # 'L' + 77: 76, # 'M' + 78: 94, # 'N' + 79: 82, # 'O' + 80: 110, # 'P' + 81: 186, # 'Q' + 82: 108, # 'R' + 83: 91, # 'S' + 84: 74, # 'T' + 85: 119, # 'U' + 86: 84, # 'V' + 87: 96, # 'W' + 88: 111, # 'X' + 89: 187, # 'Y' + 90: 115, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 65, # 'a' + 98: 69, # 'b' + 99: 70, # 'c' + 100: 66, # 'd' + 101: 63, # 'e' + 102: 68, # 'f' + 103: 112, # 'g' + 104: 103, # 'h' + 105: 92, # 'i' + 106: 194, # 'j' + 107: 104, # 'k' + 108: 95, # 'l' + 109: 86, # 'm' + 110: 87, # 'n' + 111: 71, # 'o' + 112: 116, # 'p' + 113: 195, # 'q' + 114: 85, # 'r' + 115: 93, # 's' + 116: 97, # 't' + 117: 113, # 'u' + 118: 196, # 'v' + 119: 197, # 'w' + 120: 198, # 'x' + 121: 199, # 'y' + 122: 200, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 194, # '\x80' + 129: 195, # '\x81' + 130: 196, # '\x82' + 131: 197, # '\x83' + 132: 198, # '\x84' + 133: 199, # '\x85' + 134: 200, # '\x86' + 135: 201, # '\x87' + 136: 202, # '\x88' + 137: 203, # '\x89' + 138: 204, # '\x8a' + 139: 205, # '\x8b' + 140: 206, # '\x8c' + 141: 207, # '\x8d' + 142: 208, # '\x8e' + 143: 209, # '\x8f' + 144: 210, # '\x90' + 145: 211, # '\x91' + 146: 212, # '\x92' + 147: 213, # '\x93' + 148: 214, # '\x94' + 149: 215, # '\x95' + 150: 216, # '\x96' + 151: 217, # '\x97' + 152: 218, # '\x98' + 153: 219, # '\x99' + 154: 220, # '\x9a' + 155: 221, # '\x9b' + 156: 222, # '\x9c' + 157: 223, # '\x9d' + 158: 224, # '\x9e' + 159: 225, # '\x9f' + 160: 81, # '\xa0' + 161: 226, # 'Ё' + 162: 227, # 'Ђ' + 163: 228, # 'Ѓ' + 164: 229, # 'Є' + 165: 230, # 'Ѕ' + 166: 105, # 'І' + 167: 231, # 'Ї' + 168: 232, # 'Ј' + 169: 233, # 'Љ' + 170: 234, # 'Њ' + 171: 235, # 'Ћ' + 172: 236, # 'Ќ' + 173: 45, # '\xad' + 174: 237, # 'Ў' + 175: 238, # 'Џ' + 176: 31, # 'А' + 177: 32, # 'Б' + 178: 35, # 'В' + 179: 43, # 'Г' + 180: 37, # 'Д' + 181: 44, # 'Е' + 182: 55, # 'Ж' + 183: 47, # 'З' + 184: 40, # 'И' + 185: 59, # 'Й' + 186: 33, # 'К' + 187: 46, # 'Л' + 188: 38, # 'М' + 189: 36, # 'Н' + 190: 41, # 'О' + 191: 30, # 'П' + 192: 39, # 'Р' + 193: 28, # 'С' + 194: 34, # 'Т' + 195: 51, # 'У' + 196: 48, # 'Ф' + 197: 49, # 'Х' + 198: 53, # 'Ц' + 199: 50, # 'Ч' + 200: 54, # 'Ш' + 201: 57, # 'Щ' + 202: 61, # 'Ъ' + 203: 239, # 'Ы' + 204: 67, # 'Ь' + 205: 240, # 'Э' + 206: 60, # 'Ю' + 207: 56, # 'Я' + 208: 1, # 'а' + 209: 18, # 'б' + 210: 9, # 'в' + 211: 20, # 'г' + 212: 11, # 'д' + 213: 3, # 'е' + 214: 23, # 'ж' + 215: 15, # 'з' + 216: 2, # 'и' + 217: 26, # 'й' + 218: 12, # 'к' + 219: 10, # 'л' + 220: 14, # 'м' + 221: 6, # 'н' + 222: 4, # 'о' + 223: 13, # 'п' + 224: 7, # 'р' + 225: 8, # 'с' + 226: 5, # 'т' + 227: 19, # 'у' + 228: 29, # 'ф' + 229: 25, # 'х' + 230: 22, # 'ц' + 231: 21, # 'ч' + 232: 27, # 'ш' + 233: 24, # 'щ' + 234: 17, # 'ъ' + 235: 75, # 'ы' + 236: 52, # 'ь' + 237: 241, # 'э' + 238: 42, # 'ю' + 239: 16, # 'я' + 240: 62, # '№' + 241: 242, # 'ё' + 242: 243, # 'ђ' + 243: 244, # 'ѓ' + 244: 58, # 'є' + 245: 245, # 'ѕ' + 246: 98, # 'і' + 247: 246, # 'ї' + 248: 247, # 'ј' + 249: 248, # 'љ' + 250: 249, # 'њ' + 251: 250, # 'ћ' + 252: 251, # 'ќ' + 253: 91, # '§' + 254: 252, # 'ў' + 255: 253, # 'џ' } -ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-5', - language='Bulgarian', - char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER, - language_model=BULGARIAN_LANG_MODEL, - typical_positive_ratio=0.969392, - keep_ascii_letters=False, - alphabet='АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя') +ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-5", + language="Bulgarian", + char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER, + language_model=BULGARIAN_LANG_MODEL, + typical_positive_ratio=0.969392, + keep_ascii_letters=False, + alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", +) WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 77, # 'A' - 66: 90, # 'B' - 67: 99, # 'C' - 68: 100, # 'D' - 69: 72, # 'E' - 70: 109, # 'F' - 71: 107, # 'G' - 72: 101, # 'H' - 73: 79, # 'I' - 74: 185, # 'J' - 75: 81, # 'K' - 76: 102, # 'L' - 77: 76, # 'M' - 78: 94, # 'N' - 79: 82, # 'O' - 80: 110, # 'P' - 81: 186, # 'Q' - 82: 108, # 'R' - 83: 91, # 'S' - 84: 74, # 'T' - 85: 119, # 'U' - 86: 84, # 'V' - 87: 96, # 'W' - 88: 111, # 'X' - 89: 187, # 'Y' - 90: 115, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 65, # 'a' - 98: 69, # 'b' - 99: 70, # 'c' - 100: 66, # 'd' - 101: 63, # 'e' - 102: 68, # 'f' - 103: 112, # 'g' - 104: 103, # 'h' - 105: 92, # 'i' - 106: 194, # 'j' - 107: 104, # 'k' - 108: 95, # 'l' - 109: 86, # 'm' - 110: 87, # 'n' - 111: 71, # 'o' - 112: 116, # 'p' - 113: 195, # 'q' - 114: 85, # 'r' - 115: 93, # 's' - 116: 97, # 't' - 117: 113, # 'u' - 118: 196, # 'v' - 119: 197, # 'w' - 120: 198, # 'x' - 121: 199, # 'y' - 122: 200, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 206, # 'Ђ' - 129: 207, # 'Ѓ' - 130: 208, # '‚' - 131: 209, # 'ѓ' - 132: 210, # '„' - 133: 211, # '…' - 134: 212, # '†' - 135: 213, # '‡' - 136: 120, # '€' - 137: 214, # '‰' - 138: 215, # 'Љ' - 139: 216, # '‹' - 140: 217, # 'Њ' - 141: 218, # 'Ќ' - 142: 219, # 'Ћ' - 143: 220, # 'Џ' - 144: 221, # 'ђ' - 145: 78, # '‘' - 146: 64, # '’' - 147: 83, # '“' - 148: 121, # '”' - 149: 98, # '•' - 150: 117, # '–' - 151: 105, # '—' - 152: 222, # None - 153: 223, # '™' - 154: 224, # 'љ' - 155: 225, # '›' - 156: 226, # 'њ' - 157: 227, # 'ќ' - 158: 228, # 'ћ' - 159: 229, # 'џ' - 160: 88, # '\xa0' - 161: 230, # 'Ў' - 162: 231, # 'ў' - 163: 232, # 'Ј' - 164: 233, # '¤' - 165: 122, # 'Ґ' - 166: 89, # '¦' - 167: 106, # '§' - 168: 234, # 'Ё' - 169: 235, # '©' - 170: 236, # 'Є' - 171: 237, # '«' - 172: 238, # '¬' - 173: 45, # '\xad' - 174: 239, # '®' - 175: 240, # 'Ї' - 176: 73, # '°' - 177: 80, # '±' - 178: 118, # 'І' - 179: 114, # 'і' - 180: 241, # 'ґ' - 181: 242, # 'µ' - 182: 243, # '¶' - 183: 244, # '·' - 184: 245, # 'ё' - 185: 62, # '№' - 186: 58, # 'є' - 187: 246, # '»' - 188: 247, # 'ј' - 189: 248, # 'Ѕ' - 190: 249, # 'ѕ' - 191: 250, # 'ї' - 192: 31, # 'А' - 193: 32, # 'Б' - 194: 35, # 'В' - 195: 43, # 'Г' - 196: 37, # 'Д' - 197: 44, # 'Е' - 198: 55, # 'Ж' - 199: 47, # 'З' - 200: 40, # 'И' - 201: 59, # 'Й' - 202: 33, # 'К' - 203: 46, # 'Л' - 204: 38, # 'М' - 205: 36, # 'Н' - 206: 41, # 'О' - 207: 30, # 'П' - 208: 39, # 'Р' - 209: 28, # 'С' - 210: 34, # 'Т' - 211: 51, # 'У' - 212: 48, # 'Ф' - 213: 49, # 'Х' - 214: 53, # 'Ц' - 215: 50, # 'Ч' - 216: 54, # 'Ш' - 217: 57, # 'Щ' - 218: 61, # 'Ъ' - 219: 251, # 'Ы' - 220: 67, # 'Ь' - 221: 252, # 'Э' - 222: 60, # 'Ю' - 223: 56, # 'Я' - 224: 1, # 'а' - 225: 18, # 'б' - 226: 9, # 'в' - 227: 20, # 'г' - 228: 11, # 'д' - 229: 3, # 'е' - 230: 23, # 'ж' - 231: 15, # 'з' - 232: 2, # 'и' - 233: 26, # 'й' - 234: 12, # 'к' - 235: 10, # 'л' - 236: 14, # 'м' - 237: 6, # 'н' - 238: 4, # 'о' - 239: 13, # 'п' - 240: 7, # 'р' - 241: 8, # 'с' - 242: 5, # 'т' - 243: 19, # 'у' - 244: 29, # 'ф' - 245: 25, # 'х' - 246: 22, # 'ц' - 247: 21, # 'ч' - 248: 27, # 'ш' - 249: 24, # 'щ' - 250: 17, # 'ъ' - 251: 75, # 'ы' - 252: 52, # 'ь' - 253: 253, # 'э' - 254: 42, # 'ю' - 255: 16, # 'я' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 77, # 'A' + 66: 90, # 'B' + 67: 99, # 'C' + 68: 100, # 'D' + 69: 72, # 'E' + 70: 109, # 'F' + 71: 107, # 'G' + 72: 101, # 'H' + 73: 79, # 'I' + 74: 185, # 'J' + 75: 81, # 'K' + 76: 102, # 'L' + 77: 76, # 'M' + 78: 94, # 'N' + 79: 82, # 'O' + 80: 110, # 'P' + 81: 186, # 'Q' + 82: 108, # 'R' + 83: 91, # 'S' + 84: 74, # 'T' + 85: 119, # 'U' + 86: 84, # 'V' + 87: 96, # 'W' + 88: 111, # 'X' + 89: 187, # 'Y' + 90: 115, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 65, # 'a' + 98: 69, # 'b' + 99: 70, # 'c' + 100: 66, # 'd' + 101: 63, # 'e' + 102: 68, # 'f' + 103: 112, # 'g' + 104: 103, # 'h' + 105: 92, # 'i' + 106: 194, # 'j' + 107: 104, # 'k' + 108: 95, # 'l' + 109: 86, # 'm' + 110: 87, # 'n' + 111: 71, # 'o' + 112: 116, # 'p' + 113: 195, # 'q' + 114: 85, # 'r' + 115: 93, # 's' + 116: 97, # 't' + 117: 113, # 'u' + 118: 196, # 'v' + 119: 197, # 'w' + 120: 198, # 'x' + 121: 199, # 'y' + 122: 200, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 206, # 'Ђ' + 129: 207, # 'Ѓ' + 130: 208, # '‚' + 131: 209, # 'ѓ' + 132: 210, # '„' + 133: 211, # '…' + 134: 212, # '†' + 135: 213, # '‡' + 136: 120, # '€' + 137: 214, # '‰' + 138: 215, # 'Љ' + 139: 216, # '‹' + 140: 217, # 'Њ' + 141: 218, # 'Ќ' + 142: 219, # 'Ћ' + 143: 220, # 'Џ' + 144: 221, # 'ђ' + 145: 78, # '‘' + 146: 64, # '’' + 147: 83, # '“' + 148: 121, # '”' + 149: 98, # '•' + 150: 117, # '–' + 151: 105, # '—' + 152: 222, # None + 153: 223, # '™' + 154: 224, # 'љ' + 155: 225, # '›' + 156: 226, # 'њ' + 157: 227, # 'ќ' + 158: 228, # 'ћ' + 159: 229, # 'џ' + 160: 88, # '\xa0' + 161: 230, # 'Ў' + 162: 231, # 'ў' + 163: 232, # 'Ј' + 164: 233, # '¤' + 165: 122, # 'Ґ' + 166: 89, # '¦' + 167: 106, # '§' + 168: 234, # 'Ё' + 169: 235, # '©' + 170: 236, # 'Є' + 171: 237, # '«' + 172: 238, # '¬' + 173: 45, # '\xad' + 174: 239, # '®' + 175: 240, # 'Ї' + 176: 73, # '°' + 177: 80, # '±' + 178: 118, # 'І' + 179: 114, # 'і' + 180: 241, # 'ґ' + 181: 242, # 'µ' + 182: 243, # '¶' + 183: 244, # '·' + 184: 245, # 'ё' + 185: 62, # '№' + 186: 58, # 'є' + 187: 246, # '»' + 188: 247, # 'ј' + 189: 248, # 'Ѕ' + 190: 249, # 'ѕ' + 191: 250, # 'ї' + 192: 31, # 'А' + 193: 32, # 'Б' + 194: 35, # 'В' + 195: 43, # 'Г' + 196: 37, # 'Д' + 197: 44, # 'Е' + 198: 55, # 'Ж' + 199: 47, # 'З' + 200: 40, # 'И' + 201: 59, # 'Й' + 202: 33, # 'К' + 203: 46, # 'Л' + 204: 38, # 'М' + 205: 36, # 'Н' + 206: 41, # 'О' + 207: 30, # 'П' + 208: 39, # 'Р' + 209: 28, # 'С' + 210: 34, # 'Т' + 211: 51, # 'У' + 212: 48, # 'Ф' + 213: 49, # 'Х' + 214: 53, # 'Ц' + 215: 50, # 'Ч' + 216: 54, # 'Ш' + 217: 57, # 'Щ' + 218: 61, # 'Ъ' + 219: 251, # 'Ы' + 220: 67, # 'Ь' + 221: 252, # 'Э' + 222: 60, # 'Ю' + 223: 56, # 'Я' + 224: 1, # 'а' + 225: 18, # 'б' + 226: 9, # 'в' + 227: 20, # 'г' + 228: 11, # 'д' + 229: 3, # 'е' + 230: 23, # 'ж' + 231: 15, # 'з' + 232: 2, # 'и' + 233: 26, # 'й' + 234: 12, # 'к' + 235: 10, # 'л' + 236: 14, # 'м' + 237: 6, # 'н' + 238: 4, # 'о' + 239: 13, # 'п' + 240: 7, # 'р' + 241: 8, # 'с' + 242: 5, # 'т' + 243: 19, # 'у' + 244: 29, # 'ф' + 245: 25, # 'х' + 246: 22, # 'ц' + 247: 21, # 'ч' + 248: 27, # 'ш' + 249: 24, # 'щ' + 250: 17, # 'ъ' + 251: 75, # 'ы' + 252: 52, # 'ь' + 253: 253, # 'э' + 254: 42, # 'ю' + 255: 16, # 'я' } -WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1251', - language='Bulgarian', - char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER, - language_model=BULGARIAN_LANG_MODEL, - typical_positive_ratio=0.969392, - keep_ascii_letters=False, - alphabet='АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя') - +WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel( + charset_name="windows-1251", + language="Bulgarian", + char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER, + language_model=BULGARIAN_LANG_MODEL, + typical_positive_ratio=0.969392, + keep_ascii_letters=False, + alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя", +) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py index d99528e..cfb8639 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -1,9 +1,5 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - # 3: Positive # 2: Likely # 1: Unlikely @@ -3863,536 +3859,539 @@ GREEK_LANG_MODEL = { # Character Mapping Table(s): WINDOWS_1253_GREEK_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 82, # 'A' - 66: 100, # 'B' - 67: 104, # 'C' - 68: 94, # 'D' - 69: 98, # 'E' - 70: 101, # 'F' - 71: 116, # 'G' - 72: 102, # 'H' - 73: 111, # 'I' - 74: 187, # 'J' - 75: 117, # 'K' - 76: 92, # 'L' - 77: 88, # 'M' - 78: 113, # 'N' - 79: 85, # 'O' - 80: 79, # 'P' - 81: 118, # 'Q' - 82: 105, # 'R' - 83: 83, # 'S' - 84: 67, # 'T' - 85: 114, # 'U' - 86: 119, # 'V' - 87: 95, # 'W' - 88: 99, # 'X' - 89: 109, # 'Y' - 90: 188, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 72, # 'a' - 98: 70, # 'b' - 99: 80, # 'c' - 100: 81, # 'd' - 101: 60, # 'e' - 102: 96, # 'f' - 103: 93, # 'g' - 104: 89, # 'h' - 105: 68, # 'i' - 106: 120, # 'j' - 107: 97, # 'k' - 108: 77, # 'l' - 109: 86, # 'm' - 110: 69, # 'n' - 111: 55, # 'o' - 112: 78, # 'p' - 113: 115, # 'q' - 114: 65, # 'r' - 115: 66, # 's' - 116: 58, # 't' - 117: 76, # 'u' - 118: 106, # 'v' - 119: 103, # 'w' - 120: 87, # 'x' - 121: 107, # 'y' - 122: 112, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 255, # '€' - 129: 255, # None - 130: 255, # '‚' - 131: 255, # 'ƒ' - 132: 255, # '„' - 133: 255, # '…' - 134: 255, # '†' - 135: 255, # '‡' - 136: 255, # None - 137: 255, # '‰' - 138: 255, # None - 139: 255, # '‹' - 140: 255, # None - 141: 255, # None - 142: 255, # None - 143: 255, # None - 144: 255, # None - 145: 255, # '‘' - 146: 255, # '’' - 147: 255, # '“' - 148: 255, # '”' - 149: 255, # '•' - 150: 255, # '–' - 151: 255, # '—' - 152: 255, # None - 153: 255, # '™' - 154: 255, # None - 155: 255, # '›' - 156: 255, # None - 157: 255, # None - 158: 255, # None - 159: 255, # None - 160: 253, # '\xa0' - 161: 233, # '΅' - 162: 61, # 'Ά' - 163: 253, # '£' - 164: 253, # '¤' - 165: 253, # '¥' - 166: 253, # '¦' - 167: 253, # '§' - 168: 253, # '¨' - 169: 253, # '©' - 170: 253, # None - 171: 253, # '«' - 172: 253, # '¬' - 173: 74, # '\xad' - 174: 253, # '®' - 175: 253, # '―' - 176: 253, # '°' - 177: 253, # '±' - 178: 253, # '²' - 179: 253, # '³' - 180: 247, # '΄' - 181: 253, # 'µ' - 182: 253, # '¶' - 183: 36, # '·' - 184: 46, # 'Έ' - 185: 71, # 'Ή' - 186: 73, # 'Ί' - 187: 253, # '»' - 188: 54, # 'Ό' - 189: 253, # '½' - 190: 108, # 'Ύ' - 191: 123, # 'Ώ' - 192: 110, # 'ΐ' - 193: 31, # 'Α' - 194: 51, # 'Β' - 195: 43, # 'Γ' - 196: 41, # 'Δ' - 197: 34, # 'Ε' - 198: 91, # 'Ζ' - 199: 40, # 'Η' - 200: 52, # 'Θ' - 201: 47, # 'Ι' - 202: 44, # 'Κ' - 203: 53, # 'Λ' - 204: 38, # 'Μ' - 205: 49, # 'Ν' - 206: 59, # 'Ξ' - 207: 39, # 'Ο' - 208: 35, # 'Π' - 209: 48, # 'Ρ' - 210: 250, # None - 211: 37, # 'Σ' - 212: 33, # 'Τ' - 213: 45, # 'Υ' - 214: 56, # 'Φ' - 215: 50, # 'Χ' - 216: 84, # 'Ψ' - 217: 57, # 'Ω' - 218: 120, # 'Ϊ' - 219: 121, # 'Ϋ' - 220: 17, # 'ά' - 221: 18, # 'έ' - 222: 22, # 'ή' - 223: 15, # 'ί' - 224: 124, # 'ΰ' - 225: 1, # 'α' - 226: 29, # 'β' - 227: 20, # 'γ' - 228: 21, # 'δ' - 229: 3, # 'ε' - 230: 32, # 'ζ' - 231: 13, # 'η' - 232: 25, # 'θ' - 233: 5, # 'ι' - 234: 11, # 'κ' - 235: 16, # 'λ' - 236: 10, # 'μ' - 237: 6, # 'ν' - 238: 30, # 'ξ' - 239: 4, # 'ο' - 240: 9, # 'π' - 241: 8, # 'ρ' - 242: 14, # 'ς' - 243: 7, # 'σ' - 244: 2, # 'τ' - 245: 12, # 'υ' - 246: 28, # 'φ' - 247: 23, # 'χ' - 248: 42, # 'ψ' - 249: 24, # 'ω' - 250: 64, # 'ϊ' - 251: 75, # 'ϋ' - 252: 19, # 'ό' - 253: 26, # 'ύ' - 254: 27, # 'ώ' - 255: 253, # None + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 82, # 'A' + 66: 100, # 'B' + 67: 104, # 'C' + 68: 94, # 'D' + 69: 98, # 'E' + 70: 101, # 'F' + 71: 116, # 'G' + 72: 102, # 'H' + 73: 111, # 'I' + 74: 187, # 'J' + 75: 117, # 'K' + 76: 92, # 'L' + 77: 88, # 'M' + 78: 113, # 'N' + 79: 85, # 'O' + 80: 79, # 'P' + 81: 118, # 'Q' + 82: 105, # 'R' + 83: 83, # 'S' + 84: 67, # 'T' + 85: 114, # 'U' + 86: 119, # 'V' + 87: 95, # 'W' + 88: 99, # 'X' + 89: 109, # 'Y' + 90: 188, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 72, # 'a' + 98: 70, # 'b' + 99: 80, # 'c' + 100: 81, # 'd' + 101: 60, # 'e' + 102: 96, # 'f' + 103: 93, # 'g' + 104: 89, # 'h' + 105: 68, # 'i' + 106: 120, # 'j' + 107: 97, # 'k' + 108: 77, # 'l' + 109: 86, # 'm' + 110: 69, # 'n' + 111: 55, # 'o' + 112: 78, # 'p' + 113: 115, # 'q' + 114: 65, # 'r' + 115: 66, # 's' + 116: 58, # 't' + 117: 76, # 'u' + 118: 106, # 'v' + 119: 103, # 'w' + 120: 87, # 'x' + 121: 107, # 'y' + 122: 112, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 255, # '€' + 129: 255, # None + 130: 255, # '‚' + 131: 255, # 'ƒ' + 132: 255, # '„' + 133: 255, # '…' + 134: 255, # '†' + 135: 255, # '‡' + 136: 255, # None + 137: 255, # '‰' + 138: 255, # None + 139: 255, # '‹' + 140: 255, # None + 141: 255, # None + 142: 255, # None + 143: 255, # None + 144: 255, # None + 145: 255, # '‘' + 146: 255, # '’' + 147: 255, # '“' + 148: 255, # '”' + 149: 255, # '•' + 150: 255, # '–' + 151: 255, # '—' + 152: 255, # None + 153: 255, # '™' + 154: 255, # None + 155: 255, # '›' + 156: 255, # None + 157: 255, # None + 158: 255, # None + 159: 255, # None + 160: 253, # '\xa0' + 161: 233, # '΅' + 162: 61, # 'Ά' + 163: 253, # '£' + 164: 253, # '¤' + 165: 253, # '¥' + 166: 253, # '¦' + 167: 253, # '§' + 168: 253, # '¨' + 169: 253, # '©' + 170: 253, # None + 171: 253, # '«' + 172: 253, # '¬' + 173: 74, # '\xad' + 174: 253, # '®' + 175: 253, # '―' + 176: 253, # '°' + 177: 253, # '±' + 178: 253, # '²' + 179: 253, # '³' + 180: 247, # '΄' + 181: 253, # 'µ' + 182: 253, # '¶' + 183: 36, # '·' + 184: 46, # 'Έ' + 185: 71, # 'Ή' + 186: 73, # 'Ί' + 187: 253, # '»' + 188: 54, # 'Ό' + 189: 253, # '½' + 190: 108, # 'Ύ' + 191: 123, # 'Ώ' + 192: 110, # 'ΐ' + 193: 31, # 'Α' + 194: 51, # 'Β' + 195: 43, # 'Γ' + 196: 41, # 'Δ' + 197: 34, # 'Ε' + 198: 91, # 'Ζ' + 199: 40, # 'Η' + 200: 52, # 'Θ' + 201: 47, # 'Ι' + 202: 44, # 'Κ' + 203: 53, # 'Λ' + 204: 38, # 'Μ' + 205: 49, # 'Ν' + 206: 59, # 'Ξ' + 207: 39, # 'Ο' + 208: 35, # 'Π' + 209: 48, # 'Ρ' + 210: 250, # None + 211: 37, # 'Σ' + 212: 33, # 'Τ' + 213: 45, # 'Υ' + 214: 56, # 'Φ' + 215: 50, # 'Χ' + 216: 84, # 'Ψ' + 217: 57, # 'Ω' + 218: 120, # 'Ϊ' + 219: 121, # 'Ϋ' + 220: 17, # 'ά' + 221: 18, # 'έ' + 222: 22, # 'ή' + 223: 15, # 'ί' + 224: 124, # 'ΰ' + 225: 1, # 'α' + 226: 29, # 'β' + 227: 20, # 'γ' + 228: 21, # 'δ' + 229: 3, # 'ε' + 230: 32, # 'ζ' + 231: 13, # 'η' + 232: 25, # 'θ' + 233: 5, # 'ι' + 234: 11, # 'κ' + 235: 16, # 'λ' + 236: 10, # 'μ' + 237: 6, # 'ν' + 238: 30, # 'ξ' + 239: 4, # 'ο' + 240: 9, # 'π' + 241: 8, # 'ρ' + 242: 14, # 'ς' + 243: 7, # 'σ' + 244: 2, # 'τ' + 245: 12, # 'υ' + 246: 28, # 'φ' + 247: 23, # 'χ' + 248: 42, # 'ψ' + 249: 24, # 'ω' + 250: 64, # 'ϊ' + 251: 75, # 'ϋ' + 252: 19, # 'ό' + 253: 26, # 'ύ' + 254: 27, # 'ώ' + 255: 253, # None } -WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel(charset_name='windows-1253', - language='Greek', - char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER, - language_model=GREEK_LANG_MODEL, - typical_positive_ratio=0.982851, - keep_ascii_letters=False, - alphabet='ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ') +WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel( + charset_name="windows-1253", + language="Greek", + char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER, + language_model=GREEK_LANG_MODEL, + typical_positive_ratio=0.982851, + keep_ascii_letters=False, + alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ", +) ISO_8859_7_GREEK_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 82, # 'A' - 66: 100, # 'B' - 67: 104, # 'C' - 68: 94, # 'D' - 69: 98, # 'E' - 70: 101, # 'F' - 71: 116, # 'G' - 72: 102, # 'H' - 73: 111, # 'I' - 74: 187, # 'J' - 75: 117, # 'K' - 76: 92, # 'L' - 77: 88, # 'M' - 78: 113, # 'N' - 79: 85, # 'O' - 80: 79, # 'P' - 81: 118, # 'Q' - 82: 105, # 'R' - 83: 83, # 'S' - 84: 67, # 'T' - 85: 114, # 'U' - 86: 119, # 'V' - 87: 95, # 'W' - 88: 99, # 'X' - 89: 109, # 'Y' - 90: 188, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 72, # 'a' - 98: 70, # 'b' - 99: 80, # 'c' - 100: 81, # 'd' - 101: 60, # 'e' - 102: 96, # 'f' - 103: 93, # 'g' - 104: 89, # 'h' - 105: 68, # 'i' - 106: 120, # 'j' - 107: 97, # 'k' - 108: 77, # 'l' - 109: 86, # 'm' - 110: 69, # 'n' - 111: 55, # 'o' - 112: 78, # 'p' - 113: 115, # 'q' - 114: 65, # 'r' - 115: 66, # 's' - 116: 58, # 't' - 117: 76, # 'u' - 118: 106, # 'v' - 119: 103, # 'w' - 120: 87, # 'x' - 121: 107, # 'y' - 122: 112, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 255, # '\x80' - 129: 255, # '\x81' - 130: 255, # '\x82' - 131: 255, # '\x83' - 132: 255, # '\x84' - 133: 255, # '\x85' - 134: 255, # '\x86' - 135: 255, # '\x87' - 136: 255, # '\x88' - 137: 255, # '\x89' - 138: 255, # '\x8a' - 139: 255, # '\x8b' - 140: 255, # '\x8c' - 141: 255, # '\x8d' - 142: 255, # '\x8e' - 143: 255, # '\x8f' - 144: 255, # '\x90' - 145: 255, # '\x91' - 146: 255, # '\x92' - 147: 255, # '\x93' - 148: 255, # '\x94' - 149: 255, # '\x95' - 150: 255, # '\x96' - 151: 255, # '\x97' - 152: 255, # '\x98' - 153: 255, # '\x99' - 154: 255, # '\x9a' - 155: 255, # '\x9b' - 156: 255, # '\x9c' - 157: 255, # '\x9d' - 158: 255, # '\x9e' - 159: 255, # '\x9f' - 160: 253, # '\xa0' - 161: 233, # '‘' - 162: 90, # '’' - 163: 253, # '£' - 164: 253, # '€' - 165: 253, # '₯' - 166: 253, # '¦' - 167: 253, # '§' - 168: 253, # '¨' - 169: 253, # '©' - 170: 253, # 'ͺ' - 171: 253, # '«' - 172: 253, # '¬' - 173: 74, # '\xad' - 174: 253, # None - 175: 253, # '―' - 176: 253, # '°' - 177: 253, # '±' - 178: 253, # '²' - 179: 253, # '³' - 180: 247, # '΄' - 181: 248, # '΅' - 182: 61, # 'Ά' - 183: 36, # '·' - 184: 46, # 'Έ' - 185: 71, # 'Ή' - 186: 73, # 'Ί' - 187: 253, # '»' - 188: 54, # 'Ό' - 189: 253, # '½' - 190: 108, # 'Ύ' - 191: 123, # 'Ώ' - 192: 110, # 'ΐ' - 193: 31, # 'Α' - 194: 51, # 'Β' - 195: 43, # 'Γ' - 196: 41, # 'Δ' - 197: 34, # 'Ε' - 198: 91, # 'Ζ' - 199: 40, # 'Η' - 200: 52, # 'Θ' - 201: 47, # 'Ι' - 202: 44, # 'Κ' - 203: 53, # 'Λ' - 204: 38, # 'Μ' - 205: 49, # 'Ν' - 206: 59, # 'Ξ' - 207: 39, # 'Ο' - 208: 35, # 'Π' - 209: 48, # 'Ρ' - 210: 250, # None - 211: 37, # 'Σ' - 212: 33, # 'Τ' - 213: 45, # 'Υ' - 214: 56, # 'Φ' - 215: 50, # 'Χ' - 216: 84, # 'Ψ' - 217: 57, # 'Ω' - 218: 120, # 'Ϊ' - 219: 121, # 'Ϋ' - 220: 17, # 'ά' - 221: 18, # 'έ' - 222: 22, # 'ή' - 223: 15, # 'ί' - 224: 124, # 'ΰ' - 225: 1, # 'α' - 226: 29, # 'β' - 227: 20, # 'γ' - 228: 21, # 'δ' - 229: 3, # 'ε' - 230: 32, # 'ζ' - 231: 13, # 'η' - 232: 25, # 'θ' - 233: 5, # 'ι' - 234: 11, # 'κ' - 235: 16, # 'λ' - 236: 10, # 'μ' - 237: 6, # 'ν' - 238: 30, # 'ξ' - 239: 4, # 'ο' - 240: 9, # 'π' - 241: 8, # 'ρ' - 242: 14, # 'ς' - 243: 7, # 'σ' - 244: 2, # 'τ' - 245: 12, # 'υ' - 246: 28, # 'φ' - 247: 23, # 'χ' - 248: 42, # 'ψ' - 249: 24, # 'ω' - 250: 64, # 'ϊ' - 251: 75, # 'ϋ' - 252: 19, # 'ό' - 253: 26, # 'ύ' - 254: 27, # 'ώ' - 255: 253, # None + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 82, # 'A' + 66: 100, # 'B' + 67: 104, # 'C' + 68: 94, # 'D' + 69: 98, # 'E' + 70: 101, # 'F' + 71: 116, # 'G' + 72: 102, # 'H' + 73: 111, # 'I' + 74: 187, # 'J' + 75: 117, # 'K' + 76: 92, # 'L' + 77: 88, # 'M' + 78: 113, # 'N' + 79: 85, # 'O' + 80: 79, # 'P' + 81: 118, # 'Q' + 82: 105, # 'R' + 83: 83, # 'S' + 84: 67, # 'T' + 85: 114, # 'U' + 86: 119, # 'V' + 87: 95, # 'W' + 88: 99, # 'X' + 89: 109, # 'Y' + 90: 188, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 72, # 'a' + 98: 70, # 'b' + 99: 80, # 'c' + 100: 81, # 'd' + 101: 60, # 'e' + 102: 96, # 'f' + 103: 93, # 'g' + 104: 89, # 'h' + 105: 68, # 'i' + 106: 120, # 'j' + 107: 97, # 'k' + 108: 77, # 'l' + 109: 86, # 'm' + 110: 69, # 'n' + 111: 55, # 'o' + 112: 78, # 'p' + 113: 115, # 'q' + 114: 65, # 'r' + 115: 66, # 's' + 116: 58, # 't' + 117: 76, # 'u' + 118: 106, # 'v' + 119: 103, # 'w' + 120: 87, # 'x' + 121: 107, # 'y' + 122: 112, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 255, # '\x80' + 129: 255, # '\x81' + 130: 255, # '\x82' + 131: 255, # '\x83' + 132: 255, # '\x84' + 133: 255, # '\x85' + 134: 255, # '\x86' + 135: 255, # '\x87' + 136: 255, # '\x88' + 137: 255, # '\x89' + 138: 255, # '\x8a' + 139: 255, # '\x8b' + 140: 255, # '\x8c' + 141: 255, # '\x8d' + 142: 255, # '\x8e' + 143: 255, # '\x8f' + 144: 255, # '\x90' + 145: 255, # '\x91' + 146: 255, # '\x92' + 147: 255, # '\x93' + 148: 255, # '\x94' + 149: 255, # '\x95' + 150: 255, # '\x96' + 151: 255, # '\x97' + 152: 255, # '\x98' + 153: 255, # '\x99' + 154: 255, # '\x9a' + 155: 255, # '\x9b' + 156: 255, # '\x9c' + 157: 255, # '\x9d' + 158: 255, # '\x9e' + 159: 255, # '\x9f' + 160: 253, # '\xa0' + 161: 233, # '‘' + 162: 90, # '’' + 163: 253, # '£' + 164: 253, # '€' + 165: 253, # '₯' + 166: 253, # '¦' + 167: 253, # '§' + 168: 253, # '¨' + 169: 253, # '©' + 170: 253, # 'ͺ' + 171: 253, # '«' + 172: 253, # '¬' + 173: 74, # '\xad' + 174: 253, # None + 175: 253, # '―' + 176: 253, # '°' + 177: 253, # '±' + 178: 253, # '²' + 179: 253, # '³' + 180: 247, # '΄' + 181: 248, # '΅' + 182: 61, # 'Ά' + 183: 36, # '·' + 184: 46, # 'Έ' + 185: 71, # 'Ή' + 186: 73, # 'Ί' + 187: 253, # '»' + 188: 54, # 'Ό' + 189: 253, # '½' + 190: 108, # 'Ύ' + 191: 123, # 'Ώ' + 192: 110, # 'ΐ' + 193: 31, # 'Α' + 194: 51, # 'Β' + 195: 43, # 'Γ' + 196: 41, # 'Δ' + 197: 34, # 'Ε' + 198: 91, # 'Ζ' + 199: 40, # 'Η' + 200: 52, # 'Θ' + 201: 47, # 'Ι' + 202: 44, # 'Κ' + 203: 53, # 'Λ' + 204: 38, # 'Μ' + 205: 49, # 'Ν' + 206: 59, # 'Ξ' + 207: 39, # 'Ο' + 208: 35, # 'Π' + 209: 48, # 'Ρ' + 210: 250, # None + 211: 37, # 'Σ' + 212: 33, # 'Τ' + 213: 45, # 'Υ' + 214: 56, # 'Φ' + 215: 50, # 'Χ' + 216: 84, # 'Ψ' + 217: 57, # 'Ω' + 218: 120, # 'Ϊ' + 219: 121, # 'Ϋ' + 220: 17, # 'ά' + 221: 18, # 'έ' + 222: 22, # 'ή' + 223: 15, # 'ί' + 224: 124, # 'ΰ' + 225: 1, # 'α' + 226: 29, # 'β' + 227: 20, # 'γ' + 228: 21, # 'δ' + 229: 3, # 'ε' + 230: 32, # 'ζ' + 231: 13, # 'η' + 232: 25, # 'θ' + 233: 5, # 'ι' + 234: 11, # 'κ' + 235: 16, # 'λ' + 236: 10, # 'μ' + 237: 6, # 'ν' + 238: 30, # 'ξ' + 239: 4, # 'ο' + 240: 9, # 'π' + 241: 8, # 'ρ' + 242: 14, # 'ς' + 243: 7, # 'σ' + 244: 2, # 'τ' + 245: 12, # 'υ' + 246: 28, # 'φ' + 247: 23, # 'χ' + 248: 42, # 'ψ' + 249: 24, # 'ω' + 250: 64, # 'ϊ' + 251: 75, # 'ϋ' + 252: 19, # 'ό' + 253: 26, # 'ύ' + 254: 27, # 'ώ' + 255: 253, # None } -ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-7', - language='Greek', - char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER, - language_model=GREEK_LANG_MODEL, - typical_positive_ratio=0.982851, - keep_ascii_letters=False, - alphabet='ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ') - +ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-7", + language="Greek", + char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER, + language_model=GREEK_LANG_MODEL, + typical_positive_ratio=0.982851, + keep_ascii_letters=False, + alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ", +) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py index 484c652..56d2975 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py @@ -1,9 +1,5 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - # 3: Positive # 2: Likely # 1: Unlikely @@ -4115,269 +4111,270 @@ HEBREW_LANG_MODEL = { # Character Mapping Table(s): WINDOWS_1255_HEBREW_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 69, # 'A' - 66: 91, # 'B' - 67: 79, # 'C' - 68: 80, # 'D' - 69: 92, # 'E' - 70: 89, # 'F' - 71: 97, # 'G' - 72: 90, # 'H' - 73: 68, # 'I' - 74: 111, # 'J' - 75: 112, # 'K' - 76: 82, # 'L' - 77: 73, # 'M' - 78: 95, # 'N' - 79: 85, # 'O' - 80: 78, # 'P' - 81: 121, # 'Q' - 82: 86, # 'R' - 83: 71, # 'S' - 84: 67, # 'T' - 85: 102, # 'U' - 86: 107, # 'V' - 87: 84, # 'W' - 88: 114, # 'X' - 89: 103, # 'Y' - 90: 115, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 50, # 'a' - 98: 74, # 'b' - 99: 60, # 'c' - 100: 61, # 'd' - 101: 42, # 'e' - 102: 76, # 'f' - 103: 70, # 'g' - 104: 64, # 'h' - 105: 53, # 'i' - 106: 105, # 'j' - 107: 93, # 'k' - 108: 56, # 'l' - 109: 65, # 'm' - 110: 54, # 'n' - 111: 49, # 'o' - 112: 66, # 'p' - 113: 110, # 'q' - 114: 51, # 'r' - 115: 43, # 's' - 116: 44, # 't' - 117: 63, # 'u' - 118: 81, # 'v' - 119: 77, # 'w' - 120: 98, # 'x' - 121: 75, # 'y' - 122: 108, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 124, # '€' - 129: 202, # None - 130: 203, # '‚' - 131: 204, # 'ƒ' - 132: 205, # '„' - 133: 40, # '…' - 134: 58, # '†' - 135: 206, # '‡' - 136: 207, # 'ˆ' - 137: 208, # '‰' - 138: 209, # None - 139: 210, # '‹' - 140: 211, # None - 141: 212, # None - 142: 213, # None - 143: 214, # None - 144: 215, # None - 145: 83, # '‘' - 146: 52, # '’' - 147: 47, # '“' - 148: 46, # '”' - 149: 72, # '•' - 150: 32, # '–' - 151: 94, # '—' - 152: 216, # '˜' - 153: 113, # '™' - 154: 217, # None - 155: 109, # '›' - 156: 218, # None - 157: 219, # None - 158: 220, # None - 159: 221, # None - 160: 34, # '\xa0' - 161: 116, # '¡' - 162: 222, # '¢' - 163: 118, # '£' - 164: 100, # '₪' - 165: 223, # '¥' - 166: 224, # '¦' - 167: 117, # '§' - 168: 119, # '¨' - 169: 104, # '©' - 170: 125, # '×' - 171: 225, # '«' - 172: 226, # '¬' - 173: 87, # '\xad' - 174: 99, # '®' - 175: 227, # '¯' - 176: 106, # '°' - 177: 122, # '±' - 178: 123, # '²' - 179: 228, # '³' - 180: 55, # '´' - 181: 229, # 'µ' - 182: 230, # '¶' - 183: 101, # '·' - 184: 231, # '¸' - 185: 232, # '¹' - 186: 120, # '÷' - 187: 233, # '»' - 188: 48, # '¼' - 189: 39, # '½' - 190: 57, # '¾' - 191: 234, # '¿' - 192: 30, # 'ְ' - 193: 59, # 'ֱ' - 194: 41, # 'ֲ' - 195: 88, # 'ֳ' - 196: 33, # 'ִ' - 197: 37, # 'ֵ' - 198: 36, # 'ֶ' - 199: 31, # 'ַ' - 200: 29, # 'ָ' - 201: 35, # 'ֹ' - 202: 235, # None - 203: 62, # 'ֻ' - 204: 28, # 'ּ' - 205: 236, # 'ֽ' - 206: 126, # '־' - 207: 237, # 'ֿ' - 208: 238, # '׀' - 209: 38, # 'ׁ' - 210: 45, # 'ׂ' - 211: 239, # '׃' - 212: 240, # 'װ' - 213: 241, # 'ױ' - 214: 242, # 'ײ' - 215: 243, # '׳' - 216: 127, # '״' - 217: 244, # None - 218: 245, # None - 219: 246, # None - 220: 247, # None - 221: 248, # None - 222: 249, # None - 223: 250, # None - 224: 9, # 'א' - 225: 8, # 'ב' - 226: 20, # 'ג' - 227: 16, # 'ד' - 228: 3, # 'ה' - 229: 2, # 'ו' - 230: 24, # 'ז' - 231: 14, # 'ח' - 232: 22, # 'ט' - 233: 1, # 'י' - 234: 25, # 'ך' - 235: 15, # 'כ' - 236: 4, # 'ל' - 237: 11, # 'ם' - 238: 6, # 'מ' - 239: 23, # 'ן' - 240: 12, # 'נ' - 241: 19, # 'ס' - 242: 13, # 'ע' - 243: 26, # 'ף' - 244: 18, # 'פ' - 245: 27, # 'ץ' - 246: 21, # 'צ' - 247: 17, # 'ק' - 248: 7, # 'ר' - 249: 10, # 'ש' - 250: 5, # 'ת' - 251: 251, # None - 252: 252, # None - 253: 128, # '\u200e' - 254: 96, # '\u200f' - 255: 253, # None + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 69, # 'A' + 66: 91, # 'B' + 67: 79, # 'C' + 68: 80, # 'D' + 69: 92, # 'E' + 70: 89, # 'F' + 71: 97, # 'G' + 72: 90, # 'H' + 73: 68, # 'I' + 74: 111, # 'J' + 75: 112, # 'K' + 76: 82, # 'L' + 77: 73, # 'M' + 78: 95, # 'N' + 79: 85, # 'O' + 80: 78, # 'P' + 81: 121, # 'Q' + 82: 86, # 'R' + 83: 71, # 'S' + 84: 67, # 'T' + 85: 102, # 'U' + 86: 107, # 'V' + 87: 84, # 'W' + 88: 114, # 'X' + 89: 103, # 'Y' + 90: 115, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 50, # 'a' + 98: 74, # 'b' + 99: 60, # 'c' + 100: 61, # 'd' + 101: 42, # 'e' + 102: 76, # 'f' + 103: 70, # 'g' + 104: 64, # 'h' + 105: 53, # 'i' + 106: 105, # 'j' + 107: 93, # 'k' + 108: 56, # 'l' + 109: 65, # 'm' + 110: 54, # 'n' + 111: 49, # 'o' + 112: 66, # 'p' + 113: 110, # 'q' + 114: 51, # 'r' + 115: 43, # 's' + 116: 44, # 't' + 117: 63, # 'u' + 118: 81, # 'v' + 119: 77, # 'w' + 120: 98, # 'x' + 121: 75, # 'y' + 122: 108, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 124, # '€' + 129: 202, # None + 130: 203, # '‚' + 131: 204, # 'ƒ' + 132: 205, # '„' + 133: 40, # '…' + 134: 58, # '†' + 135: 206, # '‡' + 136: 207, # 'ˆ' + 137: 208, # '‰' + 138: 209, # None + 139: 210, # '‹' + 140: 211, # None + 141: 212, # None + 142: 213, # None + 143: 214, # None + 144: 215, # None + 145: 83, # '‘' + 146: 52, # '’' + 147: 47, # '“' + 148: 46, # '”' + 149: 72, # '•' + 150: 32, # '–' + 151: 94, # '—' + 152: 216, # '˜' + 153: 113, # '™' + 154: 217, # None + 155: 109, # '›' + 156: 218, # None + 157: 219, # None + 158: 220, # None + 159: 221, # None + 160: 34, # '\xa0' + 161: 116, # '¡' + 162: 222, # '¢' + 163: 118, # '£' + 164: 100, # '₪' + 165: 223, # '¥' + 166: 224, # '¦' + 167: 117, # '§' + 168: 119, # '¨' + 169: 104, # '©' + 170: 125, # '×' + 171: 225, # '«' + 172: 226, # '¬' + 173: 87, # '\xad' + 174: 99, # '®' + 175: 227, # '¯' + 176: 106, # '°' + 177: 122, # '±' + 178: 123, # '²' + 179: 228, # '³' + 180: 55, # '´' + 181: 229, # 'µ' + 182: 230, # '¶' + 183: 101, # '·' + 184: 231, # '¸' + 185: 232, # '¹' + 186: 120, # '÷' + 187: 233, # '»' + 188: 48, # '¼' + 189: 39, # '½' + 190: 57, # '¾' + 191: 234, # '¿' + 192: 30, # 'ְ' + 193: 59, # 'ֱ' + 194: 41, # 'ֲ' + 195: 88, # 'ֳ' + 196: 33, # 'ִ' + 197: 37, # 'ֵ' + 198: 36, # 'ֶ' + 199: 31, # 'ַ' + 200: 29, # 'ָ' + 201: 35, # 'ֹ' + 202: 235, # None + 203: 62, # 'ֻ' + 204: 28, # 'ּ' + 205: 236, # 'ֽ' + 206: 126, # '־' + 207: 237, # 'ֿ' + 208: 238, # '׀' + 209: 38, # 'ׁ' + 210: 45, # 'ׂ' + 211: 239, # '׃' + 212: 240, # 'װ' + 213: 241, # 'ױ' + 214: 242, # 'ײ' + 215: 243, # '׳' + 216: 127, # '״' + 217: 244, # None + 218: 245, # None + 219: 246, # None + 220: 247, # None + 221: 248, # None + 222: 249, # None + 223: 250, # None + 224: 9, # 'א' + 225: 8, # 'ב' + 226: 20, # 'ג' + 227: 16, # 'ד' + 228: 3, # 'ה' + 229: 2, # 'ו' + 230: 24, # 'ז' + 231: 14, # 'ח' + 232: 22, # 'ט' + 233: 1, # 'י' + 234: 25, # 'ך' + 235: 15, # 'כ' + 236: 4, # 'ל' + 237: 11, # 'ם' + 238: 6, # 'מ' + 239: 23, # 'ן' + 240: 12, # 'נ' + 241: 19, # 'ס' + 242: 13, # 'ע' + 243: 26, # 'ף' + 244: 18, # 'פ' + 245: 27, # 'ץ' + 246: 21, # 'צ' + 247: 17, # 'ק' + 248: 7, # 'ר' + 249: 10, # 'ש' + 250: 5, # 'ת' + 251: 251, # None + 252: 252, # None + 253: 128, # '\u200e' + 254: 96, # '\u200f' + 255: 253, # None } -WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel(charset_name='windows-1255', - language='Hebrew', - char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER, - language_model=HEBREW_LANG_MODEL, - typical_positive_ratio=0.984004, - keep_ascii_letters=False, - alphabet='אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ') - +WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel( + charset_name="windows-1255", + language="Hebrew", + char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER, + language_model=HEBREW_LANG_MODEL, + typical_positive_ratio=0.984004, + keep_ascii_letters=False, + alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ", +) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py index bbc5cda..09a0d32 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -1,9 +1,5 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - # 3: Positive # 2: Likely # 1: Unlikely @@ -4115,536 +4111,539 @@ HUNGARIAN_LANG_MODEL = { # Character Mapping Table(s): WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 28, # 'A' - 66: 40, # 'B' - 67: 54, # 'C' - 68: 45, # 'D' - 69: 32, # 'E' - 70: 50, # 'F' - 71: 49, # 'G' - 72: 38, # 'H' - 73: 39, # 'I' - 74: 53, # 'J' - 75: 36, # 'K' - 76: 41, # 'L' - 77: 34, # 'M' - 78: 35, # 'N' - 79: 47, # 'O' - 80: 46, # 'P' - 81: 72, # 'Q' - 82: 43, # 'R' - 83: 33, # 'S' - 84: 37, # 'T' - 85: 57, # 'U' - 86: 48, # 'V' - 87: 64, # 'W' - 88: 68, # 'X' - 89: 55, # 'Y' - 90: 52, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 2, # 'a' - 98: 18, # 'b' - 99: 26, # 'c' - 100: 17, # 'd' - 101: 1, # 'e' - 102: 27, # 'f' - 103: 12, # 'g' - 104: 20, # 'h' - 105: 9, # 'i' - 106: 22, # 'j' - 107: 7, # 'k' - 108: 6, # 'l' - 109: 13, # 'm' - 110: 4, # 'n' - 111: 8, # 'o' - 112: 23, # 'p' - 113: 67, # 'q' - 114: 10, # 'r' - 115: 5, # 's' - 116: 3, # 't' - 117: 21, # 'u' - 118: 19, # 'v' - 119: 65, # 'w' - 120: 62, # 'x' - 121: 16, # 'y' - 122: 11, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 161, # '€' - 129: 162, # None - 130: 163, # '‚' - 131: 164, # None - 132: 165, # '„' - 133: 166, # '…' - 134: 167, # '†' - 135: 168, # '‡' - 136: 169, # None - 137: 170, # '‰' - 138: 171, # 'Š' - 139: 172, # '‹' - 140: 173, # 'Ś' - 141: 174, # 'Ť' - 142: 175, # 'Ž' - 143: 176, # 'Ź' - 144: 177, # None - 145: 178, # '‘' - 146: 179, # '’' - 147: 180, # '“' - 148: 78, # '”' - 149: 181, # '•' - 150: 69, # '–' - 151: 182, # '—' - 152: 183, # None - 153: 184, # '™' - 154: 185, # 'š' - 155: 186, # '›' - 156: 187, # 'ś' - 157: 188, # 'ť' - 158: 189, # 'ž' - 159: 190, # 'ź' - 160: 191, # '\xa0' - 161: 192, # 'ˇ' - 162: 193, # '˘' - 163: 194, # 'Ł' - 164: 195, # '¤' - 165: 196, # 'Ą' - 166: 197, # '¦' - 167: 76, # '§' - 168: 198, # '¨' - 169: 199, # '©' - 170: 200, # 'Ş' - 171: 201, # '«' - 172: 202, # '¬' - 173: 203, # '\xad' - 174: 204, # '®' - 175: 205, # 'Ż' - 176: 81, # '°' - 177: 206, # '±' - 178: 207, # '˛' - 179: 208, # 'ł' - 180: 209, # '´' - 181: 210, # 'µ' - 182: 211, # '¶' - 183: 212, # '·' - 184: 213, # '¸' - 185: 214, # 'ą' - 186: 215, # 'ş' - 187: 216, # '»' - 188: 217, # 'Ľ' - 189: 218, # '˝' - 190: 219, # 'ľ' - 191: 220, # 'ż' - 192: 221, # 'Ŕ' - 193: 51, # 'Á' - 194: 83, # 'Â' - 195: 222, # 'Ă' - 196: 80, # 'Ä' - 197: 223, # 'Ĺ' - 198: 224, # 'Ć' - 199: 225, # 'Ç' - 200: 226, # 'Č' - 201: 44, # 'É' - 202: 227, # 'Ę' - 203: 228, # 'Ë' - 204: 229, # 'Ě' - 205: 61, # 'Í' - 206: 230, # 'Î' - 207: 231, # 'Ď' - 208: 232, # 'Đ' - 209: 233, # 'Ń' - 210: 234, # 'Ň' - 211: 58, # 'Ó' - 212: 235, # 'Ô' - 213: 66, # 'Ő' - 214: 59, # 'Ö' - 215: 236, # '×' - 216: 237, # 'Ř' - 217: 238, # 'Ů' - 218: 60, # 'Ú' - 219: 70, # 'Ű' - 220: 63, # 'Ü' - 221: 239, # 'Ý' - 222: 240, # 'Ţ' - 223: 241, # 'ß' - 224: 84, # 'ŕ' - 225: 14, # 'á' - 226: 75, # 'â' - 227: 242, # 'ă' - 228: 71, # 'ä' - 229: 82, # 'ĺ' - 230: 243, # 'ć' - 231: 73, # 'ç' - 232: 244, # 'č' - 233: 15, # 'é' - 234: 85, # 'ę' - 235: 79, # 'ë' - 236: 86, # 'ě' - 237: 30, # 'í' - 238: 77, # 'î' - 239: 87, # 'ď' - 240: 245, # 'đ' - 241: 246, # 'ń' - 242: 247, # 'ň' - 243: 25, # 'ó' - 244: 74, # 'ô' - 245: 42, # 'ő' - 246: 24, # 'ö' - 247: 248, # '÷' - 248: 249, # 'ř' - 249: 250, # 'ů' - 250: 31, # 'ú' - 251: 56, # 'ű' - 252: 29, # 'ü' - 253: 251, # 'ý' - 254: 252, # 'ţ' - 255: 253, # '˙' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 28, # 'A' + 66: 40, # 'B' + 67: 54, # 'C' + 68: 45, # 'D' + 69: 32, # 'E' + 70: 50, # 'F' + 71: 49, # 'G' + 72: 38, # 'H' + 73: 39, # 'I' + 74: 53, # 'J' + 75: 36, # 'K' + 76: 41, # 'L' + 77: 34, # 'M' + 78: 35, # 'N' + 79: 47, # 'O' + 80: 46, # 'P' + 81: 72, # 'Q' + 82: 43, # 'R' + 83: 33, # 'S' + 84: 37, # 'T' + 85: 57, # 'U' + 86: 48, # 'V' + 87: 64, # 'W' + 88: 68, # 'X' + 89: 55, # 'Y' + 90: 52, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 2, # 'a' + 98: 18, # 'b' + 99: 26, # 'c' + 100: 17, # 'd' + 101: 1, # 'e' + 102: 27, # 'f' + 103: 12, # 'g' + 104: 20, # 'h' + 105: 9, # 'i' + 106: 22, # 'j' + 107: 7, # 'k' + 108: 6, # 'l' + 109: 13, # 'm' + 110: 4, # 'n' + 111: 8, # 'o' + 112: 23, # 'p' + 113: 67, # 'q' + 114: 10, # 'r' + 115: 5, # 's' + 116: 3, # 't' + 117: 21, # 'u' + 118: 19, # 'v' + 119: 65, # 'w' + 120: 62, # 'x' + 121: 16, # 'y' + 122: 11, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 161, # '€' + 129: 162, # None + 130: 163, # '‚' + 131: 164, # None + 132: 165, # '„' + 133: 166, # '…' + 134: 167, # '†' + 135: 168, # '‡' + 136: 169, # None + 137: 170, # '‰' + 138: 171, # 'Š' + 139: 172, # '‹' + 140: 173, # 'Ś' + 141: 174, # 'Ť' + 142: 175, # 'Ž' + 143: 176, # 'Ź' + 144: 177, # None + 145: 178, # '‘' + 146: 179, # '’' + 147: 180, # '“' + 148: 78, # '”' + 149: 181, # '•' + 150: 69, # '–' + 151: 182, # '—' + 152: 183, # None + 153: 184, # '™' + 154: 185, # 'š' + 155: 186, # '›' + 156: 187, # 'ś' + 157: 188, # 'ť' + 158: 189, # 'ž' + 159: 190, # 'ź' + 160: 191, # '\xa0' + 161: 192, # 'ˇ' + 162: 193, # '˘' + 163: 194, # 'Ł' + 164: 195, # '¤' + 165: 196, # 'Ą' + 166: 197, # '¦' + 167: 76, # '§' + 168: 198, # '¨' + 169: 199, # '©' + 170: 200, # 'Ş' + 171: 201, # '«' + 172: 202, # '¬' + 173: 203, # '\xad' + 174: 204, # '®' + 175: 205, # 'Ż' + 176: 81, # '°' + 177: 206, # '±' + 178: 207, # '˛' + 179: 208, # 'ł' + 180: 209, # '´' + 181: 210, # 'µ' + 182: 211, # '¶' + 183: 212, # '·' + 184: 213, # '¸' + 185: 214, # 'ą' + 186: 215, # 'ş' + 187: 216, # '»' + 188: 217, # 'Ľ' + 189: 218, # '˝' + 190: 219, # 'ľ' + 191: 220, # 'ż' + 192: 221, # 'Ŕ' + 193: 51, # 'Á' + 194: 83, # 'Â' + 195: 222, # 'Ă' + 196: 80, # 'Ä' + 197: 223, # 'Ĺ' + 198: 224, # 'Ć' + 199: 225, # 'Ç' + 200: 226, # 'Č' + 201: 44, # 'É' + 202: 227, # 'Ę' + 203: 228, # 'Ë' + 204: 229, # 'Ě' + 205: 61, # 'Í' + 206: 230, # 'Î' + 207: 231, # 'Ď' + 208: 232, # 'Đ' + 209: 233, # 'Ń' + 210: 234, # 'Ň' + 211: 58, # 'Ó' + 212: 235, # 'Ô' + 213: 66, # 'Ő' + 214: 59, # 'Ö' + 215: 236, # '×' + 216: 237, # 'Ř' + 217: 238, # 'Ů' + 218: 60, # 'Ú' + 219: 70, # 'Ű' + 220: 63, # 'Ü' + 221: 239, # 'Ý' + 222: 240, # 'Ţ' + 223: 241, # 'ß' + 224: 84, # 'ŕ' + 225: 14, # 'á' + 226: 75, # 'â' + 227: 242, # 'ă' + 228: 71, # 'ä' + 229: 82, # 'ĺ' + 230: 243, # 'ć' + 231: 73, # 'ç' + 232: 244, # 'č' + 233: 15, # 'é' + 234: 85, # 'ę' + 235: 79, # 'ë' + 236: 86, # 'ě' + 237: 30, # 'í' + 238: 77, # 'î' + 239: 87, # 'ď' + 240: 245, # 'đ' + 241: 246, # 'ń' + 242: 247, # 'ň' + 243: 25, # 'ó' + 244: 74, # 'ô' + 245: 42, # 'ő' + 246: 24, # 'ö' + 247: 248, # '÷' + 248: 249, # 'ř' + 249: 250, # 'ů' + 250: 31, # 'ú' + 251: 56, # 'ű' + 252: 29, # 'ü' + 253: 251, # 'ý' + 254: 252, # 'ţ' + 255: 253, # '˙' } -WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1250', - language='Hungarian', - char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER, - language_model=HUNGARIAN_LANG_MODEL, - typical_positive_ratio=0.947368, - keep_ascii_letters=True, - alphabet='ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű') +WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel( + charset_name="windows-1250", + language="Hungarian", + char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER, + language_model=HUNGARIAN_LANG_MODEL, + typical_positive_ratio=0.947368, + keep_ascii_letters=True, + alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű", +) ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 28, # 'A' - 66: 40, # 'B' - 67: 54, # 'C' - 68: 45, # 'D' - 69: 32, # 'E' - 70: 50, # 'F' - 71: 49, # 'G' - 72: 38, # 'H' - 73: 39, # 'I' - 74: 53, # 'J' - 75: 36, # 'K' - 76: 41, # 'L' - 77: 34, # 'M' - 78: 35, # 'N' - 79: 47, # 'O' - 80: 46, # 'P' - 81: 71, # 'Q' - 82: 43, # 'R' - 83: 33, # 'S' - 84: 37, # 'T' - 85: 57, # 'U' - 86: 48, # 'V' - 87: 64, # 'W' - 88: 68, # 'X' - 89: 55, # 'Y' - 90: 52, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 2, # 'a' - 98: 18, # 'b' - 99: 26, # 'c' - 100: 17, # 'd' - 101: 1, # 'e' - 102: 27, # 'f' - 103: 12, # 'g' - 104: 20, # 'h' - 105: 9, # 'i' - 106: 22, # 'j' - 107: 7, # 'k' - 108: 6, # 'l' - 109: 13, # 'm' - 110: 4, # 'n' - 111: 8, # 'o' - 112: 23, # 'p' - 113: 67, # 'q' - 114: 10, # 'r' - 115: 5, # 's' - 116: 3, # 't' - 117: 21, # 'u' - 118: 19, # 'v' - 119: 65, # 'w' - 120: 62, # 'x' - 121: 16, # 'y' - 122: 11, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 159, # '\x80' - 129: 160, # '\x81' - 130: 161, # '\x82' - 131: 162, # '\x83' - 132: 163, # '\x84' - 133: 164, # '\x85' - 134: 165, # '\x86' - 135: 166, # '\x87' - 136: 167, # '\x88' - 137: 168, # '\x89' - 138: 169, # '\x8a' - 139: 170, # '\x8b' - 140: 171, # '\x8c' - 141: 172, # '\x8d' - 142: 173, # '\x8e' - 143: 174, # '\x8f' - 144: 175, # '\x90' - 145: 176, # '\x91' - 146: 177, # '\x92' - 147: 178, # '\x93' - 148: 179, # '\x94' - 149: 180, # '\x95' - 150: 181, # '\x96' - 151: 182, # '\x97' - 152: 183, # '\x98' - 153: 184, # '\x99' - 154: 185, # '\x9a' - 155: 186, # '\x9b' - 156: 187, # '\x9c' - 157: 188, # '\x9d' - 158: 189, # '\x9e' - 159: 190, # '\x9f' - 160: 191, # '\xa0' - 161: 192, # 'Ą' - 162: 193, # '˘' - 163: 194, # 'Ł' - 164: 195, # '¤' - 165: 196, # 'Ľ' - 166: 197, # 'Ś' - 167: 75, # '§' - 168: 198, # '¨' - 169: 199, # 'Š' - 170: 200, # 'Ş' - 171: 201, # 'Ť' - 172: 202, # 'Ź' - 173: 203, # '\xad' - 174: 204, # 'Ž' - 175: 205, # 'Ż' - 176: 79, # '°' - 177: 206, # 'ą' - 178: 207, # '˛' - 179: 208, # 'ł' - 180: 209, # '´' - 181: 210, # 'ľ' - 182: 211, # 'ś' - 183: 212, # 'ˇ' - 184: 213, # '¸' - 185: 214, # 'š' - 186: 215, # 'ş' - 187: 216, # 'ť' - 188: 217, # 'ź' - 189: 218, # '˝' - 190: 219, # 'ž' - 191: 220, # 'ż' - 192: 221, # 'Ŕ' - 193: 51, # 'Á' - 194: 81, # 'Â' - 195: 222, # 'Ă' - 196: 78, # 'Ä' - 197: 223, # 'Ĺ' - 198: 224, # 'Ć' - 199: 225, # 'Ç' - 200: 226, # 'Č' - 201: 44, # 'É' - 202: 227, # 'Ę' - 203: 228, # 'Ë' - 204: 229, # 'Ě' - 205: 61, # 'Í' - 206: 230, # 'Î' - 207: 231, # 'Ď' - 208: 232, # 'Đ' - 209: 233, # 'Ń' - 210: 234, # 'Ň' - 211: 58, # 'Ó' - 212: 235, # 'Ô' - 213: 66, # 'Ő' - 214: 59, # 'Ö' - 215: 236, # '×' - 216: 237, # 'Ř' - 217: 238, # 'Ů' - 218: 60, # 'Ú' - 219: 69, # 'Ű' - 220: 63, # 'Ü' - 221: 239, # 'Ý' - 222: 240, # 'Ţ' - 223: 241, # 'ß' - 224: 82, # 'ŕ' - 225: 14, # 'á' - 226: 74, # 'â' - 227: 242, # 'ă' - 228: 70, # 'ä' - 229: 80, # 'ĺ' - 230: 243, # 'ć' - 231: 72, # 'ç' - 232: 244, # 'č' - 233: 15, # 'é' - 234: 83, # 'ę' - 235: 77, # 'ë' - 236: 84, # 'ě' - 237: 30, # 'í' - 238: 76, # 'î' - 239: 85, # 'ď' - 240: 245, # 'đ' - 241: 246, # 'ń' - 242: 247, # 'ň' - 243: 25, # 'ó' - 244: 73, # 'ô' - 245: 42, # 'ő' - 246: 24, # 'ö' - 247: 248, # '÷' - 248: 249, # 'ř' - 249: 250, # 'ů' - 250: 31, # 'ú' - 251: 56, # 'ű' - 252: 29, # 'ü' - 253: 251, # 'ý' - 254: 252, # 'ţ' - 255: 253, # '˙' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 28, # 'A' + 66: 40, # 'B' + 67: 54, # 'C' + 68: 45, # 'D' + 69: 32, # 'E' + 70: 50, # 'F' + 71: 49, # 'G' + 72: 38, # 'H' + 73: 39, # 'I' + 74: 53, # 'J' + 75: 36, # 'K' + 76: 41, # 'L' + 77: 34, # 'M' + 78: 35, # 'N' + 79: 47, # 'O' + 80: 46, # 'P' + 81: 71, # 'Q' + 82: 43, # 'R' + 83: 33, # 'S' + 84: 37, # 'T' + 85: 57, # 'U' + 86: 48, # 'V' + 87: 64, # 'W' + 88: 68, # 'X' + 89: 55, # 'Y' + 90: 52, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 2, # 'a' + 98: 18, # 'b' + 99: 26, # 'c' + 100: 17, # 'd' + 101: 1, # 'e' + 102: 27, # 'f' + 103: 12, # 'g' + 104: 20, # 'h' + 105: 9, # 'i' + 106: 22, # 'j' + 107: 7, # 'k' + 108: 6, # 'l' + 109: 13, # 'm' + 110: 4, # 'n' + 111: 8, # 'o' + 112: 23, # 'p' + 113: 67, # 'q' + 114: 10, # 'r' + 115: 5, # 's' + 116: 3, # 't' + 117: 21, # 'u' + 118: 19, # 'v' + 119: 65, # 'w' + 120: 62, # 'x' + 121: 16, # 'y' + 122: 11, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 159, # '\x80' + 129: 160, # '\x81' + 130: 161, # '\x82' + 131: 162, # '\x83' + 132: 163, # '\x84' + 133: 164, # '\x85' + 134: 165, # '\x86' + 135: 166, # '\x87' + 136: 167, # '\x88' + 137: 168, # '\x89' + 138: 169, # '\x8a' + 139: 170, # '\x8b' + 140: 171, # '\x8c' + 141: 172, # '\x8d' + 142: 173, # '\x8e' + 143: 174, # '\x8f' + 144: 175, # '\x90' + 145: 176, # '\x91' + 146: 177, # '\x92' + 147: 178, # '\x93' + 148: 179, # '\x94' + 149: 180, # '\x95' + 150: 181, # '\x96' + 151: 182, # '\x97' + 152: 183, # '\x98' + 153: 184, # '\x99' + 154: 185, # '\x9a' + 155: 186, # '\x9b' + 156: 187, # '\x9c' + 157: 188, # '\x9d' + 158: 189, # '\x9e' + 159: 190, # '\x9f' + 160: 191, # '\xa0' + 161: 192, # 'Ą' + 162: 193, # '˘' + 163: 194, # 'Ł' + 164: 195, # '¤' + 165: 196, # 'Ľ' + 166: 197, # 'Ś' + 167: 75, # '§' + 168: 198, # '¨' + 169: 199, # 'Š' + 170: 200, # 'Ş' + 171: 201, # 'Ť' + 172: 202, # 'Ź' + 173: 203, # '\xad' + 174: 204, # 'Ž' + 175: 205, # 'Ż' + 176: 79, # '°' + 177: 206, # 'ą' + 178: 207, # '˛' + 179: 208, # 'ł' + 180: 209, # '´' + 181: 210, # 'ľ' + 182: 211, # 'ś' + 183: 212, # 'ˇ' + 184: 213, # '¸' + 185: 214, # 'š' + 186: 215, # 'ş' + 187: 216, # 'ť' + 188: 217, # 'ź' + 189: 218, # '˝' + 190: 219, # 'ž' + 191: 220, # 'ż' + 192: 221, # 'Ŕ' + 193: 51, # 'Á' + 194: 81, # 'Â' + 195: 222, # 'Ă' + 196: 78, # 'Ä' + 197: 223, # 'Ĺ' + 198: 224, # 'Ć' + 199: 225, # 'Ç' + 200: 226, # 'Č' + 201: 44, # 'É' + 202: 227, # 'Ę' + 203: 228, # 'Ë' + 204: 229, # 'Ě' + 205: 61, # 'Í' + 206: 230, # 'Î' + 207: 231, # 'Ď' + 208: 232, # 'Đ' + 209: 233, # 'Ń' + 210: 234, # 'Ň' + 211: 58, # 'Ó' + 212: 235, # 'Ô' + 213: 66, # 'Ő' + 214: 59, # 'Ö' + 215: 236, # '×' + 216: 237, # 'Ř' + 217: 238, # 'Ů' + 218: 60, # 'Ú' + 219: 69, # 'Ű' + 220: 63, # 'Ü' + 221: 239, # 'Ý' + 222: 240, # 'Ţ' + 223: 241, # 'ß' + 224: 82, # 'ŕ' + 225: 14, # 'á' + 226: 74, # 'â' + 227: 242, # 'ă' + 228: 70, # 'ä' + 229: 80, # 'ĺ' + 230: 243, # 'ć' + 231: 72, # 'ç' + 232: 244, # 'č' + 233: 15, # 'é' + 234: 83, # 'ę' + 235: 77, # 'ë' + 236: 84, # 'ě' + 237: 30, # 'í' + 238: 76, # 'î' + 239: 85, # 'ď' + 240: 245, # 'đ' + 241: 246, # 'ń' + 242: 247, # 'ň' + 243: 25, # 'ó' + 244: 73, # 'ô' + 245: 42, # 'ő' + 246: 24, # 'ö' + 247: 248, # '÷' + 248: 249, # 'ř' + 249: 250, # 'ů' + 250: 31, # 'ú' + 251: 56, # 'ű' + 252: 29, # 'ü' + 253: 251, # 'ý' + 254: 252, # 'ţ' + 255: 253, # '˙' } -ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-2', - language='Hungarian', - char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER, - language_model=HUNGARIAN_LANG_MODEL, - typical_positive_ratio=0.947368, - keep_ascii_letters=True, - alphabet='ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű') - +ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-2", + language="Hungarian", + char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER, + language_model=HUNGARIAN_LANG_MODEL, + typical_positive_ratio=0.947368, + keep_ascii_letters=True, + alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű", +) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py index 5594452..39a5388 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py @@ -1,9 +1,5 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - # 3: Positive # 2: Likely # 1: Unlikely @@ -4115,1604 +4111,1615 @@ RUSSIAN_LANG_MODEL = { # Character Mapping Table(s): IBM866_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 37, # 'А' - 129: 44, # 'Б' - 130: 33, # 'В' - 131: 46, # 'Г' - 132: 41, # 'Д' - 133: 48, # 'Е' - 134: 56, # 'Ж' - 135: 51, # 'З' - 136: 42, # 'И' - 137: 60, # 'Й' - 138: 36, # 'К' - 139: 49, # 'Л' - 140: 38, # 'М' - 141: 31, # 'Н' - 142: 34, # 'О' - 143: 35, # 'П' - 144: 45, # 'Р' - 145: 32, # 'С' - 146: 40, # 'Т' - 147: 52, # 'У' - 148: 53, # 'Ф' - 149: 55, # 'Х' - 150: 58, # 'Ц' - 151: 50, # 'Ч' - 152: 57, # 'Ш' - 153: 63, # 'Щ' - 154: 70, # 'Ъ' - 155: 62, # 'Ы' - 156: 61, # 'Ь' - 157: 47, # 'Э' - 158: 59, # 'Ю' - 159: 43, # 'Я' - 160: 3, # 'а' - 161: 21, # 'б' - 162: 10, # 'в' - 163: 19, # 'г' - 164: 13, # 'д' - 165: 2, # 'е' - 166: 24, # 'ж' - 167: 20, # 'з' - 168: 4, # 'и' - 169: 23, # 'й' - 170: 11, # 'к' - 171: 8, # 'л' - 172: 12, # 'м' - 173: 5, # 'н' - 174: 1, # 'о' - 175: 15, # 'п' - 176: 191, # '░' - 177: 192, # '▒' - 178: 193, # '▓' - 179: 194, # '│' - 180: 195, # '┤' - 181: 196, # '╡' - 182: 197, # '╢' - 183: 198, # '╖' - 184: 199, # '╕' - 185: 200, # '╣' - 186: 201, # '║' - 187: 202, # '╗' - 188: 203, # '╝' - 189: 204, # '╜' - 190: 205, # '╛' - 191: 206, # '┐' - 192: 207, # '└' - 193: 208, # '┴' - 194: 209, # '┬' - 195: 210, # '├' - 196: 211, # '─' - 197: 212, # '┼' - 198: 213, # '╞' - 199: 214, # '╟' - 200: 215, # '╚' - 201: 216, # '╔' - 202: 217, # '╩' - 203: 218, # '╦' - 204: 219, # '╠' - 205: 220, # '═' - 206: 221, # '╬' - 207: 222, # '╧' - 208: 223, # '╨' - 209: 224, # '╤' - 210: 225, # '╥' - 211: 226, # '╙' - 212: 227, # '╘' - 213: 228, # '╒' - 214: 229, # '╓' - 215: 230, # '╫' - 216: 231, # '╪' - 217: 232, # '┘' - 218: 233, # '┌' - 219: 234, # '█' - 220: 235, # '▄' - 221: 236, # '▌' - 222: 237, # '▐' - 223: 238, # '▀' - 224: 9, # 'р' - 225: 7, # 'с' - 226: 6, # 'т' - 227: 14, # 'у' - 228: 39, # 'ф' - 229: 26, # 'х' - 230: 28, # 'ц' - 231: 22, # 'ч' - 232: 25, # 'ш' - 233: 29, # 'щ' - 234: 54, # 'ъ' - 235: 18, # 'ы' - 236: 17, # 'ь' - 237: 30, # 'э' - 238: 27, # 'ю' - 239: 16, # 'я' - 240: 239, # 'Ё' - 241: 68, # 'ё' - 242: 240, # 'Є' - 243: 241, # 'є' - 244: 242, # 'Ї' - 245: 243, # 'ї' - 246: 244, # 'Ў' - 247: 245, # 'ў' - 248: 246, # '°' - 249: 247, # '∙' - 250: 248, # '·' - 251: 249, # '√' - 252: 250, # '№' - 253: 251, # '¤' - 254: 252, # '■' - 255: 255, # '\xa0' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 37, # 'А' + 129: 44, # 'Б' + 130: 33, # 'В' + 131: 46, # 'Г' + 132: 41, # 'Д' + 133: 48, # 'Е' + 134: 56, # 'Ж' + 135: 51, # 'З' + 136: 42, # 'И' + 137: 60, # 'Й' + 138: 36, # 'К' + 139: 49, # 'Л' + 140: 38, # 'М' + 141: 31, # 'Н' + 142: 34, # 'О' + 143: 35, # 'П' + 144: 45, # 'Р' + 145: 32, # 'С' + 146: 40, # 'Т' + 147: 52, # 'У' + 148: 53, # 'Ф' + 149: 55, # 'Х' + 150: 58, # 'Ц' + 151: 50, # 'Ч' + 152: 57, # 'Ш' + 153: 63, # 'Щ' + 154: 70, # 'Ъ' + 155: 62, # 'Ы' + 156: 61, # 'Ь' + 157: 47, # 'Э' + 158: 59, # 'Ю' + 159: 43, # 'Я' + 160: 3, # 'а' + 161: 21, # 'б' + 162: 10, # 'в' + 163: 19, # 'г' + 164: 13, # 'д' + 165: 2, # 'е' + 166: 24, # 'ж' + 167: 20, # 'з' + 168: 4, # 'и' + 169: 23, # 'й' + 170: 11, # 'к' + 171: 8, # 'л' + 172: 12, # 'м' + 173: 5, # 'н' + 174: 1, # 'о' + 175: 15, # 'п' + 176: 191, # '░' + 177: 192, # '▒' + 178: 193, # '▓' + 179: 194, # '│' + 180: 195, # '┤' + 181: 196, # '╡' + 182: 197, # '╢' + 183: 198, # '╖' + 184: 199, # '╕' + 185: 200, # '╣' + 186: 201, # '║' + 187: 202, # '╗' + 188: 203, # '╝' + 189: 204, # '╜' + 190: 205, # '╛' + 191: 206, # '┐' + 192: 207, # '└' + 193: 208, # '┴' + 194: 209, # '┬' + 195: 210, # '├' + 196: 211, # '─' + 197: 212, # '┼' + 198: 213, # '╞' + 199: 214, # '╟' + 200: 215, # '╚' + 201: 216, # '╔' + 202: 217, # '╩' + 203: 218, # '╦' + 204: 219, # '╠' + 205: 220, # '═' + 206: 221, # '╬' + 207: 222, # '╧' + 208: 223, # '╨' + 209: 224, # '╤' + 210: 225, # '╥' + 211: 226, # '╙' + 212: 227, # '╘' + 213: 228, # '╒' + 214: 229, # '╓' + 215: 230, # '╫' + 216: 231, # '╪' + 217: 232, # '┘' + 218: 233, # '┌' + 219: 234, # '█' + 220: 235, # '▄' + 221: 236, # '▌' + 222: 237, # '▐' + 223: 238, # '▀' + 224: 9, # 'р' + 225: 7, # 'с' + 226: 6, # 'т' + 227: 14, # 'у' + 228: 39, # 'ф' + 229: 26, # 'х' + 230: 28, # 'ц' + 231: 22, # 'ч' + 232: 25, # 'ш' + 233: 29, # 'щ' + 234: 54, # 'ъ' + 235: 18, # 'ы' + 236: 17, # 'ь' + 237: 30, # 'э' + 238: 27, # 'ю' + 239: 16, # 'я' + 240: 239, # 'Ё' + 241: 68, # 'ё' + 242: 240, # 'Є' + 243: 241, # 'є' + 244: 242, # 'Ї' + 245: 243, # 'ї' + 246: 244, # 'Ў' + 247: 245, # 'ў' + 248: 246, # '°' + 249: 247, # '∙' + 250: 248, # '·' + 251: 249, # '√' + 252: 250, # '№' + 253: 251, # '¤' + 254: 252, # '■' + 255: 255, # '\xa0' } -IBM866_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='IBM866', - language='Russian', - char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet='ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё') +IBM866_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="IBM866", + language="Russian", + char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # 'Ђ' - 129: 192, # 'Ѓ' - 130: 193, # '‚' - 131: 194, # 'ѓ' - 132: 195, # '„' - 133: 196, # '…' - 134: 197, # '†' - 135: 198, # '‡' - 136: 199, # '€' - 137: 200, # '‰' - 138: 201, # 'Љ' - 139: 202, # '‹' - 140: 203, # 'Њ' - 141: 204, # 'Ќ' - 142: 205, # 'Ћ' - 143: 206, # 'Џ' - 144: 207, # 'ђ' - 145: 208, # '‘' - 146: 209, # '’' - 147: 210, # '“' - 148: 211, # '”' - 149: 212, # '•' - 150: 213, # '–' - 151: 214, # '—' - 152: 215, # None - 153: 216, # '™' - 154: 217, # 'љ' - 155: 218, # '›' - 156: 219, # 'њ' - 157: 220, # 'ќ' - 158: 221, # 'ћ' - 159: 222, # 'џ' - 160: 223, # '\xa0' - 161: 224, # 'Ў' - 162: 225, # 'ў' - 163: 226, # 'Ј' - 164: 227, # '¤' - 165: 228, # 'Ґ' - 166: 229, # '¦' - 167: 230, # '§' - 168: 231, # 'Ё' - 169: 232, # '©' - 170: 233, # 'Є' - 171: 234, # '«' - 172: 235, # '¬' - 173: 236, # '\xad' - 174: 237, # '®' - 175: 238, # 'Ї' - 176: 239, # '°' - 177: 240, # '±' - 178: 241, # 'І' - 179: 242, # 'і' - 180: 243, # 'ґ' - 181: 244, # 'µ' - 182: 245, # '¶' - 183: 246, # '·' - 184: 68, # 'ё' - 185: 247, # '№' - 186: 248, # 'є' - 187: 249, # '»' - 188: 250, # 'ј' - 189: 251, # 'Ѕ' - 190: 252, # 'ѕ' - 191: 253, # 'ї' - 192: 37, # 'А' - 193: 44, # 'Б' - 194: 33, # 'В' - 195: 46, # 'Г' - 196: 41, # 'Д' - 197: 48, # 'Е' - 198: 56, # 'Ж' - 199: 51, # 'З' - 200: 42, # 'И' - 201: 60, # 'Й' - 202: 36, # 'К' - 203: 49, # 'Л' - 204: 38, # 'М' - 205: 31, # 'Н' - 206: 34, # 'О' - 207: 35, # 'П' - 208: 45, # 'Р' - 209: 32, # 'С' - 210: 40, # 'Т' - 211: 52, # 'У' - 212: 53, # 'Ф' - 213: 55, # 'Х' - 214: 58, # 'Ц' - 215: 50, # 'Ч' - 216: 57, # 'Ш' - 217: 63, # 'Щ' - 218: 70, # 'Ъ' - 219: 62, # 'Ы' - 220: 61, # 'Ь' - 221: 47, # 'Э' - 222: 59, # 'Ю' - 223: 43, # 'Я' - 224: 3, # 'а' - 225: 21, # 'б' - 226: 10, # 'в' - 227: 19, # 'г' - 228: 13, # 'д' - 229: 2, # 'е' - 230: 24, # 'ж' - 231: 20, # 'з' - 232: 4, # 'и' - 233: 23, # 'й' - 234: 11, # 'к' - 235: 8, # 'л' - 236: 12, # 'м' - 237: 5, # 'н' - 238: 1, # 'о' - 239: 15, # 'п' - 240: 9, # 'р' - 241: 7, # 'с' - 242: 6, # 'т' - 243: 14, # 'у' - 244: 39, # 'ф' - 245: 26, # 'х' - 246: 28, # 'ц' - 247: 22, # 'ч' - 248: 25, # 'ш' - 249: 29, # 'щ' - 250: 54, # 'ъ' - 251: 18, # 'ы' - 252: 17, # 'ь' - 253: 30, # 'э' - 254: 27, # 'ю' - 255: 16, # 'я' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # 'Ђ' + 129: 192, # 'Ѓ' + 130: 193, # '‚' + 131: 194, # 'ѓ' + 132: 195, # '„' + 133: 196, # '…' + 134: 197, # '†' + 135: 198, # '‡' + 136: 199, # '€' + 137: 200, # '‰' + 138: 201, # 'Љ' + 139: 202, # '‹' + 140: 203, # 'Њ' + 141: 204, # 'Ќ' + 142: 205, # 'Ћ' + 143: 206, # 'Џ' + 144: 207, # 'ђ' + 145: 208, # '‘' + 146: 209, # '’' + 147: 210, # '“' + 148: 211, # '”' + 149: 212, # '•' + 150: 213, # '–' + 151: 214, # '—' + 152: 215, # None + 153: 216, # '™' + 154: 217, # 'љ' + 155: 218, # '›' + 156: 219, # 'њ' + 157: 220, # 'ќ' + 158: 221, # 'ћ' + 159: 222, # 'џ' + 160: 223, # '\xa0' + 161: 224, # 'Ў' + 162: 225, # 'ў' + 163: 226, # 'Ј' + 164: 227, # '¤' + 165: 228, # 'Ґ' + 166: 229, # '¦' + 167: 230, # '§' + 168: 231, # 'Ё' + 169: 232, # '©' + 170: 233, # 'Є' + 171: 234, # '«' + 172: 235, # '¬' + 173: 236, # '\xad' + 174: 237, # '®' + 175: 238, # 'Ї' + 176: 239, # '°' + 177: 240, # '±' + 178: 241, # 'І' + 179: 242, # 'і' + 180: 243, # 'ґ' + 181: 244, # 'µ' + 182: 245, # '¶' + 183: 246, # '·' + 184: 68, # 'ё' + 185: 247, # '№' + 186: 248, # 'є' + 187: 249, # '»' + 188: 250, # 'ј' + 189: 251, # 'Ѕ' + 190: 252, # 'ѕ' + 191: 253, # 'ї' + 192: 37, # 'А' + 193: 44, # 'Б' + 194: 33, # 'В' + 195: 46, # 'Г' + 196: 41, # 'Д' + 197: 48, # 'Е' + 198: 56, # 'Ж' + 199: 51, # 'З' + 200: 42, # 'И' + 201: 60, # 'Й' + 202: 36, # 'К' + 203: 49, # 'Л' + 204: 38, # 'М' + 205: 31, # 'Н' + 206: 34, # 'О' + 207: 35, # 'П' + 208: 45, # 'Р' + 209: 32, # 'С' + 210: 40, # 'Т' + 211: 52, # 'У' + 212: 53, # 'Ф' + 213: 55, # 'Х' + 214: 58, # 'Ц' + 215: 50, # 'Ч' + 216: 57, # 'Ш' + 217: 63, # 'Щ' + 218: 70, # 'Ъ' + 219: 62, # 'Ы' + 220: 61, # 'Ь' + 221: 47, # 'Э' + 222: 59, # 'Ю' + 223: 43, # 'Я' + 224: 3, # 'а' + 225: 21, # 'б' + 226: 10, # 'в' + 227: 19, # 'г' + 228: 13, # 'д' + 229: 2, # 'е' + 230: 24, # 'ж' + 231: 20, # 'з' + 232: 4, # 'и' + 233: 23, # 'й' + 234: 11, # 'к' + 235: 8, # 'л' + 236: 12, # 'м' + 237: 5, # 'н' + 238: 1, # 'о' + 239: 15, # 'п' + 240: 9, # 'р' + 241: 7, # 'с' + 242: 6, # 'т' + 243: 14, # 'у' + 244: 39, # 'ф' + 245: 26, # 'х' + 246: 28, # 'ц' + 247: 22, # 'ч' + 248: 25, # 'ш' + 249: 29, # 'щ' + 250: 54, # 'ъ' + 251: 18, # 'ы' + 252: 17, # 'ь' + 253: 30, # 'э' + 254: 27, # 'ю' + 255: 16, # 'я' } -WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1251', - language='Russian', - char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet='ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё') +WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="windows-1251", + language="Russian", + char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) IBM855_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # 'ђ' - 129: 192, # 'Ђ' - 130: 193, # 'ѓ' - 131: 194, # 'Ѓ' - 132: 68, # 'ё' - 133: 195, # 'Ё' - 134: 196, # 'є' - 135: 197, # 'Є' - 136: 198, # 'ѕ' - 137: 199, # 'Ѕ' - 138: 200, # 'і' - 139: 201, # 'І' - 140: 202, # 'ї' - 141: 203, # 'Ї' - 142: 204, # 'ј' - 143: 205, # 'Ј' - 144: 206, # 'љ' - 145: 207, # 'Љ' - 146: 208, # 'њ' - 147: 209, # 'Њ' - 148: 210, # 'ћ' - 149: 211, # 'Ћ' - 150: 212, # 'ќ' - 151: 213, # 'Ќ' - 152: 214, # 'ў' - 153: 215, # 'Ў' - 154: 216, # 'џ' - 155: 217, # 'Џ' - 156: 27, # 'ю' - 157: 59, # 'Ю' - 158: 54, # 'ъ' - 159: 70, # 'Ъ' - 160: 3, # 'а' - 161: 37, # 'А' - 162: 21, # 'б' - 163: 44, # 'Б' - 164: 28, # 'ц' - 165: 58, # 'Ц' - 166: 13, # 'д' - 167: 41, # 'Д' - 168: 2, # 'е' - 169: 48, # 'Е' - 170: 39, # 'ф' - 171: 53, # 'Ф' - 172: 19, # 'г' - 173: 46, # 'Г' - 174: 218, # '«' - 175: 219, # '»' - 176: 220, # '░' - 177: 221, # '▒' - 178: 222, # '▓' - 179: 223, # '│' - 180: 224, # '┤' - 181: 26, # 'х' - 182: 55, # 'Х' - 183: 4, # 'и' - 184: 42, # 'И' - 185: 225, # '╣' - 186: 226, # '║' - 187: 227, # '╗' - 188: 228, # '╝' - 189: 23, # 'й' - 190: 60, # 'Й' - 191: 229, # '┐' - 192: 230, # '└' - 193: 231, # '┴' - 194: 232, # '┬' - 195: 233, # '├' - 196: 234, # '─' - 197: 235, # '┼' - 198: 11, # 'к' - 199: 36, # 'К' - 200: 236, # '╚' - 201: 237, # '╔' - 202: 238, # '╩' - 203: 239, # '╦' - 204: 240, # '╠' - 205: 241, # '═' - 206: 242, # '╬' - 207: 243, # '¤' - 208: 8, # 'л' - 209: 49, # 'Л' - 210: 12, # 'м' - 211: 38, # 'М' - 212: 5, # 'н' - 213: 31, # 'Н' - 214: 1, # 'о' - 215: 34, # 'О' - 216: 15, # 'п' - 217: 244, # '┘' - 218: 245, # '┌' - 219: 246, # '█' - 220: 247, # '▄' - 221: 35, # 'П' - 222: 16, # 'я' - 223: 248, # '▀' - 224: 43, # 'Я' - 225: 9, # 'р' - 226: 45, # 'Р' - 227: 7, # 'с' - 228: 32, # 'С' - 229: 6, # 'т' - 230: 40, # 'Т' - 231: 14, # 'у' - 232: 52, # 'У' - 233: 24, # 'ж' - 234: 56, # 'Ж' - 235: 10, # 'в' - 236: 33, # 'В' - 237: 17, # 'ь' - 238: 61, # 'Ь' - 239: 249, # '№' - 240: 250, # '\xad' - 241: 18, # 'ы' - 242: 62, # 'Ы' - 243: 20, # 'з' - 244: 51, # 'З' - 245: 25, # 'ш' - 246: 57, # 'Ш' - 247: 30, # 'э' - 248: 47, # 'Э' - 249: 29, # 'щ' - 250: 63, # 'Щ' - 251: 22, # 'ч' - 252: 50, # 'Ч' - 253: 251, # '§' - 254: 252, # '■' - 255: 255, # '\xa0' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # 'ђ' + 129: 192, # 'Ђ' + 130: 193, # 'ѓ' + 131: 194, # 'Ѓ' + 132: 68, # 'ё' + 133: 195, # 'Ё' + 134: 196, # 'є' + 135: 197, # 'Є' + 136: 198, # 'ѕ' + 137: 199, # 'Ѕ' + 138: 200, # 'і' + 139: 201, # 'І' + 140: 202, # 'ї' + 141: 203, # 'Ї' + 142: 204, # 'ј' + 143: 205, # 'Ј' + 144: 206, # 'љ' + 145: 207, # 'Љ' + 146: 208, # 'њ' + 147: 209, # 'Њ' + 148: 210, # 'ћ' + 149: 211, # 'Ћ' + 150: 212, # 'ќ' + 151: 213, # 'Ќ' + 152: 214, # 'ў' + 153: 215, # 'Ў' + 154: 216, # 'џ' + 155: 217, # 'Џ' + 156: 27, # 'ю' + 157: 59, # 'Ю' + 158: 54, # 'ъ' + 159: 70, # 'Ъ' + 160: 3, # 'а' + 161: 37, # 'А' + 162: 21, # 'б' + 163: 44, # 'Б' + 164: 28, # 'ц' + 165: 58, # 'Ц' + 166: 13, # 'д' + 167: 41, # 'Д' + 168: 2, # 'е' + 169: 48, # 'Е' + 170: 39, # 'ф' + 171: 53, # 'Ф' + 172: 19, # 'г' + 173: 46, # 'Г' + 174: 218, # '«' + 175: 219, # '»' + 176: 220, # '░' + 177: 221, # '▒' + 178: 222, # '▓' + 179: 223, # '│' + 180: 224, # '┤' + 181: 26, # 'х' + 182: 55, # 'Х' + 183: 4, # 'и' + 184: 42, # 'И' + 185: 225, # '╣' + 186: 226, # '║' + 187: 227, # '╗' + 188: 228, # '╝' + 189: 23, # 'й' + 190: 60, # 'Й' + 191: 229, # '┐' + 192: 230, # '└' + 193: 231, # '┴' + 194: 232, # '┬' + 195: 233, # '├' + 196: 234, # '─' + 197: 235, # '┼' + 198: 11, # 'к' + 199: 36, # 'К' + 200: 236, # '╚' + 201: 237, # '╔' + 202: 238, # '╩' + 203: 239, # '╦' + 204: 240, # '╠' + 205: 241, # '═' + 206: 242, # '╬' + 207: 243, # '¤' + 208: 8, # 'л' + 209: 49, # 'Л' + 210: 12, # 'м' + 211: 38, # 'М' + 212: 5, # 'н' + 213: 31, # 'Н' + 214: 1, # 'о' + 215: 34, # 'О' + 216: 15, # 'п' + 217: 244, # '┘' + 218: 245, # '┌' + 219: 246, # '█' + 220: 247, # '▄' + 221: 35, # 'П' + 222: 16, # 'я' + 223: 248, # '▀' + 224: 43, # 'Я' + 225: 9, # 'р' + 226: 45, # 'Р' + 227: 7, # 'с' + 228: 32, # 'С' + 229: 6, # 'т' + 230: 40, # 'Т' + 231: 14, # 'у' + 232: 52, # 'У' + 233: 24, # 'ж' + 234: 56, # 'Ж' + 235: 10, # 'в' + 236: 33, # 'В' + 237: 17, # 'ь' + 238: 61, # 'Ь' + 239: 249, # '№' + 240: 250, # '\xad' + 241: 18, # 'ы' + 242: 62, # 'Ы' + 243: 20, # 'з' + 244: 51, # 'З' + 245: 25, # 'ш' + 246: 57, # 'Ш' + 247: 30, # 'э' + 248: 47, # 'Э' + 249: 29, # 'щ' + 250: 63, # 'Щ' + 251: 22, # 'ч' + 252: 50, # 'Ч' + 253: 251, # '§' + 254: 252, # '■' + 255: 255, # '\xa0' } -IBM855_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='IBM855', - language='Russian', - char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet='ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё') +IBM855_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="IBM855", + language="Russian", + char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) KOI8_R_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # '─' - 129: 192, # '│' - 130: 193, # '┌' - 131: 194, # '┐' - 132: 195, # '└' - 133: 196, # '┘' - 134: 197, # '├' - 135: 198, # '┤' - 136: 199, # '┬' - 137: 200, # '┴' - 138: 201, # '┼' - 139: 202, # '▀' - 140: 203, # '▄' - 141: 204, # '█' - 142: 205, # '▌' - 143: 206, # '▐' - 144: 207, # '░' - 145: 208, # '▒' - 146: 209, # '▓' - 147: 210, # '⌠' - 148: 211, # '■' - 149: 212, # '∙' - 150: 213, # '√' - 151: 214, # '≈' - 152: 215, # '≤' - 153: 216, # '≥' - 154: 217, # '\xa0' - 155: 218, # '⌡' - 156: 219, # '°' - 157: 220, # '²' - 158: 221, # '·' - 159: 222, # '÷' - 160: 223, # '═' - 161: 224, # '║' - 162: 225, # '╒' - 163: 68, # 'ё' - 164: 226, # '╓' - 165: 227, # '╔' - 166: 228, # '╕' - 167: 229, # '╖' - 168: 230, # '╗' - 169: 231, # '╘' - 170: 232, # '╙' - 171: 233, # '╚' - 172: 234, # '╛' - 173: 235, # '╜' - 174: 236, # '╝' - 175: 237, # '╞' - 176: 238, # '╟' - 177: 239, # '╠' - 178: 240, # '╡' - 179: 241, # 'Ё' - 180: 242, # '╢' - 181: 243, # '╣' - 182: 244, # '╤' - 183: 245, # '╥' - 184: 246, # '╦' - 185: 247, # '╧' - 186: 248, # '╨' - 187: 249, # '╩' - 188: 250, # '╪' - 189: 251, # '╫' - 190: 252, # '╬' - 191: 253, # '©' - 192: 27, # 'ю' - 193: 3, # 'а' - 194: 21, # 'б' - 195: 28, # 'ц' - 196: 13, # 'д' - 197: 2, # 'е' - 198: 39, # 'ф' - 199: 19, # 'г' - 200: 26, # 'х' - 201: 4, # 'и' - 202: 23, # 'й' - 203: 11, # 'к' - 204: 8, # 'л' - 205: 12, # 'м' - 206: 5, # 'н' - 207: 1, # 'о' - 208: 15, # 'п' - 209: 16, # 'я' - 210: 9, # 'р' - 211: 7, # 'с' - 212: 6, # 'т' - 213: 14, # 'у' - 214: 24, # 'ж' - 215: 10, # 'в' - 216: 17, # 'ь' - 217: 18, # 'ы' - 218: 20, # 'з' - 219: 25, # 'ш' - 220: 30, # 'э' - 221: 29, # 'щ' - 222: 22, # 'ч' - 223: 54, # 'ъ' - 224: 59, # 'Ю' - 225: 37, # 'А' - 226: 44, # 'Б' - 227: 58, # 'Ц' - 228: 41, # 'Д' - 229: 48, # 'Е' - 230: 53, # 'Ф' - 231: 46, # 'Г' - 232: 55, # 'Х' - 233: 42, # 'И' - 234: 60, # 'Й' - 235: 36, # 'К' - 236: 49, # 'Л' - 237: 38, # 'М' - 238: 31, # 'Н' - 239: 34, # 'О' - 240: 35, # 'П' - 241: 43, # 'Я' - 242: 45, # 'Р' - 243: 32, # 'С' - 244: 40, # 'Т' - 245: 52, # 'У' - 246: 56, # 'Ж' - 247: 33, # 'В' - 248: 61, # 'Ь' - 249: 62, # 'Ы' - 250: 51, # 'З' - 251: 57, # 'Ш' - 252: 47, # 'Э' - 253: 63, # 'Щ' - 254: 50, # 'Ч' - 255: 70, # 'Ъ' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # '─' + 129: 192, # '│' + 130: 193, # '┌' + 131: 194, # '┐' + 132: 195, # '└' + 133: 196, # '┘' + 134: 197, # '├' + 135: 198, # '┤' + 136: 199, # '┬' + 137: 200, # '┴' + 138: 201, # '┼' + 139: 202, # '▀' + 140: 203, # '▄' + 141: 204, # '█' + 142: 205, # '▌' + 143: 206, # '▐' + 144: 207, # '░' + 145: 208, # '▒' + 146: 209, # '▓' + 147: 210, # '⌠' + 148: 211, # '■' + 149: 212, # '∙' + 150: 213, # '√' + 151: 214, # '≈' + 152: 215, # '≤' + 153: 216, # '≥' + 154: 217, # '\xa0' + 155: 218, # '⌡' + 156: 219, # '°' + 157: 220, # '²' + 158: 221, # '·' + 159: 222, # '÷' + 160: 223, # '═' + 161: 224, # '║' + 162: 225, # '╒' + 163: 68, # 'ё' + 164: 226, # '╓' + 165: 227, # '╔' + 166: 228, # '╕' + 167: 229, # '╖' + 168: 230, # '╗' + 169: 231, # '╘' + 170: 232, # '╙' + 171: 233, # '╚' + 172: 234, # '╛' + 173: 235, # '╜' + 174: 236, # '╝' + 175: 237, # '╞' + 176: 238, # '╟' + 177: 239, # '╠' + 178: 240, # '╡' + 179: 241, # 'Ё' + 180: 242, # '╢' + 181: 243, # '╣' + 182: 244, # '╤' + 183: 245, # '╥' + 184: 246, # '╦' + 185: 247, # '╧' + 186: 248, # '╨' + 187: 249, # '╩' + 188: 250, # '╪' + 189: 251, # '╫' + 190: 252, # '╬' + 191: 253, # '©' + 192: 27, # 'ю' + 193: 3, # 'а' + 194: 21, # 'б' + 195: 28, # 'ц' + 196: 13, # 'д' + 197: 2, # 'е' + 198: 39, # 'ф' + 199: 19, # 'г' + 200: 26, # 'х' + 201: 4, # 'и' + 202: 23, # 'й' + 203: 11, # 'к' + 204: 8, # 'л' + 205: 12, # 'м' + 206: 5, # 'н' + 207: 1, # 'о' + 208: 15, # 'п' + 209: 16, # 'я' + 210: 9, # 'р' + 211: 7, # 'с' + 212: 6, # 'т' + 213: 14, # 'у' + 214: 24, # 'ж' + 215: 10, # 'в' + 216: 17, # 'ь' + 217: 18, # 'ы' + 218: 20, # 'з' + 219: 25, # 'ш' + 220: 30, # 'э' + 221: 29, # 'щ' + 222: 22, # 'ч' + 223: 54, # 'ъ' + 224: 59, # 'Ю' + 225: 37, # 'А' + 226: 44, # 'Б' + 227: 58, # 'Ц' + 228: 41, # 'Д' + 229: 48, # 'Е' + 230: 53, # 'Ф' + 231: 46, # 'Г' + 232: 55, # 'Х' + 233: 42, # 'И' + 234: 60, # 'Й' + 235: 36, # 'К' + 236: 49, # 'Л' + 237: 38, # 'М' + 238: 31, # 'Н' + 239: 34, # 'О' + 240: 35, # 'П' + 241: 43, # 'Я' + 242: 45, # 'Р' + 243: 32, # 'С' + 244: 40, # 'Т' + 245: 52, # 'У' + 246: 56, # 'Ж' + 247: 33, # 'В' + 248: 61, # 'Ь' + 249: 62, # 'Ы' + 250: 51, # 'З' + 251: 57, # 'Ш' + 252: 47, # 'Э' + 253: 63, # 'Щ' + 254: 50, # 'Ч' + 255: 70, # 'Ъ' } -KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='KOI8-R', - language='Russian', - char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet='ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё') +KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="KOI8-R", + language="Russian", + char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 37, # 'А' - 129: 44, # 'Б' - 130: 33, # 'В' - 131: 46, # 'Г' - 132: 41, # 'Д' - 133: 48, # 'Е' - 134: 56, # 'Ж' - 135: 51, # 'З' - 136: 42, # 'И' - 137: 60, # 'Й' - 138: 36, # 'К' - 139: 49, # 'Л' - 140: 38, # 'М' - 141: 31, # 'Н' - 142: 34, # 'О' - 143: 35, # 'П' - 144: 45, # 'Р' - 145: 32, # 'С' - 146: 40, # 'Т' - 147: 52, # 'У' - 148: 53, # 'Ф' - 149: 55, # 'Х' - 150: 58, # 'Ц' - 151: 50, # 'Ч' - 152: 57, # 'Ш' - 153: 63, # 'Щ' - 154: 70, # 'Ъ' - 155: 62, # 'Ы' - 156: 61, # 'Ь' - 157: 47, # 'Э' - 158: 59, # 'Ю' - 159: 43, # 'Я' - 160: 191, # '†' - 161: 192, # '°' - 162: 193, # 'Ґ' - 163: 194, # '£' - 164: 195, # '§' - 165: 196, # '•' - 166: 197, # '¶' - 167: 198, # 'І' - 168: 199, # '®' - 169: 200, # '©' - 170: 201, # '™' - 171: 202, # 'Ђ' - 172: 203, # 'ђ' - 173: 204, # '≠' - 174: 205, # 'Ѓ' - 175: 206, # 'ѓ' - 176: 207, # '∞' - 177: 208, # '±' - 178: 209, # '≤' - 179: 210, # '≥' - 180: 211, # 'і' - 181: 212, # 'µ' - 182: 213, # 'ґ' - 183: 214, # 'Ј' - 184: 215, # 'Є' - 185: 216, # 'є' - 186: 217, # 'Ї' - 187: 218, # 'ї' - 188: 219, # 'Љ' - 189: 220, # 'љ' - 190: 221, # 'Њ' - 191: 222, # 'њ' - 192: 223, # 'ј' - 193: 224, # 'Ѕ' - 194: 225, # '¬' - 195: 226, # '√' - 196: 227, # 'ƒ' - 197: 228, # '≈' - 198: 229, # '∆' - 199: 230, # '«' - 200: 231, # '»' - 201: 232, # '…' - 202: 233, # '\xa0' - 203: 234, # 'Ћ' - 204: 235, # 'ћ' - 205: 236, # 'Ќ' - 206: 237, # 'ќ' - 207: 238, # 'ѕ' - 208: 239, # '–' - 209: 240, # '—' - 210: 241, # '“' - 211: 242, # '”' - 212: 243, # '‘' - 213: 244, # '’' - 214: 245, # '÷' - 215: 246, # '„' - 216: 247, # 'Ў' - 217: 248, # 'ў' - 218: 249, # 'Џ' - 219: 250, # 'џ' - 220: 251, # '№' - 221: 252, # 'Ё' - 222: 68, # 'ё' - 223: 16, # 'я' - 224: 3, # 'а' - 225: 21, # 'б' - 226: 10, # 'в' - 227: 19, # 'г' - 228: 13, # 'д' - 229: 2, # 'е' - 230: 24, # 'ж' - 231: 20, # 'з' - 232: 4, # 'и' - 233: 23, # 'й' - 234: 11, # 'к' - 235: 8, # 'л' - 236: 12, # 'м' - 237: 5, # 'н' - 238: 1, # 'о' - 239: 15, # 'п' - 240: 9, # 'р' - 241: 7, # 'с' - 242: 6, # 'т' - 243: 14, # 'у' - 244: 39, # 'ф' - 245: 26, # 'х' - 246: 28, # 'ц' - 247: 22, # 'ч' - 248: 25, # 'ш' - 249: 29, # 'щ' - 250: 54, # 'ъ' - 251: 18, # 'ы' - 252: 17, # 'ь' - 253: 30, # 'э' - 254: 27, # 'ю' - 255: 255, # '€' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 37, # 'А' + 129: 44, # 'Б' + 130: 33, # 'В' + 131: 46, # 'Г' + 132: 41, # 'Д' + 133: 48, # 'Е' + 134: 56, # 'Ж' + 135: 51, # 'З' + 136: 42, # 'И' + 137: 60, # 'Й' + 138: 36, # 'К' + 139: 49, # 'Л' + 140: 38, # 'М' + 141: 31, # 'Н' + 142: 34, # 'О' + 143: 35, # 'П' + 144: 45, # 'Р' + 145: 32, # 'С' + 146: 40, # 'Т' + 147: 52, # 'У' + 148: 53, # 'Ф' + 149: 55, # 'Х' + 150: 58, # 'Ц' + 151: 50, # 'Ч' + 152: 57, # 'Ш' + 153: 63, # 'Щ' + 154: 70, # 'Ъ' + 155: 62, # 'Ы' + 156: 61, # 'Ь' + 157: 47, # 'Э' + 158: 59, # 'Ю' + 159: 43, # 'Я' + 160: 191, # '†' + 161: 192, # '°' + 162: 193, # 'Ґ' + 163: 194, # '£' + 164: 195, # '§' + 165: 196, # '•' + 166: 197, # '¶' + 167: 198, # 'І' + 168: 199, # '®' + 169: 200, # '©' + 170: 201, # '™' + 171: 202, # 'Ђ' + 172: 203, # 'ђ' + 173: 204, # '≠' + 174: 205, # 'Ѓ' + 175: 206, # 'ѓ' + 176: 207, # '∞' + 177: 208, # '±' + 178: 209, # '≤' + 179: 210, # '≥' + 180: 211, # 'і' + 181: 212, # 'µ' + 182: 213, # 'ґ' + 183: 214, # 'Ј' + 184: 215, # 'Є' + 185: 216, # 'є' + 186: 217, # 'Ї' + 187: 218, # 'ї' + 188: 219, # 'Љ' + 189: 220, # 'љ' + 190: 221, # 'Њ' + 191: 222, # 'њ' + 192: 223, # 'ј' + 193: 224, # 'Ѕ' + 194: 225, # '¬' + 195: 226, # '√' + 196: 227, # 'ƒ' + 197: 228, # '≈' + 198: 229, # '∆' + 199: 230, # '«' + 200: 231, # '»' + 201: 232, # '…' + 202: 233, # '\xa0' + 203: 234, # 'Ћ' + 204: 235, # 'ћ' + 205: 236, # 'Ќ' + 206: 237, # 'ќ' + 207: 238, # 'ѕ' + 208: 239, # '–' + 209: 240, # '—' + 210: 241, # '“' + 211: 242, # '”' + 212: 243, # '‘' + 213: 244, # '’' + 214: 245, # '÷' + 215: 246, # '„' + 216: 247, # 'Ў' + 217: 248, # 'ў' + 218: 249, # 'Џ' + 219: 250, # 'џ' + 220: 251, # '№' + 221: 252, # 'Ё' + 222: 68, # 'ё' + 223: 16, # 'я' + 224: 3, # 'а' + 225: 21, # 'б' + 226: 10, # 'в' + 227: 19, # 'г' + 228: 13, # 'д' + 229: 2, # 'е' + 230: 24, # 'ж' + 231: 20, # 'з' + 232: 4, # 'и' + 233: 23, # 'й' + 234: 11, # 'к' + 235: 8, # 'л' + 236: 12, # 'м' + 237: 5, # 'н' + 238: 1, # 'о' + 239: 15, # 'п' + 240: 9, # 'р' + 241: 7, # 'с' + 242: 6, # 'т' + 243: 14, # 'у' + 244: 39, # 'ф' + 245: 26, # 'х' + 246: 28, # 'ц' + 247: 22, # 'ч' + 248: 25, # 'ш' + 249: 29, # 'щ' + 250: 54, # 'ъ' + 251: 18, # 'ы' + 252: 17, # 'ь' + 253: 30, # 'э' + 254: 27, # 'ю' + 255: 255, # '€' } -MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='MacCyrillic', - language='Russian', - char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet='ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё') +MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="MacCyrillic", + language="Russian", + char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) ISO_8859_5_RUSSIAN_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 142, # 'A' - 66: 143, # 'B' - 67: 144, # 'C' - 68: 145, # 'D' - 69: 146, # 'E' - 70: 147, # 'F' - 71: 148, # 'G' - 72: 149, # 'H' - 73: 150, # 'I' - 74: 151, # 'J' - 75: 152, # 'K' - 76: 74, # 'L' - 77: 153, # 'M' - 78: 75, # 'N' - 79: 154, # 'O' - 80: 155, # 'P' - 81: 156, # 'Q' - 82: 157, # 'R' - 83: 158, # 'S' - 84: 159, # 'T' - 85: 160, # 'U' - 86: 161, # 'V' - 87: 162, # 'W' - 88: 163, # 'X' - 89: 164, # 'Y' - 90: 165, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 71, # 'a' - 98: 172, # 'b' - 99: 66, # 'c' - 100: 173, # 'd' - 101: 65, # 'e' - 102: 174, # 'f' - 103: 76, # 'g' - 104: 175, # 'h' - 105: 64, # 'i' - 106: 176, # 'j' - 107: 177, # 'k' - 108: 77, # 'l' - 109: 72, # 'm' - 110: 178, # 'n' - 111: 69, # 'o' - 112: 67, # 'p' - 113: 179, # 'q' - 114: 78, # 'r' - 115: 73, # 's' - 116: 180, # 't' - 117: 181, # 'u' - 118: 79, # 'v' - 119: 182, # 'w' - 120: 183, # 'x' - 121: 184, # 'y' - 122: 185, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 191, # '\x80' - 129: 192, # '\x81' - 130: 193, # '\x82' - 131: 194, # '\x83' - 132: 195, # '\x84' - 133: 196, # '\x85' - 134: 197, # '\x86' - 135: 198, # '\x87' - 136: 199, # '\x88' - 137: 200, # '\x89' - 138: 201, # '\x8a' - 139: 202, # '\x8b' - 140: 203, # '\x8c' - 141: 204, # '\x8d' - 142: 205, # '\x8e' - 143: 206, # '\x8f' - 144: 207, # '\x90' - 145: 208, # '\x91' - 146: 209, # '\x92' - 147: 210, # '\x93' - 148: 211, # '\x94' - 149: 212, # '\x95' - 150: 213, # '\x96' - 151: 214, # '\x97' - 152: 215, # '\x98' - 153: 216, # '\x99' - 154: 217, # '\x9a' - 155: 218, # '\x9b' - 156: 219, # '\x9c' - 157: 220, # '\x9d' - 158: 221, # '\x9e' - 159: 222, # '\x9f' - 160: 223, # '\xa0' - 161: 224, # 'Ё' - 162: 225, # 'Ђ' - 163: 226, # 'Ѓ' - 164: 227, # 'Є' - 165: 228, # 'Ѕ' - 166: 229, # 'І' - 167: 230, # 'Ї' - 168: 231, # 'Ј' - 169: 232, # 'Љ' - 170: 233, # 'Њ' - 171: 234, # 'Ћ' - 172: 235, # 'Ќ' - 173: 236, # '\xad' - 174: 237, # 'Ў' - 175: 238, # 'Џ' - 176: 37, # 'А' - 177: 44, # 'Б' - 178: 33, # 'В' - 179: 46, # 'Г' - 180: 41, # 'Д' - 181: 48, # 'Е' - 182: 56, # 'Ж' - 183: 51, # 'З' - 184: 42, # 'И' - 185: 60, # 'Й' - 186: 36, # 'К' - 187: 49, # 'Л' - 188: 38, # 'М' - 189: 31, # 'Н' - 190: 34, # 'О' - 191: 35, # 'П' - 192: 45, # 'Р' - 193: 32, # 'С' - 194: 40, # 'Т' - 195: 52, # 'У' - 196: 53, # 'Ф' - 197: 55, # 'Х' - 198: 58, # 'Ц' - 199: 50, # 'Ч' - 200: 57, # 'Ш' - 201: 63, # 'Щ' - 202: 70, # 'Ъ' - 203: 62, # 'Ы' - 204: 61, # 'Ь' - 205: 47, # 'Э' - 206: 59, # 'Ю' - 207: 43, # 'Я' - 208: 3, # 'а' - 209: 21, # 'б' - 210: 10, # 'в' - 211: 19, # 'г' - 212: 13, # 'д' - 213: 2, # 'е' - 214: 24, # 'ж' - 215: 20, # 'з' - 216: 4, # 'и' - 217: 23, # 'й' - 218: 11, # 'к' - 219: 8, # 'л' - 220: 12, # 'м' - 221: 5, # 'н' - 222: 1, # 'о' - 223: 15, # 'п' - 224: 9, # 'р' - 225: 7, # 'с' - 226: 6, # 'т' - 227: 14, # 'у' - 228: 39, # 'ф' - 229: 26, # 'х' - 230: 28, # 'ц' - 231: 22, # 'ч' - 232: 25, # 'ш' - 233: 29, # 'щ' - 234: 54, # 'ъ' - 235: 18, # 'ы' - 236: 17, # 'ь' - 237: 30, # 'э' - 238: 27, # 'ю' - 239: 16, # 'я' - 240: 239, # '№' - 241: 68, # 'ё' - 242: 240, # 'ђ' - 243: 241, # 'ѓ' - 244: 242, # 'є' - 245: 243, # 'ѕ' - 246: 244, # 'і' - 247: 245, # 'ї' - 248: 246, # 'ј' - 249: 247, # 'љ' - 250: 248, # 'њ' - 251: 249, # 'ћ' - 252: 250, # 'ќ' - 253: 251, # '§' - 254: 252, # 'ў' - 255: 255, # 'џ' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # '\x80' + 129: 192, # '\x81' + 130: 193, # '\x82' + 131: 194, # '\x83' + 132: 195, # '\x84' + 133: 196, # '\x85' + 134: 197, # '\x86' + 135: 198, # '\x87' + 136: 199, # '\x88' + 137: 200, # '\x89' + 138: 201, # '\x8a' + 139: 202, # '\x8b' + 140: 203, # '\x8c' + 141: 204, # '\x8d' + 142: 205, # '\x8e' + 143: 206, # '\x8f' + 144: 207, # '\x90' + 145: 208, # '\x91' + 146: 209, # '\x92' + 147: 210, # '\x93' + 148: 211, # '\x94' + 149: 212, # '\x95' + 150: 213, # '\x96' + 151: 214, # '\x97' + 152: 215, # '\x98' + 153: 216, # '\x99' + 154: 217, # '\x9a' + 155: 218, # '\x9b' + 156: 219, # '\x9c' + 157: 220, # '\x9d' + 158: 221, # '\x9e' + 159: 222, # '\x9f' + 160: 223, # '\xa0' + 161: 224, # 'Ё' + 162: 225, # 'Ђ' + 163: 226, # 'Ѓ' + 164: 227, # 'Є' + 165: 228, # 'Ѕ' + 166: 229, # 'І' + 167: 230, # 'Ї' + 168: 231, # 'Ј' + 169: 232, # 'Љ' + 170: 233, # 'Њ' + 171: 234, # 'Ћ' + 172: 235, # 'Ќ' + 173: 236, # '\xad' + 174: 237, # 'Ў' + 175: 238, # 'Џ' + 176: 37, # 'А' + 177: 44, # 'Б' + 178: 33, # 'В' + 179: 46, # 'Г' + 180: 41, # 'Д' + 181: 48, # 'Е' + 182: 56, # 'Ж' + 183: 51, # 'З' + 184: 42, # 'И' + 185: 60, # 'Й' + 186: 36, # 'К' + 187: 49, # 'Л' + 188: 38, # 'М' + 189: 31, # 'Н' + 190: 34, # 'О' + 191: 35, # 'П' + 192: 45, # 'Р' + 193: 32, # 'С' + 194: 40, # 'Т' + 195: 52, # 'У' + 196: 53, # 'Ф' + 197: 55, # 'Х' + 198: 58, # 'Ц' + 199: 50, # 'Ч' + 200: 57, # 'Ш' + 201: 63, # 'Щ' + 202: 70, # 'Ъ' + 203: 62, # 'Ы' + 204: 61, # 'Ь' + 205: 47, # 'Э' + 206: 59, # 'Ю' + 207: 43, # 'Я' + 208: 3, # 'а' + 209: 21, # 'б' + 210: 10, # 'в' + 211: 19, # 'г' + 212: 13, # 'д' + 213: 2, # 'е' + 214: 24, # 'ж' + 215: 20, # 'з' + 216: 4, # 'и' + 217: 23, # 'й' + 218: 11, # 'к' + 219: 8, # 'л' + 220: 12, # 'м' + 221: 5, # 'н' + 222: 1, # 'о' + 223: 15, # 'п' + 224: 9, # 'р' + 225: 7, # 'с' + 226: 6, # 'т' + 227: 14, # 'у' + 228: 39, # 'ф' + 229: 26, # 'х' + 230: 28, # 'ц' + 231: 22, # 'ч' + 232: 25, # 'ш' + 233: 29, # 'щ' + 234: 54, # 'ъ' + 235: 18, # 'ы' + 236: 17, # 'ь' + 237: 30, # 'э' + 238: 27, # 'ю' + 239: 16, # 'я' + 240: 239, # '№' + 241: 68, # 'ё' + 242: 240, # 'ђ' + 243: 241, # 'ѓ' + 244: 242, # 'є' + 245: 243, # 'ѕ' + 246: 244, # 'і' + 247: 245, # 'ї' + 248: 246, # 'ј' + 249: 247, # 'љ' + 250: 248, # 'њ' + 251: 249, # 'ћ' + 252: 250, # 'ќ' + 253: 251, # '§' + 254: 252, # 'ў' + 255: 255, # 'џ' } -ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-5', - language='Russian', - char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER, - language_model=RUSSIAN_LANG_MODEL, - typical_positive_ratio=0.976601, - keep_ascii_letters=False, - alphabet='ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё') - +ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-5", + language="Russian", + char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё", +) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py index 9a37db5..489cad9 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py @@ -1,9 +1,5 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - # 3: Positive # 2: Likely # 1: Unlikely @@ -4115,269 +4111,270 @@ THAI_LANG_MODEL = { # Character Mapping Table(s): TIS_620_THAI_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 254, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 254, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 253, # ' ' - 33: 253, # '!' - 34: 253, # '"' - 35: 253, # '#' - 36: 253, # '$' - 37: 253, # '%' - 38: 253, # '&' - 39: 253, # "'" - 40: 253, # '(' - 41: 253, # ')' - 42: 253, # '*' - 43: 253, # '+' - 44: 253, # ',' - 45: 253, # '-' - 46: 253, # '.' - 47: 253, # '/' - 48: 252, # '0' - 49: 252, # '1' - 50: 252, # '2' - 51: 252, # '3' - 52: 252, # '4' - 53: 252, # '5' - 54: 252, # '6' - 55: 252, # '7' - 56: 252, # '8' - 57: 252, # '9' - 58: 253, # ':' - 59: 253, # ';' - 60: 253, # '<' - 61: 253, # '=' - 62: 253, # '>' - 63: 253, # '?' - 64: 253, # '@' - 65: 182, # 'A' - 66: 106, # 'B' - 67: 107, # 'C' - 68: 100, # 'D' - 69: 183, # 'E' - 70: 184, # 'F' - 71: 185, # 'G' - 72: 101, # 'H' - 73: 94, # 'I' - 74: 186, # 'J' - 75: 187, # 'K' - 76: 108, # 'L' - 77: 109, # 'M' - 78: 110, # 'N' - 79: 111, # 'O' - 80: 188, # 'P' - 81: 189, # 'Q' - 82: 190, # 'R' - 83: 89, # 'S' - 84: 95, # 'T' - 85: 112, # 'U' - 86: 113, # 'V' - 87: 191, # 'W' - 88: 192, # 'X' - 89: 193, # 'Y' - 90: 194, # 'Z' - 91: 253, # '[' - 92: 253, # '\\' - 93: 253, # ']' - 94: 253, # '^' - 95: 253, # '_' - 96: 253, # '`' - 97: 64, # 'a' - 98: 72, # 'b' - 99: 73, # 'c' - 100: 114, # 'd' - 101: 74, # 'e' - 102: 115, # 'f' - 103: 116, # 'g' - 104: 102, # 'h' - 105: 81, # 'i' - 106: 201, # 'j' - 107: 117, # 'k' - 108: 90, # 'l' - 109: 103, # 'm' - 110: 78, # 'n' - 111: 82, # 'o' - 112: 96, # 'p' - 113: 202, # 'q' - 114: 91, # 'r' - 115: 79, # 's' - 116: 84, # 't' - 117: 104, # 'u' - 118: 105, # 'v' - 119: 97, # 'w' - 120: 98, # 'x' - 121: 92, # 'y' - 122: 203, # 'z' - 123: 253, # '{' - 124: 253, # '|' - 125: 253, # '}' - 126: 253, # '~' - 127: 253, # '\x7f' - 128: 209, # '\x80' - 129: 210, # '\x81' - 130: 211, # '\x82' - 131: 212, # '\x83' - 132: 213, # '\x84' - 133: 88, # '\x85' - 134: 214, # '\x86' - 135: 215, # '\x87' - 136: 216, # '\x88' - 137: 217, # '\x89' - 138: 218, # '\x8a' - 139: 219, # '\x8b' - 140: 220, # '\x8c' - 141: 118, # '\x8d' - 142: 221, # '\x8e' - 143: 222, # '\x8f' - 144: 223, # '\x90' - 145: 224, # '\x91' - 146: 99, # '\x92' - 147: 85, # '\x93' - 148: 83, # '\x94' - 149: 225, # '\x95' - 150: 226, # '\x96' - 151: 227, # '\x97' - 152: 228, # '\x98' - 153: 229, # '\x99' - 154: 230, # '\x9a' - 155: 231, # '\x9b' - 156: 232, # '\x9c' - 157: 233, # '\x9d' - 158: 234, # '\x9e' - 159: 235, # '\x9f' - 160: 236, # None - 161: 5, # 'ก' - 162: 30, # 'ข' - 163: 237, # 'ฃ' - 164: 24, # 'ค' - 165: 238, # 'ฅ' - 166: 75, # 'ฆ' - 167: 8, # 'ง' - 168: 26, # 'จ' - 169: 52, # 'ฉ' - 170: 34, # 'ช' - 171: 51, # 'ซ' - 172: 119, # 'ฌ' - 173: 47, # 'ญ' - 174: 58, # 'ฎ' - 175: 57, # 'ฏ' - 176: 49, # 'ฐ' - 177: 53, # 'ฑ' - 178: 55, # 'ฒ' - 179: 43, # 'ณ' - 180: 20, # 'ด' - 181: 19, # 'ต' - 182: 44, # 'ถ' - 183: 14, # 'ท' - 184: 48, # 'ธ' - 185: 3, # 'น' - 186: 17, # 'บ' - 187: 25, # 'ป' - 188: 39, # 'ผ' - 189: 62, # 'ฝ' - 190: 31, # 'พ' - 191: 54, # 'ฟ' - 192: 45, # 'ภ' - 193: 9, # 'ม' - 194: 16, # 'ย' - 195: 2, # 'ร' - 196: 61, # 'ฤ' - 197: 15, # 'ล' - 198: 239, # 'ฦ' - 199: 12, # 'ว' - 200: 42, # 'ศ' - 201: 46, # 'ษ' - 202: 18, # 'ส' - 203: 21, # 'ห' - 204: 76, # 'ฬ' - 205: 4, # 'อ' - 206: 66, # 'ฮ' - 207: 63, # 'ฯ' - 208: 22, # 'ะ' - 209: 10, # 'ั' - 210: 1, # 'า' - 211: 36, # 'ำ' - 212: 23, # 'ิ' - 213: 13, # 'ี' - 214: 40, # 'ึ' - 215: 27, # 'ื' - 216: 32, # 'ุ' - 217: 35, # 'ู' - 218: 86, # 'ฺ' - 219: 240, # None - 220: 241, # None - 221: 242, # None - 222: 243, # None - 223: 244, # '฿' - 224: 11, # 'เ' - 225: 28, # 'แ' - 226: 41, # 'โ' - 227: 29, # 'ใ' - 228: 33, # 'ไ' - 229: 245, # 'ๅ' - 230: 50, # 'ๆ' - 231: 37, # '็' - 232: 6, # '่' - 233: 7, # '้' - 234: 67, # '๊' - 235: 77, # '๋' - 236: 38, # '์' - 237: 93, # 'ํ' - 238: 246, # '๎' - 239: 247, # '๏' - 240: 68, # '๐' - 241: 56, # '๑' - 242: 59, # '๒' - 243: 65, # '๓' - 244: 69, # '๔' - 245: 60, # '๕' - 246: 70, # '๖' - 247: 80, # '๗' - 248: 71, # '๘' - 249: 87, # '๙' - 250: 248, # '๚' - 251: 249, # '๛' - 252: 250, # None - 253: 251, # None - 254: 252, # None - 255: 253, # None + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 182, # 'A' + 66: 106, # 'B' + 67: 107, # 'C' + 68: 100, # 'D' + 69: 183, # 'E' + 70: 184, # 'F' + 71: 185, # 'G' + 72: 101, # 'H' + 73: 94, # 'I' + 74: 186, # 'J' + 75: 187, # 'K' + 76: 108, # 'L' + 77: 109, # 'M' + 78: 110, # 'N' + 79: 111, # 'O' + 80: 188, # 'P' + 81: 189, # 'Q' + 82: 190, # 'R' + 83: 89, # 'S' + 84: 95, # 'T' + 85: 112, # 'U' + 86: 113, # 'V' + 87: 191, # 'W' + 88: 192, # 'X' + 89: 193, # 'Y' + 90: 194, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 64, # 'a' + 98: 72, # 'b' + 99: 73, # 'c' + 100: 114, # 'd' + 101: 74, # 'e' + 102: 115, # 'f' + 103: 116, # 'g' + 104: 102, # 'h' + 105: 81, # 'i' + 106: 201, # 'j' + 107: 117, # 'k' + 108: 90, # 'l' + 109: 103, # 'm' + 110: 78, # 'n' + 111: 82, # 'o' + 112: 96, # 'p' + 113: 202, # 'q' + 114: 91, # 'r' + 115: 79, # 's' + 116: 84, # 't' + 117: 104, # 'u' + 118: 105, # 'v' + 119: 97, # 'w' + 120: 98, # 'x' + 121: 92, # 'y' + 122: 203, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 209, # '\x80' + 129: 210, # '\x81' + 130: 211, # '\x82' + 131: 212, # '\x83' + 132: 213, # '\x84' + 133: 88, # '\x85' + 134: 214, # '\x86' + 135: 215, # '\x87' + 136: 216, # '\x88' + 137: 217, # '\x89' + 138: 218, # '\x8a' + 139: 219, # '\x8b' + 140: 220, # '\x8c' + 141: 118, # '\x8d' + 142: 221, # '\x8e' + 143: 222, # '\x8f' + 144: 223, # '\x90' + 145: 224, # '\x91' + 146: 99, # '\x92' + 147: 85, # '\x93' + 148: 83, # '\x94' + 149: 225, # '\x95' + 150: 226, # '\x96' + 151: 227, # '\x97' + 152: 228, # '\x98' + 153: 229, # '\x99' + 154: 230, # '\x9a' + 155: 231, # '\x9b' + 156: 232, # '\x9c' + 157: 233, # '\x9d' + 158: 234, # '\x9e' + 159: 235, # '\x9f' + 160: 236, # None + 161: 5, # 'ก' + 162: 30, # 'ข' + 163: 237, # 'ฃ' + 164: 24, # 'ค' + 165: 238, # 'ฅ' + 166: 75, # 'ฆ' + 167: 8, # 'ง' + 168: 26, # 'จ' + 169: 52, # 'ฉ' + 170: 34, # 'ช' + 171: 51, # 'ซ' + 172: 119, # 'ฌ' + 173: 47, # 'ญ' + 174: 58, # 'ฎ' + 175: 57, # 'ฏ' + 176: 49, # 'ฐ' + 177: 53, # 'ฑ' + 178: 55, # 'ฒ' + 179: 43, # 'ณ' + 180: 20, # 'ด' + 181: 19, # 'ต' + 182: 44, # 'ถ' + 183: 14, # 'ท' + 184: 48, # 'ธ' + 185: 3, # 'น' + 186: 17, # 'บ' + 187: 25, # 'ป' + 188: 39, # 'ผ' + 189: 62, # 'ฝ' + 190: 31, # 'พ' + 191: 54, # 'ฟ' + 192: 45, # 'ภ' + 193: 9, # 'ม' + 194: 16, # 'ย' + 195: 2, # 'ร' + 196: 61, # 'ฤ' + 197: 15, # 'ล' + 198: 239, # 'ฦ' + 199: 12, # 'ว' + 200: 42, # 'ศ' + 201: 46, # 'ษ' + 202: 18, # 'ส' + 203: 21, # 'ห' + 204: 76, # 'ฬ' + 205: 4, # 'อ' + 206: 66, # 'ฮ' + 207: 63, # 'ฯ' + 208: 22, # 'ะ' + 209: 10, # 'ั' + 210: 1, # 'า' + 211: 36, # 'ำ' + 212: 23, # 'ิ' + 213: 13, # 'ี' + 214: 40, # 'ึ' + 215: 27, # 'ื' + 216: 32, # 'ุ' + 217: 35, # 'ู' + 218: 86, # 'ฺ' + 219: 240, # None + 220: 241, # None + 221: 242, # None + 222: 243, # None + 223: 244, # '฿' + 224: 11, # 'เ' + 225: 28, # 'แ' + 226: 41, # 'โ' + 227: 29, # 'ใ' + 228: 33, # 'ไ' + 229: 245, # 'ๅ' + 230: 50, # 'ๆ' + 231: 37, # '็' + 232: 6, # '่' + 233: 7, # '้' + 234: 67, # '๊' + 235: 77, # '๋' + 236: 38, # '์' + 237: 93, # 'ํ' + 238: 246, # '๎' + 239: 247, # '๏' + 240: 68, # '๐' + 241: 56, # '๑' + 242: 59, # '๒' + 243: 65, # '๓' + 244: 69, # '๔' + 245: 60, # '๕' + 246: 70, # '๖' + 247: 80, # '๗' + 248: 71, # '๘' + 249: 87, # '๙' + 250: 248, # '๚' + 251: 249, # '๛' + 252: 250, # None + 253: 251, # None + 254: 252, # None + 255: 253, # None } -TIS_620_THAI_MODEL = SingleByteCharSetModel(charset_name='TIS-620', - language='Thai', - char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER, - language_model=THAI_LANG_MODEL, - typical_positive_ratio=0.926386, - keep_ascii_letters=False, - alphabet='กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛') - +TIS_620_THAI_MODEL = SingleByteCharSetModel( + charset_name="TIS-620", + language="Thai", + char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER, + language_model=THAI_LANG_MODEL, + typical_positive_ratio=0.926386, + keep_ascii_letters=False, + alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛", +) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py index 43f4230..291857c 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -1,9 +1,5 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - # 3: Positive # 2: Likely # 1: Unlikely @@ -4115,269 +4111,270 @@ TURKISH_LANG_MODEL = { # Character Mapping Table(s): ISO_8859_9_TURKISH_CHAR_TO_ORDER = { - 0: 255, # '\x00' - 1: 255, # '\x01' - 2: 255, # '\x02' - 3: 255, # '\x03' - 4: 255, # '\x04' - 5: 255, # '\x05' - 6: 255, # '\x06' - 7: 255, # '\x07' - 8: 255, # '\x08' - 9: 255, # '\t' - 10: 255, # '\n' - 11: 255, # '\x0b' - 12: 255, # '\x0c' - 13: 255, # '\r' - 14: 255, # '\x0e' - 15: 255, # '\x0f' - 16: 255, # '\x10' - 17: 255, # '\x11' - 18: 255, # '\x12' - 19: 255, # '\x13' - 20: 255, # '\x14' - 21: 255, # '\x15' - 22: 255, # '\x16' - 23: 255, # '\x17' - 24: 255, # '\x18' - 25: 255, # '\x19' - 26: 255, # '\x1a' - 27: 255, # '\x1b' - 28: 255, # '\x1c' - 29: 255, # '\x1d' - 30: 255, # '\x1e' - 31: 255, # '\x1f' - 32: 255, # ' ' - 33: 255, # '!' - 34: 255, # '"' - 35: 255, # '#' - 36: 255, # '$' - 37: 255, # '%' - 38: 255, # '&' - 39: 255, # "'" - 40: 255, # '(' - 41: 255, # ')' - 42: 255, # '*' - 43: 255, # '+' - 44: 255, # ',' - 45: 255, # '-' - 46: 255, # '.' - 47: 255, # '/' - 48: 255, # '0' - 49: 255, # '1' - 50: 255, # '2' - 51: 255, # '3' - 52: 255, # '4' - 53: 255, # '5' - 54: 255, # '6' - 55: 255, # '7' - 56: 255, # '8' - 57: 255, # '9' - 58: 255, # ':' - 59: 255, # ';' - 60: 255, # '<' - 61: 255, # '=' - 62: 255, # '>' - 63: 255, # '?' - 64: 255, # '@' - 65: 23, # 'A' - 66: 37, # 'B' - 67: 47, # 'C' - 68: 39, # 'D' - 69: 29, # 'E' - 70: 52, # 'F' - 71: 36, # 'G' - 72: 45, # 'H' - 73: 53, # 'I' - 74: 60, # 'J' - 75: 16, # 'K' - 76: 49, # 'L' - 77: 20, # 'M' - 78: 46, # 'N' - 79: 42, # 'O' - 80: 48, # 'P' - 81: 69, # 'Q' - 82: 44, # 'R' - 83: 35, # 'S' - 84: 31, # 'T' - 85: 51, # 'U' - 86: 38, # 'V' - 87: 62, # 'W' - 88: 65, # 'X' - 89: 43, # 'Y' - 90: 56, # 'Z' - 91: 255, # '[' - 92: 255, # '\\' - 93: 255, # ']' - 94: 255, # '^' - 95: 255, # '_' - 96: 255, # '`' - 97: 1, # 'a' - 98: 21, # 'b' - 99: 28, # 'c' - 100: 12, # 'd' - 101: 2, # 'e' - 102: 18, # 'f' - 103: 27, # 'g' - 104: 25, # 'h' - 105: 3, # 'i' - 106: 24, # 'j' - 107: 10, # 'k' - 108: 5, # 'l' - 109: 13, # 'm' - 110: 4, # 'n' - 111: 15, # 'o' - 112: 26, # 'p' - 113: 64, # 'q' - 114: 7, # 'r' - 115: 8, # 's' - 116: 9, # 't' - 117: 14, # 'u' - 118: 32, # 'v' - 119: 57, # 'w' - 120: 58, # 'x' - 121: 11, # 'y' - 122: 22, # 'z' - 123: 255, # '{' - 124: 255, # '|' - 125: 255, # '}' - 126: 255, # '~' - 127: 255, # '\x7f' - 128: 180, # '\x80' - 129: 179, # '\x81' - 130: 178, # '\x82' - 131: 177, # '\x83' - 132: 176, # '\x84' - 133: 175, # '\x85' - 134: 174, # '\x86' - 135: 173, # '\x87' - 136: 172, # '\x88' - 137: 171, # '\x89' - 138: 170, # '\x8a' - 139: 169, # '\x8b' - 140: 168, # '\x8c' - 141: 167, # '\x8d' - 142: 166, # '\x8e' - 143: 165, # '\x8f' - 144: 164, # '\x90' - 145: 163, # '\x91' - 146: 162, # '\x92' - 147: 161, # '\x93' - 148: 160, # '\x94' - 149: 159, # '\x95' - 150: 101, # '\x96' - 151: 158, # '\x97' - 152: 157, # '\x98' - 153: 156, # '\x99' - 154: 155, # '\x9a' - 155: 154, # '\x9b' - 156: 153, # '\x9c' - 157: 152, # '\x9d' - 158: 151, # '\x9e' - 159: 106, # '\x9f' - 160: 150, # '\xa0' - 161: 149, # '¡' - 162: 148, # '¢' - 163: 147, # '£' - 164: 146, # '¤' - 165: 145, # '¥' - 166: 144, # '¦' - 167: 100, # '§' - 168: 143, # '¨' - 169: 142, # '©' - 170: 141, # 'ª' - 171: 140, # '«' - 172: 139, # '¬' - 173: 138, # '\xad' - 174: 137, # '®' - 175: 136, # '¯' - 176: 94, # '°' - 177: 80, # '±' - 178: 93, # '²' - 179: 135, # '³' - 180: 105, # '´' - 181: 134, # 'µ' - 182: 133, # '¶' - 183: 63, # '·' - 184: 132, # '¸' - 185: 131, # '¹' - 186: 130, # 'º' - 187: 129, # '»' - 188: 128, # '¼' - 189: 127, # '½' - 190: 126, # '¾' - 191: 125, # '¿' - 192: 124, # 'À' - 193: 104, # 'Á' - 194: 73, # 'Â' - 195: 99, # 'Ã' - 196: 79, # 'Ä' - 197: 85, # 'Å' - 198: 123, # 'Æ' - 199: 54, # 'Ç' - 200: 122, # 'È' - 201: 98, # 'É' - 202: 92, # 'Ê' - 203: 121, # 'Ë' - 204: 120, # 'Ì' - 205: 91, # 'Í' - 206: 103, # 'Î' - 207: 119, # 'Ï' - 208: 68, # 'Ğ' - 209: 118, # 'Ñ' - 210: 117, # 'Ò' - 211: 97, # 'Ó' - 212: 116, # 'Ô' - 213: 115, # 'Õ' - 214: 50, # 'Ö' - 215: 90, # '×' - 216: 114, # 'Ø' - 217: 113, # 'Ù' - 218: 112, # 'Ú' - 219: 111, # 'Û' - 220: 55, # 'Ü' - 221: 41, # 'İ' - 222: 40, # 'Ş' - 223: 86, # 'ß' - 224: 89, # 'à' - 225: 70, # 'á' - 226: 59, # 'â' - 227: 78, # 'ã' - 228: 71, # 'ä' - 229: 82, # 'å' - 230: 88, # 'æ' - 231: 33, # 'ç' - 232: 77, # 'è' - 233: 66, # 'é' - 234: 84, # 'ê' - 235: 83, # 'ë' - 236: 110, # 'ì' - 237: 75, # 'í' - 238: 61, # 'î' - 239: 96, # 'ï' - 240: 30, # 'ğ' - 241: 67, # 'ñ' - 242: 109, # 'ò' - 243: 74, # 'ó' - 244: 87, # 'ô' - 245: 102, # 'õ' - 246: 34, # 'ö' - 247: 95, # '÷' - 248: 81, # 'ø' - 249: 108, # 'ù' - 250: 76, # 'ú' - 251: 72, # 'û' - 252: 17, # 'ü' - 253: 6, # 'ı' - 254: 19, # 'ş' - 255: 107, # 'ÿ' + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 255, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 255, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 255, # ' ' + 33: 255, # '!' + 34: 255, # '"' + 35: 255, # '#' + 36: 255, # '$' + 37: 255, # '%' + 38: 255, # '&' + 39: 255, # "'" + 40: 255, # '(' + 41: 255, # ')' + 42: 255, # '*' + 43: 255, # '+' + 44: 255, # ',' + 45: 255, # '-' + 46: 255, # '.' + 47: 255, # '/' + 48: 255, # '0' + 49: 255, # '1' + 50: 255, # '2' + 51: 255, # '3' + 52: 255, # '4' + 53: 255, # '5' + 54: 255, # '6' + 55: 255, # '7' + 56: 255, # '8' + 57: 255, # '9' + 58: 255, # ':' + 59: 255, # ';' + 60: 255, # '<' + 61: 255, # '=' + 62: 255, # '>' + 63: 255, # '?' + 64: 255, # '@' + 65: 23, # 'A' + 66: 37, # 'B' + 67: 47, # 'C' + 68: 39, # 'D' + 69: 29, # 'E' + 70: 52, # 'F' + 71: 36, # 'G' + 72: 45, # 'H' + 73: 53, # 'I' + 74: 60, # 'J' + 75: 16, # 'K' + 76: 49, # 'L' + 77: 20, # 'M' + 78: 46, # 'N' + 79: 42, # 'O' + 80: 48, # 'P' + 81: 69, # 'Q' + 82: 44, # 'R' + 83: 35, # 'S' + 84: 31, # 'T' + 85: 51, # 'U' + 86: 38, # 'V' + 87: 62, # 'W' + 88: 65, # 'X' + 89: 43, # 'Y' + 90: 56, # 'Z' + 91: 255, # '[' + 92: 255, # '\\' + 93: 255, # ']' + 94: 255, # '^' + 95: 255, # '_' + 96: 255, # '`' + 97: 1, # 'a' + 98: 21, # 'b' + 99: 28, # 'c' + 100: 12, # 'd' + 101: 2, # 'e' + 102: 18, # 'f' + 103: 27, # 'g' + 104: 25, # 'h' + 105: 3, # 'i' + 106: 24, # 'j' + 107: 10, # 'k' + 108: 5, # 'l' + 109: 13, # 'm' + 110: 4, # 'n' + 111: 15, # 'o' + 112: 26, # 'p' + 113: 64, # 'q' + 114: 7, # 'r' + 115: 8, # 's' + 116: 9, # 't' + 117: 14, # 'u' + 118: 32, # 'v' + 119: 57, # 'w' + 120: 58, # 'x' + 121: 11, # 'y' + 122: 22, # 'z' + 123: 255, # '{' + 124: 255, # '|' + 125: 255, # '}' + 126: 255, # '~' + 127: 255, # '\x7f' + 128: 180, # '\x80' + 129: 179, # '\x81' + 130: 178, # '\x82' + 131: 177, # '\x83' + 132: 176, # '\x84' + 133: 175, # '\x85' + 134: 174, # '\x86' + 135: 173, # '\x87' + 136: 172, # '\x88' + 137: 171, # '\x89' + 138: 170, # '\x8a' + 139: 169, # '\x8b' + 140: 168, # '\x8c' + 141: 167, # '\x8d' + 142: 166, # '\x8e' + 143: 165, # '\x8f' + 144: 164, # '\x90' + 145: 163, # '\x91' + 146: 162, # '\x92' + 147: 161, # '\x93' + 148: 160, # '\x94' + 149: 159, # '\x95' + 150: 101, # '\x96' + 151: 158, # '\x97' + 152: 157, # '\x98' + 153: 156, # '\x99' + 154: 155, # '\x9a' + 155: 154, # '\x9b' + 156: 153, # '\x9c' + 157: 152, # '\x9d' + 158: 151, # '\x9e' + 159: 106, # '\x9f' + 160: 150, # '\xa0' + 161: 149, # '¡' + 162: 148, # '¢' + 163: 147, # '£' + 164: 146, # '¤' + 165: 145, # '¥' + 166: 144, # '¦' + 167: 100, # '§' + 168: 143, # '¨' + 169: 142, # '©' + 170: 141, # 'ª' + 171: 140, # '«' + 172: 139, # '¬' + 173: 138, # '\xad' + 174: 137, # '®' + 175: 136, # '¯' + 176: 94, # '°' + 177: 80, # '±' + 178: 93, # '²' + 179: 135, # '³' + 180: 105, # '´' + 181: 134, # 'µ' + 182: 133, # '¶' + 183: 63, # '·' + 184: 132, # '¸' + 185: 131, # '¹' + 186: 130, # 'º' + 187: 129, # '»' + 188: 128, # '¼' + 189: 127, # '½' + 190: 126, # '¾' + 191: 125, # '¿' + 192: 124, # 'À' + 193: 104, # 'Á' + 194: 73, # 'Â' + 195: 99, # 'Ã' + 196: 79, # 'Ä' + 197: 85, # 'Å' + 198: 123, # 'Æ' + 199: 54, # 'Ç' + 200: 122, # 'È' + 201: 98, # 'É' + 202: 92, # 'Ê' + 203: 121, # 'Ë' + 204: 120, # 'Ì' + 205: 91, # 'Í' + 206: 103, # 'Î' + 207: 119, # 'Ï' + 208: 68, # 'Ğ' + 209: 118, # 'Ñ' + 210: 117, # 'Ò' + 211: 97, # 'Ó' + 212: 116, # 'Ô' + 213: 115, # 'Õ' + 214: 50, # 'Ö' + 215: 90, # '×' + 216: 114, # 'Ø' + 217: 113, # 'Ù' + 218: 112, # 'Ú' + 219: 111, # 'Û' + 220: 55, # 'Ü' + 221: 41, # 'İ' + 222: 40, # 'Ş' + 223: 86, # 'ß' + 224: 89, # 'à' + 225: 70, # 'á' + 226: 59, # 'â' + 227: 78, # 'ã' + 228: 71, # 'ä' + 229: 82, # 'å' + 230: 88, # 'æ' + 231: 33, # 'ç' + 232: 77, # 'è' + 233: 66, # 'é' + 234: 84, # 'ê' + 235: 83, # 'ë' + 236: 110, # 'ì' + 237: 75, # 'í' + 238: 61, # 'î' + 239: 96, # 'ï' + 240: 30, # 'ğ' + 241: 67, # 'ñ' + 242: 109, # 'ò' + 243: 74, # 'ó' + 244: 87, # 'ô' + 245: 102, # 'õ' + 246: 34, # 'ö' + 247: 95, # '÷' + 248: 81, # 'ø' + 249: 108, # 'ù' + 250: 76, # 'ú' + 251: 72, # 'û' + 252: 17, # 'ü' + 253: 6, # 'ı' + 254: 19, # 'ş' + 255: 107, # 'ÿ' } -ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-9', - language='Turkish', - char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER, - language_model=TURKISH_LANG_MODEL, - typical_positive_ratio=0.97029, - keep_ascii_letters=True, - alphabet='ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş') - +ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel( + charset_name="ISO-8859-9", + language="Turkish", + char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER, + language_model=TURKISH_LANG_MODEL, + typical_positive_ratio=0.97029, + keep_ascii_letters=True, + alphabet="ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş", +) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/latin1prober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/latin1prober.py index 7d1e8c2..241f14a 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/latin1prober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/latin1prober.py @@ -41,6 +41,7 @@ ASV = 6 # accent small vowel ASO = 7 # accent small other CLASS_NUM = 8 # total classes +# fmt: off Latin1_CharToClass = ( OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F @@ -91,11 +92,12 @@ Latin1ClassModel = ( 0, 3, 1, 3, 1, 1, 1, 3, # ASV 0, 3, 1, 3, 1, 1, 3, 3, # ASO ) +# fmt: on class Latin1Prober(CharSetProber): def __init__(self): - super(Latin1Prober, self).__init__() + super().__init__() self._last_char_class = None self._freq_counter = None self.reset() @@ -103,7 +105,7 @@ class Latin1Prober(CharSetProber): def reset(self): self._last_char_class = OTH self._freq_counter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) + super().reset() @property def charset_name(self): @@ -114,11 +116,10 @@ class Latin1Prober(CharSetProber): return "" def feed(self, byte_str): - byte_str = self.filter_with_english_letters(byte_str) + byte_str = self.remove_xml_tags(byte_str) for c in byte_str: char_class = Latin1_CharToClass[c] - freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) - + char_class] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + char_class] if freq == 0: self._state = ProbingState.NOT_ME break @@ -132,14 +133,13 @@ class Latin1Prober(CharSetProber): return 0.01 total = sum(self._freq_counter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) - / total) - if confidence < 0.0: - confidence = 0.0 + confidence = ( + 0.0 + if total < 0.01 + else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total + ) + confidence = max(confidence, 0.0) # lower the confidence of latin1 so that other more accurate # detector can take priority. - confidence = confidence * 0.73 + confidence *= 0.73 return confidence diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py index 6256ecf..bf96ad5 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -28,7 +28,7 @@ ######################### END LICENSE BLOCK ######################### from .charsetprober import CharSetProber -from .enums import ProbingState, MachineState +from .enums import MachineState, ProbingState class MultiByteCharSetProber(CharSetProber): @@ -37,13 +37,13 @@ class MultiByteCharSetProber(CharSetProber): """ def __init__(self, lang_filter=None): - super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + super().__init__(lang_filter=lang_filter) self.distribution_analyzer = None self.coding_sm = None self._last_char = [0, 0] def reset(self): - super(MultiByteCharSetProber, self).reset() + super().reset() if self.coding_sm: self.coding_sm.reset() if self.distribution_analyzer: @@ -59,30 +59,34 @@ class MultiByteCharSetProber(CharSetProber): raise NotImplementedError def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) + for i, byte in enumerate(byte_str): + coding_state = self.coding_sm.next_state(byte) if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) + self.logger.debug( + "%s %s prober hit error at byte %s", + self.charset_name, + self.language, + i, + ) self._state = ProbingState.NOT_ME break - elif coding_state == MachineState.ITS_ME: + if coding_state == MachineState.ITS_ME: self._state = ProbingState.FOUND_IT break - elif coding_state == MachineState.START: + if coding_state == MachineState.START: char_len = self.coding_sm.get_current_charlen() if i == 0: - self._last_char[1] = byte_str[0] + self._last_char[1] = byte self.distribution_analyzer.feed(self._last_char, char_len) else: - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) + self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) self._last_char[0] = byte_str[-1] if self.state == ProbingState.DETECTING: - if (self.distribution_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + if self.distribution_analyzer.got_enough_data() and ( + self.get_confidence() > self.SHORTCUT_THRESHOLD + ): self._state = ProbingState.FOUND_IT return self.state diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py index 530abe7..9448836 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py @@ -27,20 +27,21 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .cp949prober import CP949Prober from .big5prober import Big5Prober +from .charsetgroupprober import CharSetGroupProber +from .cp949prober import CP949Prober +from .eucjpprober import EUCJPProber +from .euckrprober import EUCKRProber from .euctwprober import EUCTWProber +from .gb2312prober import GB2312Prober +from .johabprober import JOHABProber +from .sjisprober import SJISProber +from .utf8prober import UTF8Prober class MBCSGroupProber(CharSetGroupProber): def __init__(self, lang_filter=None): - super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + super().__init__(lang_filter=lang_filter) self.probers = [ UTF8Prober(), SJISProber(), @@ -49,6 +50,7 @@ class MBCSGroupProber(CharSetGroupProber): EUCKRProber(), CP949Prober(), Big5Prober(), - EUCTWProber() + EUCTWProber(), + JOHABProber(), ] self.reset() diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcssm.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcssm.py index 8360d0f..d3b9c4b 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcssm.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcssm.py @@ -29,39 +29,40 @@ from .enums import MachineState # BIG5 +# fmt: off BIG5_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 4,4,4,4,4,4,4,4, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 4,3,3,3,3,3,3,3, # a0 - a7 - 3,3,3,3,3,3,3,3, # a8 - af - 3,3,3,3,3,3,3,3, # b0 - b7 - 3,3,3,3,3,3,3,3, # b8 - bf - 3,3,3,3,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as legal value + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 + 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f + 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 + 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f + 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 + 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f + 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 + 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f + 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 + 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f + 4, 4, 4, 4, 4, 4, 4, 4, # 80 - 87 + 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f + 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97 + 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f + 4, 3, 3, 3, 3, 3, 3, 3, # a0 - a7 + 3, 3, 3, 3, 3, 3, 3, 3, # a8 - af + 3, 3, 3, 3, 3, 3, 3, 3, # b0 - b7 + 3, 3, 3, 3, 3, 3, 3, 3, # b8 - bf + 3, 3, 3, 3, 3, 3, 3, 3, # c0 - c7 + 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf + 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7 + 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df + 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 + 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef + 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 + 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff ) BIG5_ST = ( @@ -69,34 +70,37 @@ BIG5_ST = ( MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 ) +# fmt: on BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) -BIG5_SM_MODEL = {'class_table': BIG5_CLS, - 'class_factor': 5, - 'state_table': BIG5_ST, - 'char_len_table': BIG5_CHAR_LEN_TABLE, - 'name': 'Big5'} +BIG5_SM_MODEL = { + "class_table": BIG5_CLS, + "class_factor": 5, + "state_table": BIG5_ST, + "char_len_table": BIG5_CHAR_LEN_TABLE, + "name": "Big5", +} # CP949 - +# fmt: off CP949_CLS = ( - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f - 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f - 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f - 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f - 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f - 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f - 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f - 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f - 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af - 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf - 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, # 00 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, # 10 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 3f + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 4f + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 50 - 5f + 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, # 60 - 6f + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 70 - 7f + 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 80 - 8f + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 9f + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, # a0 - af + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, # b0 - bf + 7, 7, 7, 7, 7, 7, 9, 2, 2, 3, 2, 2, 2, 2, 2, 2, # c0 - cf + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # d0 - df + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # e0 - ef + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, # f0 - ff ) CP949_ST = ( @@ -109,50 +113,53 @@ CP949_ST = ( MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 ) +# fmt: on CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) -CP949_SM_MODEL = {'class_table': CP949_CLS, - 'class_factor': 10, - 'state_table': CP949_ST, - 'char_len_table': CP949_CHAR_LEN_TABLE, - 'name': 'CP949'} +CP949_SM_MODEL = { + "class_table": CP949_CLS, + "class_factor": 10, + "state_table": CP949_ST, + "char_len_table": CP949_CHAR_LEN_TABLE, + "name": "CP949", +} # EUC-JP - +# fmt: off EUCJP_CLS = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,5,5, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,5,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,4,4,4,4,4,4,4, # 30 - 37 - 4,4,4,4,4,4,4,4, # 38 - 3f - 4,4,4,4,4,4,4,4, # 40 - 47 - 4,4,4,4,4,4,4,4, # 48 - 4f - 4,4,4,4,4,4,4,4, # 50 - 57 - 4,4,4,4,4,4,4,4, # 58 - 5f - 4,4,4,4,4,4,4,4, # 60 - 67 - 4,4,4,4,4,4,4,4, # 68 - 6f - 4,4,4,4,4,4,4,4, # 70 - 77 - 4,4,4,4,4,4,4,4, # 78 - 7f - 5,5,5,5,5,5,5,5, # 80 - 87 - 5,5,5,5,5,5,1,3, # 88 - 8f - 5,5,5,5,5,5,5,5, # 90 - 97 - 5,5,5,5,5,5,5,5, # 98 - 9f - 5,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,0,5 # f8 - ff + 4, 4, 4, 4, 4, 4, 4, 4, # 00 - 07 + 4, 4, 4, 4, 4, 4, 5, 5, # 08 - 0f + 4, 4, 4, 4, 4, 4, 4, 4, # 10 - 17 + 4, 4, 4, 5, 4, 4, 4, 4, # 18 - 1f + 4, 4, 4, 4, 4, 4, 4, 4, # 20 - 27 + 4, 4, 4, 4, 4, 4, 4, 4, # 28 - 2f + 4, 4, 4, 4, 4, 4, 4, 4, # 30 - 37 + 4, 4, 4, 4, 4, 4, 4, 4, # 38 - 3f + 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 47 + 4, 4, 4, 4, 4, 4, 4, 4, # 48 - 4f + 4, 4, 4, 4, 4, 4, 4, 4, # 50 - 57 + 4, 4, 4, 4, 4, 4, 4, 4, # 58 - 5f + 4, 4, 4, 4, 4, 4, 4, 4, # 60 - 67 + 4, 4, 4, 4, 4, 4, 4, 4, # 68 - 6f + 4, 4, 4, 4, 4, 4, 4, 4, # 70 - 77 + 4, 4, 4, 4, 4, 4, 4, 4, # 78 - 7f + 5, 5, 5, 5, 5, 5, 5, 5, # 80 - 87 + 5, 5, 5, 5, 5, 5, 1, 3, # 88 - 8f + 5, 5, 5, 5, 5, 5, 5, 5, # 90 - 97 + 5, 5, 5, 5, 5, 5, 5, 5, # 98 - 9f + 5, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 + 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef + 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 + 0, 0, 0, 0, 0, 0, 0, 5 # f8 - ff ) EUCJP_ST = ( @@ -162,100 +169,163 @@ EUCJP_ST = ( MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 ) +# fmt: on EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) -EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, - 'class_factor': 6, - 'state_table': EUCJP_ST, - 'char_len_table': EUCJP_CHAR_LEN_TABLE, - 'name': 'EUC-JP'} +EUCJP_SM_MODEL = { + "class_table": EUCJP_CLS, + "class_factor": 6, + "state_table": EUCJP_ST, + "char_len_table": EUCJP_CHAR_LEN_TABLE, + "name": "EUC-JP", +} # EUC-KR - +# fmt: off EUCKR_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,3,3,3, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,3,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 2,2,2,2,2,2,2,2, # e0 - e7 - 2,2,2,2,2,2,2,2, # e8 - ef - 2,2,2,2,2,2,2,2, # f0 - f7 - 2,2,2,2,2,2,2,0 # f8 - ff + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 + 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f + 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47 + 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f + 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57 + 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f + 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67 + 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f + 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77 + 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f + 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 + 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f + 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 + 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f + 0, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 3, 3, 3, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 3, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7 + 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef + 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7 + 2, 2, 2, 2, 2, 2, 2, 0 # f8 - ff ) EUCKR_ST = ( MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f ) +# fmt: on EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) -EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, - 'class_factor': 4, - 'state_table': EUCKR_ST, - 'char_len_table': EUCKR_CHAR_LEN_TABLE, - 'name': 'EUC-KR'} +EUCKR_SM_MODEL = { + "class_table": EUCKR_CLS, + "class_factor": 4, + "state_table": EUCKR_ST, + "char_len_table": EUCKR_CHAR_LEN_TABLE, + "name": "EUC-KR", +} + +# JOHAB +# fmt: off +JOHAB_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,0,0, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,0,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,3,3,3,3,3,3,3, # 30 - 37 + 3,3,3,3,3,3,3,3, # 38 - 3f + 3,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,2, # 78 - 7f + 6,6,6,6,8,8,8,8, # 80 - 87 + 8,8,8,8,8,8,8,8, # 88 - 8f + 8,7,7,7,7,7,7,7, # 90 - 97 + 7,7,7,7,7,7,7,7, # 98 - 9f + 7,7,7,7,7,7,7,7, # a0 - a7 + 7,7,7,7,7,7,7,7, # a8 - af + 7,7,7,7,7,7,7,7, # b0 - b7 + 7,7,7,7,7,7,7,7, # b8 - bf + 7,7,7,7,7,7,7,7, # c0 - c7 + 7,7,7,7,7,7,7,7, # c8 - cf + 7,7,7,7,5,5,5,5, # d0 - d7 + 5,9,9,9,9,9,9,5, # d8 - df + 9,9,9,9,9,9,9,9, # e0 - e7 + 9,9,9,9,9,9,9,9, # e8 - ef + 9,9,9,9,9,9,9,9, # f0 - f7 + 9,9,5,5,5,5,5,0 # f8 - ff +) + +JOHAB_ST = ( +# cls = 0 1 2 3 4 5 6 7 8 9 + MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,3 ,3 ,4 , # MachineState.START + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR , # MachineState.ERROR + MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START , # 3 + MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START , # 4 +) +# fmt: on + +JOHAB_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 0, 0, 2, 2, 2) + +JOHAB_SM_MODEL = { + "class_table": JOHAB_CLS, + "class_factor": 10, + "state_table": JOHAB_ST, + "char_len_table": JOHAB_CHAR_LEN_TABLE, + "name": "Johab", +} # EUC-TW - +# fmt: off EUCTW_CLS = ( - 2,2,2,2,2,2,2,2, # 00 - 07 - 2,2,2,2,2,2,0,0, # 08 - 0f - 2,2,2,2,2,2,2,2, # 10 - 17 - 2,2,2,0,2,2,2,2, # 18 - 1f - 2,2,2,2,2,2,2,2, # 20 - 27 - 2,2,2,2,2,2,2,2, # 28 - 2f - 2,2,2,2,2,2,2,2, # 30 - 37 - 2,2,2,2,2,2,2,2, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,2, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,6,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,3,4,4,4,4,4,4, # a0 - a7 - 5,5,1,1,1,1,1,1, # a8 - af - 1,1,1,1,1,1,1,1, # b0 - b7 - 1,1,1,1,1,1,1,1, # b8 - bf - 1,1,3,1,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff + 2, 2, 2, 2, 2, 2, 2, 2, # 00 - 07 + 2, 2, 2, 2, 2, 2, 0, 0, # 08 - 0f + 2, 2, 2, 2, 2, 2, 2, 2, # 10 - 17 + 2, 2, 2, 0, 2, 2, 2, 2, # 18 - 1f + 2, 2, 2, 2, 2, 2, 2, 2, # 20 - 27 + 2, 2, 2, 2, 2, 2, 2, 2, # 28 - 2f + 2, 2, 2, 2, 2, 2, 2, 2, # 30 - 37 + 2, 2, 2, 2, 2, 2, 2, 2, # 38 - 3f + 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 + 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f + 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 + 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f + 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 + 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f + 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 + 2, 2, 2, 2, 2, 2, 2, 2, # 78 - 7f + 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 + 0, 0, 0, 0, 0, 0, 6, 0, # 88 - 8f + 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 + 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f + 0, 3, 4, 4, 4, 4, 4, 4, # a0 - a7 + 5, 5, 1, 1, 1, 1, 1, 1, # a8 - af + 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7 + 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf + 1, 1, 3, 1, 3, 3, 3, 3, # c0 - c7 + 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf + 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7 + 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df + 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 + 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef + 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 + 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff ) EUCTW_ST = ( @@ -266,50 +336,53 @@ EUCTW_ST = ( 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f ) +# fmt: on EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) -EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, - 'class_factor': 7, - 'state_table': EUCTW_ST, - 'char_len_table': EUCTW_CHAR_LEN_TABLE, - 'name': 'x-euc-tw'} +EUCTW_SM_MODEL = { + "class_table": EUCTW_CLS, + "class_factor": 7, + "state_table": EUCTW_ST, + "char_len_table": EUCTW_CHAR_LEN_TABLE, + "name": "x-euc-tw", +} # GB2312 - +# fmt: off GB2312_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 3,3,3,3,3,3,3,3, # 30 - 37 - 3,3,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,4, # 78 - 7f - 5,6,6,6,6,6,6,6, # 80 - 87 - 6,6,6,6,6,6,6,6, # 88 - 8f - 6,6,6,6,6,6,6,6, # 90 - 97 - 6,6,6,6,6,6,6,6, # 98 - 9f - 6,6,6,6,6,6,6,6, # a0 - a7 - 6,6,6,6,6,6,6,6, # a8 - af - 6,6,6,6,6,6,6,6, # b0 - b7 - 6,6,6,6,6,6,6,6, # b8 - bf - 6,6,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 6,6,6,6,6,6,6,6, # e0 - e7 - 6,6,6,6,6,6,6,6, # e8 - ef - 6,6,6,6,6,6,6,6, # f0 - f7 - 6,6,6,6,6,6,6,0 # f8 - ff + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 3, 3, 3, 3, 3, 3, 3, 3, # 30 - 37 + 3, 3, 1, 1, 1, 1, 1, 1, # 38 - 3f + 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 + 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f + 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 + 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f + 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 + 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f + 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 + 2, 2, 2, 2, 2, 2, 2, 4, # 78 - 7f + 5, 6, 6, 6, 6, 6, 6, 6, # 80 - 87 + 6, 6, 6, 6, 6, 6, 6, 6, # 88 - 8f + 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 97 + 6, 6, 6, 6, 6, 6, 6, 6, # 98 - 9f + 6, 6, 6, 6, 6, 6, 6, 6, # a0 - a7 + 6, 6, 6, 6, 6, 6, 6, 6, # a8 - af + 6, 6, 6, 6, 6, 6, 6, 6, # b0 - b7 + 6, 6, 6, 6, 6, 6, 6, 6, # b8 - bf + 6, 6, 6, 6, 6, 6, 6, 6, # c0 - c7 + 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf + 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7 + 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df + 6, 6, 6, 6, 6, 6, 6, 6, # e0 - e7 + 6, 6, 6, 6, 6, 6, 6, 6, # e8 - ef + 6, 6, 6, 6, 6, 6, 6, 6, # f0 - f7 + 6, 6, 6, 6, 6, 6, 6, 0 # f8 - ff ) GB2312_ST = ( @@ -320,6 +393,7 @@ GB2312_ST = ( MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f ) +# fmt: on # To be accurate, the length of class 6 can be either 2 or 4. # But it is not necessary to discriminate between the two since @@ -328,100 +402,105 @@ GB2312_ST = ( # 2 here. GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) -GB2312_SM_MODEL = {'class_table': GB2312_CLS, - 'class_factor': 7, - 'state_table': GB2312_ST, - 'char_len_table': GB2312_CHAR_LEN_TABLE, - 'name': 'GB2312'} +GB2312_SM_MODEL = { + "class_table": GB2312_CLS, + "class_factor": 7, + "state_table": GB2312_ST, + "char_len_table": GB2312_CHAR_LEN_TABLE, + "name": "GB2312", +} # Shift_JIS - +# fmt: off SJIS_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,2,2,3, # 80 - 87 - 3,3,3,3,3,3,3,3, # 88 - 8f - 3,3,3,3,3,3,3,3, # 90 - 97 - 3,3,3,3,3,3,3,3, # 98 - 9f + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 + 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f + 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47 + 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f + 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57 + 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f + 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67 + 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f + 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77 + 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f + 3, 3, 3, 3, 3, 2, 2, 3, # 80 - 87 + 3, 3, 3, 3, 3, 3, 3, 3, # 88 - 8f + 3, 3, 3, 3, 3, 3, 3, 3, # 90 - 97 + 3, 3, 3, 3, 3, 3, 3, 3, # 98 - 9f #0xa0 is illegal in sjis encoding, but some pages does #contain such byte. We need to be more error forgiven. - 2,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,4,4,4, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,0,0,0) # f8 - ff - + 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7 + 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af + 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7 + 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf + 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7 + 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf + 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7 + 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df + 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7 + 3, 3, 3, 3, 3, 4, 4, 4, # e8 - ef + 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7 + 3, 3, 3, 3, 3, 0, 0, 0, # f8 - ff +) SJIS_ST = ( MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 ) +# fmt: on SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) -SJIS_SM_MODEL = {'class_table': SJIS_CLS, - 'class_factor': 6, - 'state_table': SJIS_ST, - 'char_len_table': SJIS_CHAR_LEN_TABLE, - 'name': 'Shift_JIS'} +SJIS_SM_MODEL = { + "class_table": SJIS_CLS, + "class_factor": 6, + "state_table": SJIS_ST, + "char_len_table": SJIS_CHAR_LEN_TABLE, + "name": "Shift_JIS", +} # UCS2-BE - +# fmt: off UCS2BE_CLS = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff + 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 + 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 + 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f + 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 + 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f + 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7 + 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af + 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7 + 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf + 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7 + 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf + 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7 + 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df + 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 + 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef + 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 + 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff ) UCS2BE_ST = ( @@ -433,50 +512,53 @@ UCS2BE_ST = ( 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 ) +# fmt: on UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) -UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, - 'class_factor': 6, - 'state_table': UCS2BE_ST, - 'char_len_table': UCS2BE_CHAR_LEN_TABLE, - 'name': 'UTF-16BE'} +UCS2BE_SM_MODEL = { + "class_table": UCS2BE_CLS, + "class_factor": 6, + "state_table": UCS2BE_ST, + "char_len_table": UCS2BE_CHAR_LEN_TABLE, + "name": "UTF-16BE", +} # UCS2-LE - +# fmt: off UCS2LE_CLS = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff + 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07 + 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f + 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17 + 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f + 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27 + 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f + 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37 + 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f + 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47 + 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f + 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57 + 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f + 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67 + 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f + 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77 + 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f + 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87 + 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f + 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97 + 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f + 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7 + 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af + 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7 + 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf + 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7 + 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf + 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7 + 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df + 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7 + 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef + 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7 + 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff ) UCS2LE_ST = ( @@ -488,50 +570,53 @@ UCS2LE_ST = ( 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 ) +# fmt: on UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) -UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, - 'class_factor': 6, - 'state_table': UCS2LE_ST, - 'char_len_table': UCS2LE_CHAR_LEN_TABLE, - 'name': 'UTF-16LE'} +UCS2LE_SM_MODEL = { + "class_table": UCS2LE_CLS, + "class_factor": 6, + "state_table": UCS2LE_ST, + "char_len_table": UCS2LE_CHAR_LEN_TABLE, + "name": "UTF-16LE", +} # UTF-8 - +# fmt: off UTF8_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 2,2,2,2,3,3,3,3, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 5,5,5,5,5,5,5,5, # a0 - a7 - 5,5,5,5,5,5,5,5, # a8 - af - 5,5,5,5,5,5,5,5, # b0 - b7 - 5,5,5,5,5,5,5,5, # b8 - bf - 0,0,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 7,8,8,8,8,8,8,8, # e0 - e7 - 8,8,8,8,8,9,8,8, # e8 - ef - 10,11,11,11,11,11,11,11, # f0 - f7 - 12,13,13,13,14,15,0,0 # f8 - ff + 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as a legal value + 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f + 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17 + 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f + 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27 + 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f + 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37 + 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f + 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47 + 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f + 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57 + 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f + 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67 + 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f + 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77 + 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f + 2, 2, 2, 2, 3, 3, 3, 3, # 80 - 87 + 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f + 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97 + 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f + 5, 5, 5, 5, 5, 5, 5, 5, # a0 - a7 + 5, 5, 5, 5, 5, 5, 5, 5, # a8 - af + 5, 5, 5, 5, 5, 5, 5, 5, # b0 - b7 + 5, 5, 5, 5, 5, 5, 5, 5, # b8 - bf + 0, 0, 6, 6, 6, 6, 6, 6, # c0 - c7 + 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf + 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7 + 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df + 7, 8, 8, 8, 8, 8, 8, 8, # e0 - e7 + 8, 8, 8, 8, 8, 9, 8, 8, # e8 - ef + 10, 11, 11, 11, 11, 11, 11, 11, # f0 - f7 + 12, 13, 13, 13, 14, 15, 0, 0 # f8 - ff ) UTF8_ST = ( @@ -562,11 +647,14 @@ UTF8_ST = ( MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf ) +# fmt: on UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) -UTF8_SM_MODEL = {'class_table': UTF8_CLS, - 'class_factor': 16, - 'state_table': UTF8_ST, - 'char_len_table': UTF8_CHAR_LEN_TABLE, - 'name': 'UTF-8'} +UTF8_SM_MODEL = { + "class_table": UTF8_CLS, + "class_factor": 16, + "state_table": UTF8_ST, + "char_len_table": UTF8_CHAR_LEN_TABLE, + "name": "UTF-8", +} diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-310.pyc index d4d335879cb28fb083f468984a3b38cf3700da82..916f62afad1733eac02e1150ea9a7022a47e2093 100644 GIT binary patch delta 19 ZcmX@fc#@GjpO=@50SHPD%TMIq2LLW}1mpk! delta 19 ZcmX@fc#@GjpO=@50SKzqB`0$40{|;?1V{h? diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-310.pyc index 7bff3a3d49a4f6ad0d61828186207e5dff1b3e57..35a7487709e677efd3c38a0d7473403b1d5dc397 100644 GIT binary patch delta 2295 zcmaKsTWl0n7{|{!b7psE+3f`=)^f)dT7+`H$fZyzRumSrTyzD;wcon5wA(T>`+J)$}CQWCSgw zMG7tkTue)-8U>dka2YLEYz5c~dJ1v1REM~gv`VphuzG5sFs-Ji!Pd}P#TvmHX`PB& z53<1<(J{kDppCQ%VVfatp{*)t8^|`=t{QoUb||(JY$xpsrrV7sn`n<>d%^Znvx<9` z_9@l^)@XbxE3DZ|^s-`YU~P0% zv14>xu@hh?=oQt@tCTD-FUNsiqm#iDr_jvnWEK$gHz=j_H>q9eMCm|(3;r28t@IA+ zRLgq?>V^^jQkrU9GzGC1-clN?MK9W$_rT6FxP8QlfN$*3x8ua-AeHf(w27UYP zNdGzBZ_*b9m2Q1m_BBsRy4}VaMsqi`d%0_Jb@f*K<t%a`cgtoB(J!?22*pRE+wN9A$FdyRJ z>qv}69K(sa`Y^O{o<&_`nB#_EW5m#!mgrx7sLytm*?qmaTB9x!&+B+hTe;)LdM`5sROJ3JhRQ>DT!GuJfr%Qqi_z_#z@v_PpRYH<5FcYCNV|*% zI{BCwXD!TcX#hiZYMpWv-x!y}>USjC3MKl*nq}=Ak;NZAPfX&r{d*0}AX1&GJShhF zfN=fvY@FM8LXvjwicxV#JC0>MD@gc*=D9h^cPAQnK59ED%dyXQIHw_t#`SrACeP1V z^O3Y*s_>LIc4gAp^o3rlX{TQ@1|u#>R>s9tj7O((cjm10CVBlNZ)nghpXMW`NgeHu zY3B6~C*5sZ^QP5osyl6(4Z^B~kTiNzR;t^y9cy+;B(T!GmTB&QpY1Pslt*}EYQENA zc`%jD^rbTC#-a}v$w(YcBoYl_Yk96Yw(5w#6PCXf`M7DeccpB*J>As>|I%c0eHVW` z%U{npZrg_uCb?K3c=0NGR8ehdx$j~>{Lk)BT#Mh#^q6{cSV44*Cx^C9fOc$U-evTl}gPp+M%{4BT3Qht)V ziwa6T7I$S!@Gktepga=a%R@yE!M&iL33*IO8kC3P8)+(~(DS&=l$4M^#Vy%WQi43! z<@rDnp<=PC3>E&Vu|Y8fH5#ZMpLU&u{D664u1blH(XH{H?}fG^MGo)BA{@Mx%9o;N vc~5Ud#43i12ol^EB{v!K?zI_X&g{k|hwm%sm1zWHE^QYzDFfG)dNstQltdY!)(iHq4Q5F2cER z546BMn4hJv02WHN2-zZ73@uo&6$6*RQpuJfTL#N9ZUwBwxK*%PvLv!3tbrh`g>}g8 zg*M678vz&A!v-0+5z&2@HJo7+hHZlTF>Ev19)K+}Xe*Mf@StpD8$2XgJF<4z?oZc& zP40k)CF?}i2|H!nF4&FCt*>kk!aeYagk7)~_F=bmx*zF&coduIh68BrfyZRpgUAlT zA!PNPJr2E+9Y%H-j!1SCo{;PqvSaY1D@&%}sVRu)IGpgOcp9hB;h8!?dm8$rJp&-^ z2AuTmS@b^zIce{Q({j6cwBmL#O96_Frd$doC`Qrja%^#NGb?7dzIuZZ%F-SDXq;&_gSTU z#WwU@p?_qZ(P}F;ag-4{ zO2-tUIQXoq4n@fv6{Y4dl-yDJHM7;x%!Q6-2ev3xtr)TcD7m9qEA1eV5i(4WZv;9T zvcq=7(MHfVMv7PyGejNCp~pbM&efiQH3uq|?fo1~#^N>2s+0}W)UX+^HMD^+?@*{~ zUIlxsK)zyR5{B&dtiBYx|pq`vqqb) zn?~8xy;5YBp5&(3h&fv%29gmx{bGUC-pxmX$H`d5rxx-7MiEM)40ffe)5A$DqOp zok>Z2GSOse-f;Bx|D5)CU+jiD`);?PdAzCV%itZzzaIWYX&#?w`Ix#Pa|M>Gg>`%x z?20KCK}9#>RBPO_@jc0!%vVZ%{YJ+2`%HzpJA1m0baw6Oy<--CD*sr5?S&Fl@<&3C#DcQm5=XMA5nXXx-7{gn4k;~(+V zlrDbhB*uKm`x>@-i|_GMs8bxFUgSD2Pt&jP^9_Gd)19D~*i;iL7X6)t8hE self.SB_ENOUGH_REL_THRESHOLD: confidence = self.get_confidence() if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: - self.logger.debug('%s confidence = %s, we have a winner', - charset_name, confidence) + self.logger.debug( + "%s confidence = %s, we have a winner", charset_name, confidence + ) self._state = ProbingState.FOUND_IT elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: - self.logger.debug('%s confidence = %s, below negative ' - 'shortcut threshhold %s', charset_name, - confidence, - self.NEGATIVE_SHORTCUT_THRESHOLD) + self.logger.debug( + "%s confidence = %s, below negative shortcut threshold %s", + charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD, + ) self._state = ProbingState.NOT_ME return self.state @@ -137,8 +142,18 @@ class SingleByteCharSetProber(CharSetProber): def get_confidence(self): r = 0.01 if self._total_seqs > 0: - r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / - self._total_seqs / self._model.typical_positive_ratio) + r = ( + ( + self._seq_counters[SequenceLikelihood.POSITIVE] + + 0.25 * self._seq_counters[SequenceLikelihood.LIKELY] + ) + / self._total_seqs + / self._model.typical_positive_ratio + ) + # The more control characters (proportionnaly to the size + # of the text), the less confident we become in the current + # charset. + r = r * (self._total_char - self._control_char) / self._total_char r = r * self._freq_char / self._total_char if r >= 1.0: r = 0.99 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py index bdeef4e..cad001c 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -28,16 +28,20 @@ from .charsetgroupprober import CharSetGroupProber from .hebrewprober import HebrewProber -from .langbulgarianmodel import (ISO_8859_5_BULGARIAN_MODEL, - WINDOWS_1251_BULGARIAN_MODEL) +from .langbulgarianmodel import ISO_8859_5_BULGARIAN_MODEL, WINDOWS_1251_BULGARIAN_MODEL from .langgreekmodel import ISO_8859_7_GREEK_MODEL, WINDOWS_1253_GREEK_MODEL from .langhebrewmodel import WINDOWS_1255_HEBREW_MODEL + # from .langhungarianmodel import (ISO_8859_2_HUNGARIAN_MODEL, # WINDOWS_1250_HUNGARIAN_MODEL) -from .langrussianmodel import (IBM855_RUSSIAN_MODEL, IBM866_RUSSIAN_MODEL, - ISO_8859_5_RUSSIAN_MODEL, KOI8_R_RUSSIAN_MODEL, - MACCYRILLIC_RUSSIAN_MODEL, - WINDOWS_1251_RUSSIAN_MODEL) +from .langrussianmodel import ( + IBM855_RUSSIAN_MODEL, + IBM866_RUSSIAN_MODEL, + ISO_8859_5_RUSSIAN_MODEL, + KOI8_R_RUSSIAN_MODEL, + MACCYRILLIC_RUSSIAN_MODEL, + WINDOWS_1251_RUSSIAN_MODEL, +) from .langthaimodel import TIS_620_THAI_MODEL from .langturkishmodel import ISO_8859_9_TURKISH_MODEL from .sbcharsetprober import SingleByteCharSetProber @@ -45,16 +49,17 @@ from .sbcharsetprober import SingleByteCharSetProber class SBCSGroupProber(CharSetGroupProber): def __init__(self): - super(SBCSGroupProber, self).__init__() + super().__init__() hebrew_prober = HebrewProber() - logical_hebrew_prober = SingleByteCharSetProber(WINDOWS_1255_HEBREW_MODEL, - False, hebrew_prober) + logical_hebrew_prober = SingleByteCharSetProber( + WINDOWS_1255_HEBREW_MODEL, is_reversed=False, name_prober=hebrew_prober + ) # TODO: See if using ISO-8859-8 Hebrew model works better here, since # it's actually the visual one - visual_hebrew_prober = SingleByteCharSetProber(WINDOWS_1255_HEBREW_MODEL, - True, hebrew_prober) - hebrew_prober.set_model_probers(logical_hebrew_prober, - visual_hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber( + WINDOWS_1255_HEBREW_MODEL, is_reversed=True, name_prober=hebrew_prober + ) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) # TODO: ORDER MATTERS HERE. I changed the order vs what was in master # and several tests failed that did not before. Some thought # should be put into the ordering, and we should consider making diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/sjisprober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/sjisprober.py index 9e29623..3bcbdb7 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/sjisprober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/sjisprober.py @@ -25,24 +25,24 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine from .chardistribution import SJISDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .enums import MachineState, ProbingState from .jpcntx import SJISContextAnalysis +from .mbcharsetprober import MultiByteCharSetProber from .mbcssm import SJIS_SM_MODEL -from .enums import ProbingState, MachineState class SJISProber(MultiByteCharSetProber): def __init__(self): - super(SJISProber, self).__init__() + super().__init__() self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) self.distribution_analyzer = SJISDistributionAnalysis() self.context_analyzer = SJISContextAnalysis() self.reset() def reset(self): - super(SJISProber, self).reset() + super().reset() self.context_analyzer.reset() @property @@ -54,34 +54,40 @@ class SJISProber(MultiByteCharSetProber): return "Japanese" def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) + for i, byte in enumerate(byte_str): + coding_state = self.coding_sm.next_state(byte) if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) + self.logger.debug( + "%s %s prober hit error at byte %s", + self.charset_name, + self.language, + i, + ) self._state = ProbingState.NOT_ME break - elif coding_state == MachineState.ITS_ME: + if coding_state == MachineState.ITS_ME: self._state = ProbingState.FOUND_IT break - elif coding_state == MachineState.START: + if coding_state == MachineState.START: char_len = self.coding_sm.get_current_charlen() if i == 0: - self._last_char[1] = byte_str[0] - self.context_analyzer.feed(self._last_char[2 - char_len:], - char_len) + self._last_char[1] = byte + self.context_analyzer.feed( + self._last_char[2 - char_len :], char_len + ) self.distribution_analyzer.feed(self._last_char, char_len) else: - self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 - - char_len], char_len) - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) + self.context_analyzer.feed( + byte_str[i + 1 - char_len : i + 3 - char_len], char_len + ) + self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len) self._last_char[0] = byte_str[-1] if self.state == ProbingState.DETECTING: - if (self.context_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + if self.context_analyzer.got_enough_data() and ( + self.get_confidence() > self.SHORTCUT_THRESHOLD + ): self._state = ProbingState.FOUND_IT return self.state diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/universaldetector.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/universaldetector.py index 055a8ac..22fcf82 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/universaldetector.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/universaldetector.py @@ -46,9 +46,10 @@ from .escprober import EscCharSetProber from .latin1prober import Latin1Prober from .mbcsgroupprober import MBCSGroupProber from .sbcsgroupprober import SBCSGroupProber +from .utf1632prober import UTF1632Prober -class UniversalDetector(object): +class UniversalDetector: """ The ``UniversalDetector`` class underlies the ``chardet.detect`` function and coordinates all of the different charset probers. @@ -66,20 +67,23 @@ class UniversalDetector(object): """ MINIMUM_THRESHOLD = 0.20 - HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') - ESC_DETECTOR = re.compile(b'(\033|~{)') - WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') - ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', - 'iso-8859-2': 'Windows-1250', - 'iso-8859-5': 'Windows-1251', - 'iso-8859-6': 'Windows-1256', - 'iso-8859-7': 'Windows-1253', - 'iso-8859-8': 'Windows-1255', - 'iso-8859-9': 'Windows-1254', - 'iso-8859-13': 'Windows-1257'} + HIGH_BYTE_DETECTOR = re.compile(b"[\x80-\xFF]") + ESC_DETECTOR = re.compile(b"(\033|~{)") + WIN_BYTE_DETECTOR = re.compile(b"[\x80-\x9F]") + ISO_WIN_MAP = { + "iso-8859-1": "Windows-1252", + "iso-8859-2": "Windows-1250", + "iso-8859-5": "Windows-1251", + "iso-8859-6": "Windows-1256", + "iso-8859-7": "Windows-1253", + "iso-8859-8": "Windows-1255", + "iso-8859-9": "Windows-1254", + "iso-8859-13": "Windows-1257", + } def __init__(self, lang_filter=LanguageFilter.ALL): self._esc_charset_prober = None + self._utf1632_prober = None self._charset_probers = [] self.result = None self.done = None @@ -91,20 +95,34 @@ class UniversalDetector(object): self._has_win_bytes = None self.reset() + @property + def input_state(self): + return self._input_state + + @property + def has_win_bytes(self): + return self._has_win_bytes + + @property + def charset_probers(self): + return self._charset_probers + def reset(self): """ Reset the UniversalDetector and all of its probers back to their initial states. This is called by ``__init__``, so you only need to call this directly in between analyses of different documents. """ - self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.result = {"encoding": None, "confidence": 0.0, "language": None} self.done = False self._got_data = False self._has_win_bytes = False self._input_state = InputState.PURE_ASCII - self._last_char = b'' + self._last_char = b"" if self._esc_charset_prober: self._esc_charset_prober.reset() + if self._utf1632_prober: + self._utf1632_prober.reset() for prober in self._charset_probers: prober.reset() @@ -125,7 +143,7 @@ class UniversalDetector(object): if self.done: return - if not len(byte_str): + if not byte_str: return if not isinstance(byte_str, bytearray): @@ -136,35 +154,36 @@ class UniversalDetector(object): # If the data starts with BOM, we know it is UTF if byte_str.startswith(codecs.BOM_UTF8): # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8-SIG", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith((codecs.BOM_UTF32_LE, - codecs.BOM_UTF32_BE)): + self.result = { + "encoding": "UTF-8-SIG", + "confidence": 1.0, + "language": "", + } + elif byte_str.startswith((codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE)): # FF FE 00 00 UTF-32, little-endian BOM # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + self.result = {"encoding": "UTF-32", "confidence": 1.0, "language": ""} + elif byte_str.startswith(b"\xFE\xFF\x00\x00"): # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = {'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + self.result = { + "encoding": "X-ISO-10646-UCS-4-3412", + "confidence": 1.0, + "language": "", + } + elif byte_str.startswith(b"\x00\x00\xFF\xFE"): # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = {'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0, - 'language': ''} + self.result = { + "encoding": "X-ISO-10646-UCS-4-2143", + "confidence": 1.0, + "language": "", + } elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): # FF FE UTF-16, little endian BOM # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16", - 'confidence': 1.0, - 'language': ''} + self.result = {"encoding": "UTF-16", "confidence": 1.0, "language": ""} self._got_data = True - if self.result['encoding'] is not None: + if self.result["encoding"] is not None: self.done = True return @@ -173,12 +192,29 @@ class UniversalDetector(object): if self._input_state == InputState.PURE_ASCII: if self.HIGH_BYTE_DETECTOR.search(byte_str): self._input_state = InputState.HIGH_BYTE - elif self._input_state == InputState.PURE_ASCII and \ - self.ESC_DETECTOR.search(self._last_char + byte_str): + elif ( + self._input_state == InputState.PURE_ASCII + and self.ESC_DETECTOR.search(self._last_char + byte_str) + ): self._input_state = InputState.ESC_ASCII self._last_char = byte_str[-1:] + # next we will look to see if it is appears to be either a UTF-16 or + # UTF-32 encoding + if not self._utf1632_prober: + self._utf1632_prober = UTF1632Prober() + + if self._utf1632_prober.state == ProbingState.DETECTING: + if self._utf1632_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = { + "encoding": self._utf1632_prober.charset_name, + "confidence": self._utf1632_prober.get_confidence(), + "language": "", + } + self.done = True + return + # If we've seen escape sequences, use the EscCharSetProber, which # uses a simple state machine to check for known escape sequences in # HZ and ISO-2022 encodings, since those are the only encodings that @@ -187,12 +223,11 @@ class UniversalDetector(object): if not self._esc_charset_prober: self._esc_charset_prober = EscCharSetProber(self.lang_filter) if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = {'encoding': - self._esc_charset_prober.charset_name, - 'confidence': - self._esc_charset_prober.get_confidence(), - 'language': - self._esc_charset_prober.language} + self.result = { + "encoding": self._esc_charset_prober.charset_name, + "confidence": self._esc_charset_prober.get_confidence(), + "language": self._esc_charset_prober.language, + } self.done = True # If we've seen high bytes (i.e., those with values greater than 127), # we need to do more complicated checks using all our multi-byte and @@ -209,9 +244,11 @@ class UniversalDetector(object): self._charset_probers.append(Latin1Prober()) for prober in self._charset_probers: if prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = {'encoding': prober.charset_name, - 'confidence': prober.get_confidence(), - 'language': prober.language} + self.result = { + "encoding": prober.charset_name, + "confidence": prober.get_confidence(), + "language": prober.language, + } self.done = True break if self.WIN_BYTE_DETECTOR.search(byte_str): @@ -231,13 +268,11 @@ class UniversalDetector(object): self.done = True if not self._got_data: - self.logger.debug('no data received!') + self.logger.debug("no data received!") # Default to ASCII if it is all we've seen so far elif self._input_state == InputState.PURE_ASCII: - self.result = {'encoding': 'ascii', - 'confidence': 1.0, - 'language': ''} + self.result = {"encoding": "ascii", "confidence": 1.0, "language": ""} # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD elif self._input_state == InputState.HIGH_BYTE: @@ -257,30 +292,37 @@ class UniversalDetector(object): confidence = max_prober.get_confidence() # Use Windows encoding name instead of ISO-8859 if we saw any # extra Windows-specific bytes - if lower_charset_name.startswith('iso-8859'): + if lower_charset_name.startswith("iso-8859"): if self._has_win_bytes: - charset_name = self.ISO_WIN_MAP.get(lower_charset_name, - charset_name) - self.result = {'encoding': charset_name, - 'confidence': confidence, - 'language': max_prober.language} + charset_name = self.ISO_WIN_MAP.get( + lower_charset_name, charset_name + ) + self.result = { + "encoding": charset_name, + "confidence": confidence, + "language": max_prober.language, + } # Log all prober confidences if none met MINIMUM_THRESHOLD if self.logger.getEffectiveLevel() <= logging.DEBUG: - if self.result['encoding'] is None: - self.logger.debug('no probers hit minimum threshold') + if self.result["encoding"] is None: + self.logger.debug("no probers hit minimum threshold") for group_prober in self._charset_probers: if not group_prober: continue if isinstance(group_prober, CharSetGroupProber): for prober in group_prober.probers: - self.logger.debug('%s %s confidence = %s', - prober.charset_name, - prober.language, - prober.get_confidence()) + self.logger.debug( + "%s %s confidence = %s", + prober.charset_name, + prober.language, + prober.get_confidence(), + ) else: - self.logger.debug('%s %s confidence = %s', - group_prober.charset_name, - group_prober.language, - group_prober.get_confidence()) + self.logger.debug( + "%s %s confidence = %s", + group_prober.charset_name, + group_prober.language, + group_prober.get_confidence(), + ) return self.result diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py new file mode 100644 index 0000000..9fd1580 --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py @@ -0,0 +1,223 @@ +######################## BEGIN LICENSE BLOCK ######################## +# +# Contributor(s): +# Jason Zavaglia +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +from .charsetprober import CharSetProber +from .enums import ProbingState + + +class UTF1632Prober(CharSetProber): + """ + This class simply looks for occurrences of zero bytes, and infers + whether the file is UTF16 or UTF32 (low-endian or big-endian) + For instance, files looking like ( \0 \0 \0 [nonzero] )+ + have a good probability to be UTF32BE. Files looking like ( \0 [nonzero] )+ + may be guessed to be UTF16BE, and inversely for little-endian varieties. + """ + + # how many logical characters to scan before feeling confident of prediction + MIN_CHARS_FOR_DETECTION = 20 + # a fixed constant ratio of expected zeros or non-zeros in modulo-position. + EXPECTED_RATIO = 0.94 + + def __init__(self): + super().__init__() + self.position = 0 + self.zeros_at_mod = [0] * 4 + self.nonzeros_at_mod = [0] * 4 + self._state = ProbingState.DETECTING + self.quad = [0, 0, 0, 0] + self.invalid_utf16be = False + self.invalid_utf16le = False + self.invalid_utf32be = False + self.invalid_utf32le = False + self.first_half_surrogate_pair_detected_16be = False + self.first_half_surrogate_pair_detected_16le = False + self.reset() + + def reset(self): + super().reset() + self.position = 0 + self.zeros_at_mod = [0] * 4 + self.nonzeros_at_mod = [0] * 4 + self._state = ProbingState.DETECTING + self.invalid_utf16be = False + self.invalid_utf16le = False + self.invalid_utf32be = False + self.invalid_utf32le = False + self.first_half_surrogate_pair_detected_16be = False + self.first_half_surrogate_pair_detected_16le = False + self.quad = [0, 0, 0, 0] + + @property + def charset_name(self): + if self.is_likely_utf32be(): + return "utf-32be" + if self.is_likely_utf32le(): + return "utf-32le" + if self.is_likely_utf16be(): + return "utf-16be" + if self.is_likely_utf16le(): + return "utf-16le" + # default to something valid + return "utf-16" + + @property + def language(self): + return "" + + def approx_32bit_chars(self): + return max(1.0, self.position / 4.0) + + def approx_16bit_chars(self): + return max(1.0, self.position / 2.0) + + def is_likely_utf32be(self): + approx_chars = self.approx_32bit_chars() + return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( + self.zeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO + and self.nonzeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO + and not self.invalid_utf32be + ) + + def is_likely_utf32le(self): + approx_chars = self.approx_32bit_chars() + return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( + self.nonzeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO + and self.zeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO + and not self.invalid_utf32le + ) + + def is_likely_utf16be(self): + approx_chars = self.approx_16bit_chars() + return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( + (self.nonzeros_at_mod[1] + self.nonzeros_at_mod[3]) / approx_chars + > self.EXPECTED_RATIO + and (self.zeros_at_mod[0] + self.zeros_at_mod[2]) / approx_chars + > self.EXPECTED_RATIO + and not self.invalid_utf16be + ) + + def is_likely_utf16le(self): + approx_chars = self.approx_16bit_chars() + return approx_chars >= self.MIN_CHARS_FOR_DETECTION and ( + (self.nonzeros_at_mod[0] + self.nonzeros_at_mod[2]) / approx_chars + > self.EXPECTED_RATIO + and (self.zeros_at_mod[1] + self.zeros_at_mod[3]) / approx_chars + > self.EXPECTED_RATIO + and not self.invalid_utf16le + ) + + def validate_utf32_characters(self, quad): + """ + Validate if the quad of bytes is valid UTF-32. + + UTF-32 is valid in the range 0x00000000 - 0x0010FFFF + excluding 0x0000D800 - 0x0000DFFF + + https://en.wikipedia.org/wiki/UTF-32 + """ + if ( + quad[0] != 0 + or quad[1] > 0x10 + or (quad[0] == 0 and quad[1] == 0 and 0xD8 <= quad[2] <= 0xDF) + ): + self.invalid_utf32be = True + if ( + quad[3] != 0 + or quad[2] > 0x10 + or (quad[3] == 0 and quad[2] == 0 and 0xD8 <= quad[1] <= 0xDF) + ): + self.invalid_utf32le = True + + def validate_utf16_characters(self, pair): + """ + Validate if the pair of bytes is valid UTF-16. + + UTF-16 is valid in the range 0x0000 - 0xFFFF excluding 0xD800 - 0xFFFF + with an exception for surrogate pairs, which must be in the range + 0xD800-0xDBFF followed by 0xDC00-0xDFFF + + https://en.wikipedia.org/wiki/UTF-16 + """ + if not self.first_half_surrogate_pair_detected_16be: + if 0xD8 <= pair[0] <= 0xDB: + self.first_half_surrogate_pair_detected_16be = True + elif 0xDC <= pair[0] <= 0xDF: + self.invalid_utf16be = True + else: + if 0xDC <= pair[0] <= 0xDF: + self.first_half_surrogate_pair_detected_16be = False + else: + self.invalid_utf16be = True + + if not self.first_half_surrogate_pair_detected_16le: + if 0xD8 <= pair[1] <= 0xDB: + self.first_half_surrogate_pair_detected_16le = True + elif 0xDC <= pair[1] <= 0xDF: + self.invalid_utf16le = True + else: + if 0xDC <= pair[1] <= 0xDF: + self.first_half_surrogate_pair_detected_16le = False + else: + self.invalid_utf16le = True + + def feed(self, byte_str): + for c in byte_str: + mod4 = self.position % 4 + self.quad[mod4] = c + if mod4 == 3: + self.validate_utf32_characters(self.quad) + self.validate_utf16_characters(self.quad[0:2]) + self.validate_utf16_characters(self.quad[2:4]) + if c == 0: + self.zeros_at_mod[mod4] += 1 + else: + self.nonzeros_at_mod[mod4] += 1 + self.position += 1 + return self.state + + @property + def state(self): + if self._state in {ProbingState.NOT_ME, ProbingState.FOUND_IT}: + # terminal, decided states + return self._state + if self.get_confidence() > 0.80: + self._state = ProbingState.FOUND_IT + elif self.position > 4 * 1024: + # if we get to 4kb into the file, and we can't conclude it's UTF, + # let's give up + self._state = ProbingState.NOT_ME + return self._state + + def get_confidence(self): + return ( + 0.85 + if ( + self.is_likely_utf16le() + or self.is_likely_utf16be() + or self.is_likely_utf32le() + or self.is_likely_utf32be() + ) + else 0.00 + ) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/utf8prober.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/utf8prober.py index 6c3196c..3aae09e 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/utf8prober.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/utf8prober.py @@ -26,23 +26,22 @@ ######################### END LICENSE BLOCK ######################### from .charsetprober import CharSetProber -from .enums import ProbingState, MachineState from .codingstatemachine import CodingStateMachine +from .enums import MachineState, ProbingState from .mbcssm import UTF8_SM_MODEL - class UTF8Prober(CharSetProber): ONE_CHAR_PROB = 0.5 def __init__(self): - super(UTF8Prober, self).__init__() + super().__init__() self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) self._num_mb_chars = None self.reset() def reset(self): - super(UTF8Prober, self).reset() + super().reset() self.coding_sm.reset() self._num_mb_chars = 0 @@ -60,10 +59,10 @@ class UTF8Prober(CharSetProber): if coding_state == MachineState.ERROR: self._state = ProbingState.NOT_ME break - elif coding_state == MachineState.ITS_ME: + if coding_state == MachineState.ITS_ME: self._state = ProbingState.FOUND_IT break - elif coding_state == MachineState.START: + if coding_state == MachineState.START: if self.coding_sm.get_current_charlen() >= 2: self._num_mb_chars += 1 @@ -76,7 +75,6 @@ class UTF8Prober(CharSetProber): def get_confidence(self): unlike = 0.99 if self._num_mb_chars < 6: - unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + unlike *= self.ONE_CHAR_PROB**self._num_mb_chars return 1.0 - unlike - else: - return unlike + return unlike diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/version.py b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/version.py index 70369b9..a08a06b 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/chardet/version.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/chardet/version.py @@ -5,5 +5,5 @@ from within setup.py and from chardet subpackages. :author: Dan Blanchard (dan.blanchard@gmail.com) """ -__version__ = "4.0.0" -VERSION = __version__.split('.') +__version__ = "5.0.0" +VERSION = __version__.split(".") diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__init__.py index b149ed7..9138a8c 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__init__.py @@ -3,4 +3,4 @@ from .initialise import init, deinit, reinit, colorama_text from .ansi import Fore, Back, Style, Cursor from .ansitowin32 import AnsiToWin32 -__version__ = '0.4.4' +__version__ = '0.4.5' diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-310.pyc index d0d52db6e35fa2ad2141962edd97a1af4fc58148..2f108416d9dfc3b9e57e446e26bcd27fab967f22 100644 GIT binary patch delta 24 ecmdnPyoZ@PpO=@50SHPD%TMG!&S*OE@=E|pItN++ delta 24 ecmdnPyoZ@PpO=@50SKzqB`0zpXEd33`6U2EDh9m( diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-310.pyc index 65330e8e5f29a234a0db2098603011b8a0a104af..7912039f8b453707c8f2b99063fab30b60390ee9 100644 GIT binary patch delta 20 acmdlhzE_+(pO=@50SHPD%Wve~#0>y78U+^s delta 20 acmdlhzE_+(pO=@50SKzqB{yhyKPgGCVsoI zG)C%ZPhMo^P5Eb9=YJb8y7~uZ)*iIP3Habz2Eo$d++7X ziEk$3l~~MF=u>;Jzc4rWeS8eyeK8HWK09u=ZYWnwJ7KrcZ;KPPlXm-t@)cZ(*&Xvr zHs#-juS4r9IZx4YIZOi@ilx}fyn=DsZhv)06vJMmDa$FPY-SZwg`SNAVSE~*Vzi3tfG7(EHsjE5(4P|*JEgqo#76kcrNwoNX zq9L*i66w1n+A$NY+K1Y!WI616S}$lLB#w%k`qcU!l7iN`V9x(J)WZ!}hRak*Sn*UZ zw4koFgTmkU6dUH1Rb@+^dpjG(R&tSgp;U1l8(-&*`A)u6bIu`F@V{B%DDh1V;Bn$6 zXt`0&s;ep(kO=9Z{!{OGc~;xO=dy88jhyN2=U9grxEJIuq*28RP1RcycQa}6N5t&t zBHB>GU}%PJgn||FpGK~$-9asb?8-J6W#C$HMBFfs!V&Sn>~G02af)F={B4fITmDeX zBS^eJv+kfs$MysI22K*!@GrFufF6X-iF$J12zMd1 zg;LF3LY@cCG7K;@`LpGB;$d?064xQkLcUb8R*Nggj&7G4bQZLdWba@+I!iMQyH&)g ze(=9-zYlO&ETo3D0ueuoJE6A;vUg*!vyLVeG2kR zk)aD0%eWxkOm~k|Xunh7rzB&IVU?k&K##cJ{M+eeIPb8UBO$-dEFj-~2^S<>#A{4{ z$#hu4X$fZ}Oi4JKHSjcRK4M^VoE9@ZvwDzoRov=1r7aTsSje6yur7Yu_saS*TYb#1 z!Vn>lTA@-~@oB;YQZ8iC)x$dNDECnD`HPB_4HV8y{(C^ZV@VcV>PwzsEl5|9;k=D=+s- z^t;97(Rj`%b; zYCiE)9juN}IC8JHn#UaZ&1H;=&*8(uSL&_cBC6yD)uSq^OI57a(sjAcsn3hS5Q8f^ z^-&XV%evvX*e`1;i?PZbVXtWN^}&dB!}kq>|HOiU!rseA$xSpyTIAr$l6qM&!yM5rAgEgsgk z!DsQRcB|Lm`4$eCbcwVtGz>REzSk%rkYT$nUdrN4u~Apok*4=Q4d%(l9ODk7sKI&C zK3ebV=HUDkyLl#*2^!!Tdf0H$hD(Snud?j6VZeq#8-{Ec)>J&rp6d(_#{scaKcYA_ z?}&Hx=R65gzYA}}4_FpI8;)+II7(;CGD--xCz)HAH*uYX0TxOP-JCMhW=5w9&IjUb z^KB0Jx7W_13Z>Xlw6bZ^_GuV3gbMm}LNrwI{77`NgTp%+U5svmEu(IiBy-t(I-_Hf z7>}LP~ diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-310.pyc index fc6291f4d4d912511591d9e57d1e8e7b12db2a3e..d7d035098f195a732a7608efeb4014a2028421cd 100644 GIT binary patch delta 20 acmbQuJDZm~pO=@50SHPD%WveKzy<&=T?Ci_ delta 20 acmbQuJDZm~pO=@50SKzqB{yIFXl delta 20 acmaDa_g;=WpO=@50SKzqB{y=X@B;ujP6VR> diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-310.pyc index 38c1ed4f8e267d258974714fcf8e3260a2046027..b7e4c33c85449e4bf019b33c87b65faf4db40dcd 100644 GIT binary patch delta 20 acmcbid_$Q#pO=@50SHPD%Wvd9D+mBP2nB`! delta 20 acmcbid_$Q#pO=@50SKzqB{y=P6$Ah`Yy|26 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py b/sbsheriff/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py index 6039a05..3db248b 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -37,6 +37,12 @@ class StreamWrapper(object): def __exit__(self, *args, **kwargs): return self.__wrapped.__exit__(*args, **kwargs) + def __setstate__(self, state): + self.__dict__ = state + + def __getstate__(self): + return self.__dict__ + def write(self, text): self.__convertor.write(text) @@ -57,7 +63,9 @@ class StreamWrapper(object): stream = self.__wrapped try: return stream.closed - except AttributeError: + # AttributeError in the case that the stream doesn't support being closed + # ValueError for the case that the stream has already been detached when atexit runs + except (AttributeError, ValueError): return True diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__init__.py index 1154948..5055565 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__init__.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__init__.py @@ -6,7 +6,7 @@ # import logging -__version__ = '0.3.3' +__version__ = '0.3.5' class DistlibException(Exception): pass diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc index dcdb373b2c7c6752ca723d10bac9afcee1c01e12..69704a1838ab95909409bbdae98a37a9563859d4 100644 GIT binary patch delta 25 fcmZ3^v7CcDpO=@50SHPD%TMH<%V@fBWgRmBOp^wl delta 25 fcmZ3^v7CcDpO=@50SKzqB`0#vWi;NnvW^)5Md1bj diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc index 8517e56cb474d2a25c3964d1d6ee6875e57da86a..9fa40c665bbb22ce87f53af90983810012430701 100644 GIT binary patch delta 9625 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 EU(L#7p8x;= diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-310.pyc index 096439af272cdaf0ef480c662d30f1cd55582835..fe651505d8b743250a6fa1848bc8f69b3540bc8b 100644 GIT binary patch delta 6035 zcmZ`-4Rlo1wZ7-hoja5N5QHQU%tvtY^R*7?se)3muaD3XR$a^dx73g0Q1SWL})`isz?`D3Oi zw<(sgSLtJEWjkA@-0~~oFI+V1M4z7a^lNE-fc0r z?|{mbW@VESWqk#^3p%UZ|2x@ErPCK>O-e9dG#1_ct==2fC&DdpBVZ*1+z3Yl(U@uR zSWA}`OC|zgD^O+545SR+9!{BoXqS|0A+Zj_3P;0Mcp(XJa+LCsN)TjDu4#oMJK{#S z5f4rfzb!g9)yb*f6){p!==gSqc_Nl*bNpGtbTm-GV)3uVX0F2w$J1f9@ms`}iwkU`6g=V^=E4 zEt4n3&nH*1usA=tmdzH0Q|_DNT7enzBJr?kl2_Z4QJ#QSjO8X^H{jcVe-fYi%ETvA zu4Gr)`Be|9d7bE$Mt6uGPn*hCig%_hV(Z12>NmXyiPtKAU;Qry7E#AlUJ2n2@#4%< z@v~qFOWJP)eXJDBpqJN!*#*doeLOwrMY~&+%~(2hAyE{qN}p=6w3=pn)jp4<_Isj8 z4K2;mo&k+1A~U0+Iap;b474RJil@%57&khMgk=V*c%YRhJ4OZ$532kw%-BE>%#kKI zzBY=iue(|rv{GD{F;`B9_$a?ySgJt9Tz6SaS3nQm%3c_W;~{nX=z+E(zqW-1=D z+-;USR0MtxK`@t3hJ=Sk^Dugs0ie;{Mh@y$KpM~om@))aL^)#moGaKv_H}bgSRO)V zaR0YnHG{oqf9I-mY@UpA@PZz9K5x=$H#nEtFH@(7LPlpObV`VMuej-P5D}N>_(LJe zqV`b85qqxQcJp^I6?8iJ(d5oVJQiN@{-|m{f&%-{lFD|%U)9(fQyW;l6b%j4A($Q1gXpQZnuD2Ffu+POO zi??0_2A>M}IYbIVA(@U5BOVWhMmX#lh`?)n48e!?p6iOW%qq0E0d@ku0hkX60AyaR z28F|h=K*lU@O6OofDM2gz|(-S0BKAOs2>qHYSQE=VvcU?q5@4-Gnq0Hjz%Th6Xnl~ zl4Vn8Z-cZ90vum**B#c%Pog0Wmpdh`hxSRLec5ZQL(Hk4;DsNTiKhDH#fOMGt~U01 zt0-knei(a~>-a(;Iu$~p<@Ou(^HdfQYQHv1fr`~$!UJ!m4agPM#sH_WnnF&?~>J#F>7 zEbswjUjvLH7#x5J9F@27({etrGWMdILMnS(Jh-OrYB}p=6P93%f2Gk=&v}vueeTq^ zQE%3#B7be2cMrAiv{$cP#0t(6Nd*k~$GNz-shX1Lg{Bi~$xC32;;(`c05pj`8_MFCvCW@{`?2QF8O+ZB0l4GLudVv1L9xZJ*lmwkIPu z?qw1@&K$pyh$N$Q{x|Y3FdhqWauVSV!%T%E22D1?YY_Nf2VsgN)N9%=M__-N|E?L8shgNPG&o zpi~gjJx<|tc4p7<0C5~OVUpEPN2aqJ+lkCzrLxALiexLWy9e83cq5u8+4GD!o`xb) zLuUd6r6*}`jg;%C0QxjQC7=UPj9HtA`kK~+)QaetVZYS=99uZNCo-bOn_1p)97`Q;w^=dc97U93-5v+ZJcaxFU{&L+#6AwWk3ZF6YwHq2`Ic8s>0C8Bq{xUg@m z__V%6%)8ZU`kcBhj*cbh(#51CYQ`7+d})7Zff`Ww;N z5-biimFhAD&f8__Z>d*H=jy{X((y*(Nz>rZV$5>{PENbAD;jH~%PWO-0Ntm>le;If zi{j1QY4)mEk(s5cnz%Kyw0IUA6NU&jonI1XGUGFUAhI!7@DEKLj){ph)bS^hyhCn7 zGsbTP$ZeOKEtixn*K;w`e86WAlD7o8K{5#C%~fvI6h+Le^?TuxKige7tMfO!F3jl`Q`E?ulHJJ2c63L$Rj-SrRWW38Vq$!SO?x5uP$F|T&F{{?= zMWrbd*Y7hIjDa?MB$031Ft5!20I0EGWfwt|jJGF2hbfnb&w>w5LeG&B5i9g=CfUUQyzB^ORlRel?>fU-_HVfGY4&28k$vxkQ z?soyhN3{F(z^`SZbH`Y*A^4O<-#$3z6?_j z&-Nv$b#gczZJ`8R4delbo3UjiqIBB|9In)lW9B8I{_qrUJq=FViNj+(6QHhF?aQTv z%O6xpwHC+oDu_Bn^6kEwuGM;RUMQ|;nw}<1Hk~E8z51d>fed-;a z*qstya_<7!TlaEw%!Kw;pr#DXBUg%Q_?lRIWc`%I;NAdO3XoeRm90i|9pEuMTX+`| zdA<0Qoxm1;=n7T9DyVV;7o5fMI70MbhP;h5eB02KWK8-aGtSW!@-1mK|>!52xCBFNEZBWziYFB-OyAN5RDej;|wZMcR$1<4^Hq zcZ{Ns_lO@nbR~OBJpWLHZL$MLpJ#J6VNe}`<4Gk`?giDy=@BqH#|FuY8YxG!lF=kZ zN5Mdis(VG?A zT3e>N^AYz0VS%D1fDE)JXtbDj?$^mm-f-4W?7#c}Bkt%C%yb3yQT`7FrK9hlSJO6=OYZkD0W2F3VuMnn@26Z zY4z$Qjmw%s4L7c;Z(Opv-u;SLgCXVOxnq+8n?P;`$ZVFWfRN@b0E3AOzOkbChbz22 ON~X9{gnn4gCj1}G-qM!< delta 5501 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 Jd&}}l{~w!&Of>)i diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-310.pyc index 96c487a8e490ff8ba23a913c7e73d26e6230f9cd..8211a2075c5dda07cd66037099deedfca68577ad 100644 GIT binary patch delta 145 zcmV;C0B--LhXJC80S#{r4GI7N004EvA7f&%4YdIQzLUcNO|udLy%Yfsv(OgH0|BkG zoEo760noEP9zX~I=d*t%W&{Bsv*s$^0|7j<#V)D?0aUYaGVlihZL?uI5CQ?ZvvNGK z0|CmjBtS|50rit_LF*hc0000800aR91quQP9S8^r4G0Mc3~uPO#%r6vk(Hk6af#j&KAo9 z0j{%}8leLL(X%`rKnMZovwbFJ1OXwlmD=!000O81OWsE3IYfn2nYxb2nh%b2owSn3jYcnvvfi( E0UwenPyhe` diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc index c3e8aa59e38038b6542aee6902812cb39c7649ef..0cfa7af1cc97e92fa4f1754c18de373dbb312b7c 100644 GIT binary patch delta 416 zcmX9&&r1SP5Z-xi8y0F&X)LLyGSPpa=ujdN9>Q2l&2+6^7!pdGMF%yqgNN8)eb}K} z&?zyHy>+Z({RLj5b6umLc3yKBz8^E+%x8zZb%?X=zN>s^wUvUGG zXe$;6$y|$N!q7LnC%r*=9Rxw!z@}SyS`v{LQHq_`y^uDq>-V-173D>gAO5{~L!QW? zxQcuqTar8GS>rPtz2@zjunz9h8lv1s9S|X^tmPM6?E-acxUMCiI zYN2Fx z^W{mx%LbW~xr&qxF?Z2qOwzQ^;}gp}BuAno139us^WY_st~1D(_7pKUFet(q&Cy$x z(J}xr-uxZVU`{78Uj8|^Xt6*O*g*NtIyo%ajotaN5eOT1C)LL8AP}OhAQZ(BZ55dV zS%@E;J7CQyoZp+Kw(xrzzaOQBBS$uX@Fc)(*2a)WP+CB?ix84vWG+6GQ5hm#@)Wvi z=A@R&CJseYZ4;djxW6vge_oW|T)JSxc)lDqcZYCAmX)=)ag>F^T-7I3^l3@%*T*5o z^ZGt8Uf25|&Ra?|ZBZfC;7}{zg*6$(h)~|O(Bvw35dQ=F4|rbfQU3zzx$^=#!+hR%zRV2oXY6S$gNitf&g-9O4Cm+eT~d>yHmJOJ{sn ztn985I{MAt#?Z{2F)z#s46VW%-xG|KU0?yZ+qGzBW?~S% zDg7yfDNSOSM0Y{ekpzftlhy;KZNl1(79-y~R!a}GK^jKBkiE^_2{#N0<5*&>n? F;2ljbY%l-- delta 395 zcmX|*ze~eF6oB(C>E%pwNo;Ghh;-5Zpi?cl2rf=8btr;XEtFn66s3}85mQuJ2i?l8 z4)qUE5dRdnilc+hjt;&H=zF~HeeWH2++*P_&-*i=RDpag(m0?$!a0=s4(yCp&sed=O56NKYWjT>ay;Xe-Hk_dKQt=`J*YYWq_m_e#_1qz1MuJXopr#}Fm1-tiN`*pK?x)MeRaApA#z3V_ UJg|Whi!j0x9%UOeM{st?FGy`p^#A|> diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc index 745582a6d641c434ec4e0f594484623c56b7e11a..ef5bce595b1f7aea8c282c62042c80f89b4ecedf 100644 GIT binary patch delta 6404 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc index c515c1c6624563d2d78a4c1c9841099b3ae8f1b7..97decb74edc88e4ce31dda8b87f6ecd4ae059f2b 100644 GIT binary patch delta 20 acmbOmHaCnrpO=@50SHPD%Wvcs(gpxH76jD* delta 20 acmbOmHaCnrpO=@50SKzqB{y;lX#)T>dIUKD diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc index 56ed77e1b7802d7e5497e4be3eda52b5d1d7640e..0acbe48ab48491e6a9d3e0fa424cbc4eceabc4eb 100644 GIT binary patch delta 3311 zcmZuzU2Gf25xzYh$s>9Ektm7!|FdPAvg5jT)5xyjB2i>jssCcRaC~TcrFBc`Y~GRH zJ6fiCj1t&MkcR+CHbC2_oDigK(mxbxiy%eYhoVTIYNS9PazzppXdes&Nl?H@^Wt`9 zPqJm#B=~W5c6MfVc4l@zJNwDGTs@mjOYmv_ab)2)M_o{5#W2ZeqgGj

m;aIpsLpi&8~?J=LArqKvQQ@vMZ896>|0eET;_1HQXgyt6BW5%=N?!Djnc2X#4wbuVVwq+-l=JZGbe_ zZ)$Rk^z;AZmv*4DYyxe>YSdwSkW#^2uUcnzIl1ZUvxVa$TlAn*&N$z+Y9{({zTzxC zz5ee)K_&w{R(x|`5w*rqDi2;ZTHaFKiNu+PQ#k}-`pZa7@%M{6b{<9&9boea9SFw| zdI7=&br$L-W#{;0*WTl}#ZVP2%UNV+Q0yS`lGM4>tb3H93t@7@xveokzGf^^Z`1Q& z{q?RvGK^<7=dy z@iXju0W#H3DUsct-A%+M1U$lfGuEFUakzpAPbV){m{pL~;^1GL!r}rP8Xo zOo)WvbMW(1L19g5=X}+dOOl@}N$r?V9+kcowDVxIBk1&{3q?P_CbtWIf_)%(U4CJW zd{b_Bv^)LIpc{*pz36we3uf9c^hoW(N(xr>1SP)^**_~eOp(0a*84}#Lb)^FG*{}{n*Td`gm1FuQyzPy|G&$JmTIGZWds-VE$6`ZU_=DX2zH~b#nS^ zHxeMSk})77EXOeRHdZIluE@3MsirV8V7BucqU9lQCSBaWZvflJW5Qq~J@Y}57=-zV58p3nA;cIikt(Q-hzYDxV)XLR9|pz^@MtqA%o$ z6=lMma2bIS8vOiHkVGD=4a9S~0A! zP;n`}$V9|2MC_{og(eijt2iLlFkQ8n>lwoMuTV-{HWtptMa_vw zMllN{Y2-eUTc|f$8kj2);{>mis;_jG>sTKa&_+wMJfc*jB_6-%4 z=zSJE2}$e9Agal1n76jQUBaARNpB=D+)K;#DrfM5vs%JU7g5J{AnOS*==E*aZLQ_U&EwIQ9%Ed3JqpqAs6$ z6G*rv@uA6nkMIj*M6aSS>o(|uRkao>o&_yS za6-IT&LI_*CNE5uR$Dms5k%ts2q{soxOWi+cyzIPgEFrbC49oA9=u|rDiT$_14S{8 z4EM_ZhHz&qf+``e4`3F4?jZnGf_JdOe>gcbd`Okk8MPoENE0QNCc`mRNf&cPAz$9c z|1nuy#g|PeGs^x1MD!GU4p~WP%Gj@>t0J*bx8Zdw-gly~SQ3R&j7F{9-N>G%XVq8= zHHotpwXfk2b51+~!xS{cWA(*F*yuZwv{ModAdExxSq&DV)+8E3)9bkCJ%nEV-0rbM ixXt_RKU5Ffb+cKcN3eOjy8yI=3b(-KSK}Y-?)x7qB`QDw delta 3149 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 delta 4356 zcmai13v?9a6`p@)b~4$`V@XIt!YfcBS&(NA^0GyQV0oAT30k6b2s@j1vdO<6k`)-fdTXC9IftW) zgyHQ%3x2hFl_uD8Fltr`lr>qdhy$ZxvjRLSU;e|`=oG=J#4L#FUi z;el(Wvm~La{I|Yu?RAF$DL=ILuQTNv3_e;nC`m+&CD>1H;)(k;I9tZC9=N|{6zd6B zw>+w_tKl~{+{<8bO)M*bl#LS_tY}kdlzo$eQkk6(v!cr!A-PJyzcC>hX>5?;N*q4% zL6V)MXR57QP%^Zt8CG;hA3{4>NU?PEWowlA+@PXLWeJEU=3=5o0$KBif=WkU;RpS7 z%1kPiLTa#q!q%XwBd8cjL8UBN1khR;lPnuLj56g$h1Vb|2USzQS3(_3s)&_JL3JP7 zi0K)a40`E8n!*nU60Ls7X&tGZ5?M83C@Za_zZp#u1%6mEr94TMtO0cg8<<4D!eF2! zl@02|z(N|_iTG;CFO*2mqZ&gHh7aFvLaPE8~C)Yr$+VL(H(cFcwc++^64jVR2Z{W??S`h^; z`B*%?NbHR4h55$9>;;QvFU+19i56l`ZccW@;pc_bhR^FR_gE3V+*4;1l~#Ce#use- z{DrysxifO-^~TELqsU{Fx7xyle0&^9@fF@eQzT}%OA1R_6-;l-0AJheSQ~#IQ{j`T zhepHsw$bUcP)=qsOk+B;%bKh+O^#zSQ}Nf{6Jy)5ISG3_dGj;}rOsy&nF~udzt``U z>{5EY-UMKJRWdshHn%(>YrPQM*gAoog$YmmnLP-D+WWJ6U`qQKb_vSb7e+lu9v8?^ zQ1;9qz#BU2;S-d>(80(CUIdhTDsMIIm zS0Rq^0+{~ffN6X&F5vELz)eSy0maQ6fK;>9~emN59-aAP^_K+{%M5C9Ohn z4)Jc}za`CO1iCT$rU8?PjmK?p4{@}!uABWZ2|jx=LzXm1+~10UZqB%-cZ z$48Zr98yB6#YD}MEIEiZFT*oyl|#0mEsv_N^1)(Usiu-Dl`DKiP{HY73o=XVhziP` ztO#ukl{8H?RqC~K*>d>9n3Rk0Nm-N}O?Xa8xb#SDvBwhcIu^Xh8;PcOTCkkz%xPP2 zXnR&a?e^hCSV=_oltk1O6UI)4i${{cw!=A4#hv*Q(5VyOpg5*#eZSL~liBf91F3ND zt~8jrW01^61(T>oH*OugWM?rd_s}WI+=Qb$vW6B>@b#3UDst#8Z7rcxT3#&9OY4I{ zc_|FunF&*8#In_}XlF))C7UvKZMvldvHwM{s?@7@RB^@M+Wj+!)*B#a5URtUq(#7EFlH?JbqmV@993aXmMi3S? zfvHh_|EXbdWoEx&msJM$>>3i~BU7ulGpRsMs>yN!YvF1;R&*ik*>xmOWF=0%1lJ+*ZDdT^R?D^7_d!; z#rsP7QEa}43f6*LMDufsgE?H@mx-S!d4DT=9NP8|W1Hal{aLm)Qisp?&&0bneH@ZD zB2Y<@@WCDG^zLjF#qvG#3$_KO9(aH?hZ_%EV{8NXyOywSc&}^dn4M^bpK#{onH2jZ z61?RR+WTgYB6Ktn!q&rGhw|7i2pk$Yc{}NdWg=*lM_L_(?zpuiEEnOzZYtM9$OOj0 zs;=Q+J6yb|ozz6A+fhijgSLTd(lE&t)!TOq=se~S=_c|tSsp@-NECip3N4FcgNko= zJDfc{A@#Or0g5bkqfHCMAK96*3ppGhLTLj!>2gG)zKu=Y5?z;^6%)InP95;KaO z4u5y7oM~MI9fZo`>DWdaj}M5M)2lDz@!yX{e`6#A4WSwk$iMpyXth;}S(YL$O|lXHL#=ydqd4KZmbRHfcg`hx!+X zvX`Or#UboQxckNajGciir_%8MjenfF5C5T@dU~LZZtjy|$?5Fmvt-^)L`?Aml(b#s z*#9)5UsGN&2MBW%Lu#I9`sqhYzPz{y?5zf|=(tSRRy}ep>Hri{VEzn$y7KG|TuF87C5_9_6Qqh%VG*QisH z;qwde>^tbW@cM+239h(kyPUwZs05Y}r8$u%>B&xqGtQanOmt4vM?2&71-ho|@b8C_OB{k$bHl085hwSpWb4 delta 22 ccmdlnmvP5jM(%uGUM>b8s8*NU$i3DN07v%)y#N3J diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc index 133510be708760cdb25cc444e7b4f2c08ae54475..2cacba699fa2f17906833118acace34d42559625 100644 GIT binary patch delta 9131 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py deleted file mode 100644 index f7dbf4c..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Modules copied from Python 3 standard libraries, for internal use only. - -Individual classes and functions are found in d2._backport.misc. Intended -usage is to always import things missing from 3.1 from that module: the -built-in/stdlib objects will be used if found. -""" diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 1643f9fa7d2a26fa8948fbef5596c43517458e90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484 zcmYjO!Ab)`44rzhtn}i|TW(UYyQnu25%f|}5yXou46{44ZFF{KnPgjwU*s=&^)Eb` zwI~J>UNT8|FB2z|Oo_c69@P6Ir9Ow`ze!D9iqlwvRZq%}9@KQl?8(Dzw7qu(b?net zXi{w9e#6Tc;1q~WuqIjXSS6Ft(GfH;0S0y{7!N%;h{132ESm?5E3~~-Yj22Trwl{W zhng`4$&!=dUTPS?p5(eR^-C8M=Pgp51I%S>u+C;ZnS}!+;0VUA&4vKmp%ZwCVL>1R zBw)+-G(X+~UK)n>N6(pbx~%Ha^9(~lY()XY>e zwbt({?Z~ly!dH8BRz8wTR6cOR*Yet}O5&K>D&fLdr)lXDHcd&@FS^01BxE=1M5L&p ovcs;>D-jq|VUbt}6@Movw8ns}b>3}0#^+lR7sJ2NKx3@F0f7>mO8@`> diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-310.pyc deleted file mode 100644 index 9631a12788682cd5a20ec5cba2010d6679c2e9e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1106 zcmZWn-D(su6iza;JF`DsEcFNJ%_52pX!lm6h+4f6WIG_9=>krGJy-gHGJpMT~4Ci0RJWE@L{Z3x1uw+H!=V z-hA*PrSB`LjP8%6>Wh+zL&2tL-luu0HP`*LWc~59q(;b6Z~OpgXc&2Rm8Nu`Cu1dx zM9Zn7+=evG^EAtW8*5%t$#{enfq)(A=+%MVAt!Ia)z^V6u<{wM8jO4-3$!4&&^C&^ zp~ci<`4!kWsAkDnK;{PH*>qw(er!|#p*8s_ww{dMX|D8W+bD57ddUw*+DKJoN=#D5 z6TQ!s7>`FfyW-x6Y@~(Zk1A+DI^lX$iE5A>@{&n4U_zT*WP>DIwr5ZXO*g7p4QJIA z?gQ!K@DgBzZMd~WPcc}oj^iEP8mn6$gBHl(6PQedhY_)Dp+%`pT2ih$V24be%nts5 zQ!Yxm9P4nkYg`-G@_!GxlIn*Z19SC|3Kr1LS|TSztu4@*XZ*9qIXcInZ!&Da;{+ds zH-Ub_5gE?c`EkXm>1Q(o8vuKuje6KGrRm?(QA>3py=~M+>w(EOFQ*N{Oxqh1ZrrSZ zH@v7VqMX>)&aC3El#fRp~k?I7KOt9wA&*vD<$!#)Xd^FldW zgms4U7Xco+zq%XtwjZaEo4-Q1{QahVbHLNgXQl93Z#)g}PWYe5Kb+gtFfcT9NDhvtnuHi1!OD;$=1P(qzev!a& GPWu~>{t0pb diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-310.pyc deleted file mode 100644 index cb37d43ebba8e662153c5fd243f3264e713c4d0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21543 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-310.pyc deleted file mode 100644 index d490845a5b94d06d87ccc191e4e3f1b37204638e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15898 zcmdUWYj7J^mR`TmXn-IHQqZ z+YL&D0k3Q5+06XN&LrO2*(6m7Ig`x9c~y3QZDo`ENM)1Rs=Sk}q&oSRtyHOM^COvL zHtS?o`Odij2uhkw@-vih``+94ea}7jobQ~j_V=eX{C#p_f9XFhY1)6JMDL%2#2fg9 zziMcj(B?Fu3!|*h>HIY241St(CO@q?3s1A0SheTu)#O}K*BUmzaps)&wMxIG`Kk30 zU88@TpPqB>Xchf|wx|i~2l`x}NC^9LZ7$YHV3z~ z4W#gXNF-Mb=?TZriIgzDW$f2BcWr5Fn)Ik7>JR%l-`+BIly8VM%J=Ok-{>um8s?4~ zUx*B9^zW$g#j|RNtQf!ycKf?Gw7ESZ=j|1PVhB0=d}nk2mNs|5H#eUXyD*!BVp#0P zn?qs`=6hHeVlRz}%)jZ|At;z!N#o^X!fy_XV_dteZNH)YpXJoe;*{N%5RG zh#vCdkT{IzDRD%&c%Bx|i=%j+5if{ic#eqU;%j&o#H2VOPJXV>ofUa;3OO%|)8Y)C zFNqOR!1EkRoE0yk#Ch?OIES1I;=H(k=gZ<{aS_jp{>X-gxm;Q>#Vg`fl)TiFb6LEG zoL9sZaTR4>71zY;cwQE7h*3OW6K{$!JgZt(*wmQnj)WEY_tL1=WfhR2HgomE(m+MBY<*BerXv z6oHH#>3ijx7cJ%c;@yjWR8)0~OT~qt>{q;1KhE}KuX!>a*qIJhy;X0;rz+d^94bdm zs}?9$qz1z{)p--f8IG2{h{hNXaf+u=T=Qj!;m0}33rkD>s^6}j#n?l?JJOO)lWPA_ zoQ~}ne&JCBjYOn1aa`WlW;9ES^!1!NfKAQT?jY}h_N9&mktWK<$y+lMQdVVNk1ZPS zmzo?x{#TW;%k%Gs7|{GoB!h?ZlGs|V29>zKIDPxp*C)nii*Jt3 zOkmNCg$ggY3U*PAfgmi_6h-h{E+doI!qNBXHdewi0ZnwfAu&SopVL>RQElNej7Wy2@Ifhc2ecUeKnlI&g+3sYO=cQm!f-K z=(o-mX2Bj(Mf6EDDdLp$!)jfE@yNp%SL_t|XcmjHEyG$lh+>O|AE&&q7)GeFiXt;( zZ%^Eum_ZRVu~4Jkzcc&xt*PRh?@rzrkIm4J@;0|Om+Kr0@DDycaT0um)??10Q7{eZ zVQeeD@FdOTihd=mOR$LcfX6Y&kVa}589j#sM8}AJ2SGlLo~1m)`l&oei=3JN>1xy3(ul4= z3kQj+gpM2g@cq3_I%`AoM$2j?P%qImL05)6ecwgOrc^V*6yl<+wwa`Mxi7Sbn#WpZ zMj3+O1$N`JMw z29DmYXo;W{f%e}UyoLKY9bzfeg5_FA7 z;$2d4wI`-=2XDet2y7-x+i*aZ;PW8S48ojl{5)-CtgN0fhU|UB_5M)4gW?V6cv#^7 zk7%13369G{6t|9t$HNlsVCRpDSoqQNr~42v&46k^GvM}{dXqRkWQ)An`0dGx8!h=R zj&D#|bnnu2c=wFk-WiA+D>!3rIau-CPeQPkLbQZ(E%!kXEm6g^i@#D;f>YG06+vzA za<~h!y2>rDdNubh?_Lp95Z*1Mxz6MQy_LQjgl?t!tR~L5W#3!#xe*?RTd$Osyvm|4 z3aZ=QL)%Nj;VYQ*pFqNTq%RvF>b>-QlC0&+sGK+DB|PL_1aZ=@tOXL3L(PJk)7!Jz zCTHIN@1Q`KLC_)OG!gURB4{a$c>2#Eza- zhP2TcJCl^R5!pco31raQG5o?85zvY-lhQYJW-k3;8fMD^6Qb1^ypJmn7o>SbyYCRY zkOQcMd&XMv*F*U_B@%I8KS1tN6QP@)Cvq2&fH%*wPJc!@#|3Y?`2M;<^Xa^df6H zA#_aeC}Q?zlJ0ff@Dz8V6sD|ifS=(^(8PB&>0B5jJ16);mAlblKFy<&Gzxi|0$L5G z4*4p@Sn5eDo>hkg89Nn-jdYlJU-Ak05{ktZoq*WHVUh1swO_PC%=)P8UqGpln2H59 zVSz~u8FZiRLtK80>>cYw=e=|8yHm<8Gmr_Iz{>G9Fo(XaGRV_Rvou`N9L0Q$m!n#uLs zqcfW;p%!c!h8t@c4k4^N$gxNJcb|(kuq)Na3C!`ZKQFZ zQ;gyn-F|GD6qEN+aK};IgNzh@OxHsu(UTG`)delUkRbR`9>hLyXkA!fcDsq$;g`VA zjtts5f|5k?Pn+M(w35vv3!wm^gtbFud9hbzX_C5fqm^o=paMBtdN_`ly`_m1XmR5H zC8$QpW(vKgn`ybxOm8|OE&8?$Fw?$PrkSC#{7i|ANP+tMMSrs&>~*o3fymhhCVHu1 zN9kq;G@St;HVA#ZZ~fD@KAzd6di`5QGeKqVp!5R`H92+vQiL`(`w94JWkt3%5M`U$ z4P6YZSb#;!(Ez0|{(siWp|2cNxyO91D^rTWKa|UGwkoU7@4y!f={&3nYP0hEpt2u;Ge%KtuIES$Z++J(A zIVddT?B3G2{at8rcrWIPl^$NxP~#A4VE$O^@AFy@VkU!F>m051_w@Di?bRNn-9ld| z2?#QQm8O{^)y!`0Y35kfXwQhpv13jtV zPf4qdqbEP~MjE3db04*zFOIxg{OELkK0I|5zmtVi`NpC7WAi6ZeuzRS`ceDIX|pQk8`B*!Btd3cu1{h&Abg z11V-|96R=vek^as_Sp3sqi@ZC<&LX}Gd4ZVF;??tugB)}oua&fn)w5b>*QiMVv=cOH~bCj|~wSq}ksu4%@g*c&RiNWH9z8dS5 zSYL~+XtlN`U!xHZO72N?`v{eELSj;!Sg6)9a*Gt#IN>cs1O`2I_Y43bAuzN9zy2Po zhJO)3Iz=i5Pz}CxNIE?D*fIA&nS?0AQgsGOW?DCJ9cA=k!}w#zGCs?gmYqe8qYtAT zl_Ye;(QT40xqKGNr)^{)3=NqX(>8LDIjJPILpX|oUZ`wVw;pE@gA)6hlRzK8o4ZUs zS)ZkG^~oP#h$Z~Ge}WjuyoIF2CFWQx?VO+p}b(n_NQ1R`U@kb8s~B_n&;Supl! zEv*7P5}2hbn-Yl)pn0ePq%v?^nt0htmEoorm1tOQZum4k-D1XdY&CjRWz0Atp0ek0rsRq0OOnwk8-g#<`oP@z!> zD!2&((YBm0tMWICL0O&WZ5%xv0#$-|Kmng_mK;#76leD530GYC)#JV4wtKnkow8>;i z{u&j2LS^ZL#2UcJLU8YUL@cDc*`|S$NT)WBAh8cS;iHLgE+7e7RS|zqfJR7&%rZ=XBzLQ41_rnNjEJzzstbW zp;JR`L8*RHP#UNIueWb%R{j-?1b5Kno8uERvw*g-S?XZM={F~*+WGPYDwUd?8oTlC z_{8*`h6SUFh>e+Bi1`n(v=bjp#L4#IjBV5$pS(Q)gvMr$x7`Ln>C;|t5U6~4WoNABofG+hbMync{CmjSp%c)c zx;o~cM*>p64yoT(5C?Pt(h3;BW39kU5u#&28n>EOcmOF#O_1IRVAcUPC!kFxVE!OO z2TAXCD+yUK(ZtrYk~pi7LL+g-OdecxUSmT(jjvW=ACWX zOi^xO>HlZhY^rhe1pzBc#dle}+97$J&buU=r5j&6`{AjN+!t_N`wP!5hxcdGv)ghN z%S`#CY+^TM3jrHqSuBzply`}OZ&C2e2=We0V>QJiQffRTayZ;0V)ECi>i+HE4VRIP zyLyQ3Uj|?X5aZJhvIGQDNk$2T7Vd8F48EuF790T94xIl)WM^h4I%H3OgJ{!##uS z!YQ&JFa9Qtl#rC1!Re>QXX4!$erz4>zy=tZ(Kz)dkBr2k&bT^I8DW`mQt3dw=+5?- z2&MSV&Y04sr1Wfw2GRMWc=rl9ibUI7X2>*M37urLtRNM!>l zbhI~*+!-LVm&>j){k65dyLVOc?p@O7Xt{S5<5e$^b_e;~g;1~-2w$+S_8=&iSzD9a zf+CI>fq?BkSahH^OVFR7;<+94Na=6DaL-|K47O_^o6cnxD}+Re7O(S1@$OKkP0YOS(I)FOXxl$?*Sa z*?4vGI*$o-%O|ZnE%}cyuqWq4Q~8|^ZR8Ss5KEnz(37q`Dnz0+dsmTkQ6~W7e4u%B zwg8=y+(42Bo`Aeq*0AtQP+HjgDNOE%u!=m$99$>Wu0yg196w0*fEWy^193T(nPDqneFMXBYq$O6oHC+Y*K0&d`(0l;6gQKp?^FZYYwN+Uqn~{Mkg!s)ZR`gW zc0deo>9l^}#t;U??iEe`2eAj>**<`WfT&P189ldoQ0x`^n#nD*o!Z|?HL;o`4BY<* zmG{K~^nHk-C!J#A0BSqj+TLH(S~Ds30l0FYW&oOOxAh1d>oEMa006d9=>3Q|2(Zy$ z$WCX-?mU1mR~#b9j_3P)vu_KaQ+S?x8+xL*!%vPDK$6=e3VVBzU`n!~_qF-~H65j% zoBdmCUq`9S%?ue3aH5WQ>mcIy$)X8MWC!61$qGtR1DFb)VxGHNFD<#@Dmbbyfn`N)&cKs?){F^xp}8`I zMy%G0Ft3ofC0lmO)#?f{?Rt&-_B}M;X$MSMO?!ub+V-5ffSqEjQ}9w#E-ZZ{T5tQa ztZzGq)w*%`VBsod!HS`)IM?&8QWe!m*1&BP_D_gDJYKeaT$FCUh61n?k!5ertcK^< zdekt_6)r;7Y8x(q1hD6fTtX>%1i>TXWVi*^sapEY(U}Q_mC1*ckpc|RPX9He8~r1M zQq6~_=O3J&2j1p3aw7p$Qdz~#^x?;D>Z4P0snOeGZ!2((+Gq@ROQ7D#`I*ys79|_I zd-IWfaz1Px%jaJJP&IaI>iXnc*C#(fHWZ(+PO7g*&yhbyKMZ5AGQ-Oe zXGei%1o!HZg58w*!|b1Q6xJEzWZQParVREis+ep*}N=Lp!N+`ZgCCGLoS19-n1tb&$sAM;%*oJffXfL0YbhD_vHL1sc zj^tc+#RsBW?h;D>s<&K~og^Dsfv^$QLk6tU67LmD&~s)eR>&Y*ZliHK)i^fw{!_Z! zzKwp;eL%=8rMeBbRXEbVq0j+QOXCe8U}=kxILMbq7Wcc7v4M*{&H+U;9uFmQC=ClP z$~XzfBHbO5`5$GnRM$yRYe3X86t?wt&a)w(6HW(&&)`u#rN5gP;TV1_;F9nK4-dBJ zL00&pEh`Wk;Bz7j8-1Rm!tEiTj#7 zxDu#U5H^%*NFaz`5DwR;R>%yUS~0`X$iZEl-Y~-PcKh09YD=3>kiQqH+$}g&Y@)?Y z7}4Mh2tTlCAx6fYK;t<~b zEpZrqC!6+y*?oJ2Yr1&*yTXNxk=g7Q&trYbkeF?fFC`fae}db40PAO0V(w4XI?6K2 z52GBQ#lB|W=Ad{1hs7(++ya1J_F{F!tNiv0P~;JDndkFo#cL>;YdYcz z&*O(Z@3zEMyfef#NOZ4b-)&GG?|c3Y@2}%%b=3{vqKZvG7=U6`iGqc|S9;jfIujrD zS(0qF3X2A(aez15O$bxodS@b|?OHAKXN@pALI}=&iz^65TAcWnwIek_<0%1=od(Ao>^y zUVi1`&K!Jpu;jTXUstRj1;Z*P6NDp>wnoBwC!c7k_LUc7J*7TQi7tk3Ap@rxI*t1F)S@Rf_jixU>mX%bry)K`0poG*M$C28Bx}YPI0Iq?X!iwUamtbSJ!grp6G2AH!;@MWtp~NyEONckMJSD z43KqJ*%p1EY8=Fo6D^Hd&GF|O3F^s|yAWce=<#Cq{7ePrqpUC3ou_=k*yQZK_VR&A_u(h1o_%o6$|!ZYS9+TPgof`{bHiu&+peMDja?8fVh z7)8VWa9$KXI?V!iyzl1d*sYllioo@6+`4mfVrsTHJ9_)AiP_o4i)UxpvU9fW6?As2 zD*YK>t_5&ZZ@+s_eN}=*2d8OVy#jZ{Yty(=>!s*j2>9>8CJg+(UFynNdJPl&6~*AL z0q%W0f8}gD#lk-e;<3Hzm8v0D;H4J}7YdC8%lIr)#^!<-Z43P@yp!u>aQ>Bxv01B? zAoToqo~v`7;Xs5W$>+M?19*~@Zy_~o*yfO# zv&dMKGcp#m2IRZC^%+vYuF3kYP<^Uld^V)pNkaH7%iubeY5d$s*l5XqJPgbHVcj;- zE_(=MVOX{vTMp?hXbHMX8s(n+v9;iF+RRwcVm^Z-n`uM$09r}oFX6Z2kIw%Xe(c3b zc#3ix)|INcE!T65p-{r%|7S2M?5;Z!hiUSJ$U;7VW1kjI6tO&63TlJn?=eW z9GvlK+SAKO=aJ`oo98Rop}9R9fTWSJ(U}{dQu^qm^Nv1Ef$Id!u5AZs{#XS$FvF@G zQej{}KQ$ge@%GkTx~O{P6x<^U&Vryq2s}*Y+3B|D;so4Zf{KlmVtZ;9 zCY&tD7k-vF67Wru}_+$hOv%lm@UJ9ml`0Qls#b;!1C`X$;#~?Q;gZxL5i_8 z>o~>EA&3WVdk=b>R(1ul7OL+8-l159g5RTn5uCq6F-BL2t;v5)!A~goHx&FU1aZ1Z zuE6}s9s8gw4|Z}Imv<@fD7a6-4=6}d@Ea5`=tIao+sD`l#a17+JEU~0Eus_Jvx`L4 zyb1CIy?E9JI#-m>#x)exLfR24p}v5j4*(Qkg707+18Nztlf!z(I&2K-hrzVy=a?{? z&=)g91hWi1KZMgn6hN*|j_Kqa$LV)cPBMMSS#$cFgXx@e#K|~`A$zFbakO7Tt0{yp N;F(PK!RhJo{|5KHsz?9; diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-310.pyc deleted file mode 100644 index 21ee7b75c2eb2c9ea0911956c85f1d437f43b4a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62481 zcmcG%34B~fe&5-5HyQ^)5IjUuVv8b0LL$LKH%A949ug%A)R5HGqZzP)YJd%b4e)h? zB--Fu5odf&W-`ggPR5?G19~TpXV;129M0uU;+=TCNj_PBl1;o$dy_cv?rgZZoJ=;h z70+*wMq zzuL>GSj@#-d^UC^UW~_MJu#OkCS0rHg5oDP~-@n59&1HdoBqv8UK$$9yqw z$KGPE9s7!XcI+?q+i{>cV8?aEbq!x~usCQr>x=8(idFklvGUO3EAg2Axm+q%94xMX zCsvJLkCiu+ho=(7jg4%1V|mk5{Ha)RBTw}3#OB3u|Aa3&9dkWD9WQPv=VtD6vHM~! ze>oP++gr94w^dViwyn6WylrNC@qX7^e8BY;ca(Ry{^3}$;0B5hx^=~!Zm{?ezg=#9 zakm>PK1{hiZbNae8!nExjm1aYrsAV+b8(;BQrz$ED~`IY#RG0z@u1sYJml^#9(E5D zA9Fj3kGoj$30EjS=^iXTRerMgbot@(p7P%ENO@m*e|fb0Ncqw7f%3ufp{c&&Gj?y3 z^HlLjn42tq!tE?RTYkIofx=+%t2* zJ$^0r<#>>CPZZy%rpmeHH*d#^Z@4GjQ=f|!-*Qj8XE?s?j<`>7e8(LwKRuOj&${P6 z7cUmw^X>(5Kjps99d*aZdAIzcdvPjJKJJc_o^U5fPr8$&r`##hm)uKJiK$HaRrfN- zc=?PwZO7NjFTWUbuTbJ;_bTaY?hN_K@>p2zY*_B~^69YLX)E`7SniWyxpQH;^W|44 z_Zl_5;>JkN`*KtH;-}qN_d0F<%u6x%Nq6pZF?X&!ek)nL$n|-5f$Iz9i(Hque#5=V z^_zA*!S!42ZLZ(8>q)NPaYe3+cI~+SlzW%!ckQ~&^{3ruxc*GJOnp;akGqRpU$pCK zu1ju$>j}HQ#Py_eTsyn2a9ws&Tu<5c4A;}{64#f?m#J@->x!Gz8=IUJ6?KteZ#Kn zZqYU9$A$9t;#G3>2L8V$BpIWF+)+=+>Mt;}1^0i8h(_M}9 z!O>?%4=(Jad51Vj~qNyc=X`mg9i(HPX(2I1@cdoC#={=VOQgYU8miVLcJ7BRc6bh z^NWS2pMK)$C%bBS!q-wPTqy;U`%6{&Vsy5AWnv+iF6>%(oaU)zrE7DAu}b+$d9fVq z)7flCi}w}IRVFW$0#~>&cfDFGSKa8?NUE8=Pzp}*UOPEmotkUrE4A^kG0hxzPX@tU za3{$-z8xot-H9bghB>R{Nc7&IQ0Tab9Xxo)so+;h?3sg>9)O@LashOLtR4?0Es#a-~o9Qd{%9V06xlnP< z`p-mC1Q8fXLl$O8%Z=1)p{{8S#G2k>Qnol zo>Xr1r*r*|^Q-M8S>nx0iKXQ2#7)j!d@26<#C@@)cs;%pyA|IOt0#tIn_~cWqVe?c zx$3oYP%o4UwK~8(U8v7-UR{`--Cr*US1MJ&)D*ZQuZepf9Ss%?8_!}EZHZ$ew zNkIWd?HjS+X`1)J?C~S-zELX&wRg|+&KvKZ zC|`TGR-X&5Oaztbk}HqbE|r7I)YQARiRkQ1W#ZjhrC#1YUz)sJnl9Jgov+Lv7{3N= z&IJctrBPv2q2S+%WOp-)@T|M{+x#~d| zza77sTuQpc+HDPX6m8a%1wDUxP<-a5}G&nPEZt=Il0CpNe8$y~gTf58jnObY6wKYgfPbev!9 zvm^qE`(kxCqFZr3ZD(Vk9EGXf}=+d_IG_UXZ!iKV#9yc)Yn_tdjX0HMomhI6?Emvb|Ib)V`R>1iBj z16_6D$^^4#3IybQ2hA_mFU?hfK-~!YNuLvFT$pvW$x5Y}Q8!N3oAHCeDA|pHO7&W4 zw&Dtx%D_($Y$KBipPalDG?Sog>y>8y&C={b*^pFo=(K<0WqZKqrGrv+x*QzVi;{DJ z8%f$AG~?A~ys}2`SALa}wJjur=|p@>JeBMF{aie8HLgy~5iCu5i6!GKf$CAY*j#NhOHR1@)7b)8H3yrtMwVw1o!eVd8AIVR9NPY>4t z&)TDmUZ(YIIyg{I`jOIDQ`Zai)Nr)w8##sh;!C+9(d(Of4ms zd(u!jlD5`>g>7Kj$H^&DnlT$ z0ElE3s=^sU{-iy^WThY|Ey4__R0aAL)JM|6X}ffl=}H|GHU%~+)%_fNg*&T8zf!OM z2KlwEB!!->@zlC4-_FHzi7m-YVlX}!&odVp|F^ikYBu(eY2$y16Bnha|SV{bE1 zDCTy;a?<1=qxhW7%pyiT-YTD4Ri2SuRUU|1N=yk+tFq)e4oVsFF&(aGeZTnOR88^-BFxp~fJUYomo@latK9 zkQ}L6MptZ4p*FV=P-0(HM{Vv3Um|{M@A-vl0d}V_R(|`!NMW+|os*ZWMZW&Zbd`6h z`K>B^Bd^nn!bG{?pgZNDT&>ekbx}|*l=$fh+FrF@n^;g8YjM;LweeDA`ch$nud0>n zqlNQxh3h=mYDWF~T&ufl`w9!ynr{nDjw$H z(?9@Z_a=%dawnk0Nd_u-T{k~Tq6}KuTo=7&-1kDW-@hZgTnW{EYHoP1_HF8^Wk?S8 z90Z*OpW(C%m5Hdd_>Mo%1?WD0IT2(W;Kq4kff?T8X=%#S(%MD|;@pixL6f)R@z~W~ zm%5pP{3MoAw-WCrZl-T$>dB?Fp`uMUAtLZH_H-SzbSu7;0-ZfmPdiGy51DDzvv(=O z+mpdt_C!YS3!ljF#JSZ^s2wAj#?0}#`Ne`~SwcQ%DwtzN!0E#96l%ewFj;izY9Rx} zEI2(CJqL)7%~i|$3X`f#zyJhQ1UGZlI;S0&Z|p*_hrViTfORR%Ol)aVs?(1 z-Rud zsYFoGyI&*uAih5kK5NEZGd>wSZ>PNVdPqahH{&;&aY*)sE_^6@sGs3OVcKbMTs;Oi zu?=n_!Err6k%T72mXb&L0buvpumcq0N~)QwP_Je1qJdM&C6>W?x5a5B8Vc;z_OMmw5fR^@?09 zB@of+J)0QZJck)JEB*mb+vHPWRwH%aY+s!iqQ}$&FWfLbx#{#jlYqsNa+(7*n z3vQ`|u0FB_J?EHt{`C)^jC#dhyHM4n)Q}ntLax44K|k#gSK>LZ)edtOBQif_qtD_c@q zn3tTzq?iMo5ryZf$cI%;DjwQDTe)10=E{dQ><4Me`BuYp_0bLMVA&fFb_1~umzM!P z29W#^uY0rga$SAo%Lh+hnXfN)wqSdA*OYZXyx^KlySBfR$ARwH!vk&PHQdG=K2>vwj)zLTo?f%wo~_yVs)=^f5fU42vo zf>RV~Jkb5tZt?F!->AnYT5r_VN4>GR@%+L>t$cL>Lf-l1k9D`cY7YpD z4q=vjjIQ{@G^N~Xn66eeOnR)N{JwpVq#LihB#O(F!?eK>0p4XfW?atoaLl?qc)z#V zKYnKJ`kC^z^6V)nRpW=b+CQsH&xM5gox*uPxocuej0x8#i6i0jS`_g#9CEF&Ai9VQ zg-~VOOo?ZvkuN0DgD!oIHY+`5poWObmL_53Yrek8Bp($0>Ab}fXn^Xm8CZgu1i$2q zx=Nu4kADsJ01-BU8bYcJu>~rTIjg+ba#n(mOWsZ{#l~|^+O8B@mf#BY1yzz}?(F!B zr^k++d#Cb?^!i9oGci|F=D8DR$IiT?v$xLKS@!Js@pC7SU1)N0;oKWz$D7$prCO<8 z4}w3Uic+A!YBMo~zMz?^m1n1#DUr(Hx?W|Zu|*$6U@O&19qP$DYa-7n#KqKi6Uo$f z@~M1$INsRQHAth;16^Db52G>&xhB=Z2P3b~B*X*hW4{qcK^J_PJI(au>>M)gpWyr( z@!%^QRx~P*O!0kG`E9}1V7#%Ry9M_Ar0zw3I&X3Q16)L}hw*~L2&ByoUmuKf?q8np zFW;ez?ryO{pN(2D5N`~1w?J@s?*G1<(%_o6P_)!UizM_=N`tlrVbiTI;jI@gm+_9X+|SvBD` z#z*

LlOWgm=A6{G97^{TzGTfLq5g?*`p^j=gTX+u(+=ZuPnQ-6pr0vwpY5-N(HF zx7BUqxXx{4(mc@2j(bj^^cC8De700WoWE3(lpDYV6_DUd2;QzVk2(Mex_-S}u12(9 z$gnlvyO@Ir*AyXl<)|*Whx?ZW3M~#se%Rk+y%&US4j)#%bTAY`V+WZ`t9B!|L>yE9}!pXS>be5*Aoz+Y8s2i{!O~QrOCr9(q=Z5{Q zmY}-y^n;J*O@?jNGj=1WqLEn)5oiVgiT)&*>vx=A?L|gSy1a43XcNiTVFmy-qTx-U z(pEltU!OWEa(w^2ikZ+gos zAF|7vJFk7NuLB$!tNkQtc6p25YCYHcer%+_u?txeKt-p>Fh*k(f^jr-g$rY+n(;@1 z8a*%lNla)y)=W${8rvIKC?tL&Q)y_cbJP>@^G23X*)$G+u#Mzi#YXOH_Kw3-h_>=( z!x>0tety0l%-vXQ_D%y!fOCBjzWm440+FF+F3M|W!-tz$6htzBdCfr*pl@aj)g!Q~ ztJSQ+zD>|idx)icJM#w^5>NN86|&CiE8e^t%g>Ge*cKj>YJQo zFoopf8T1r6oh34yxBn#)(r(C9B2|4Rp<`ZU6Ybm_&!EIjWPUf3&sbfFcw;c^=Z`^= zchQQv*;!yq27sn`Z4fw47(_vxMWKx)NsI+QPg!W?k8!YbPep!Gmu&)~j|35qyYlS# z_&4>Tn(u@9h`Wt-?S|R?E>1zTEX&Vufk>4gT-p*HXPDQd$zIEy0YBWOIRnx6wOeNTmF7UbcwMSRgjX#Aonq?{c4JZt$4SneRC>G{(kzRod?NyB?QEpFQB8 zaal29h*>y*XPn%L7B%VEE2E83$$mNV+C+;?q zqtlJCJKw>c*1$47w;$v9Gy4xUvq5=&7QOPwIs>34YOfF!CuW+t6DLodId&4R-&NutX9DnWPYvX55zIpOY@K^NK*Oi=8a)P9pGVAX^*!AP%2KWZKvU|Fk z)Xi=41dOL3yV;|su!8gc?!gWI61RU<11n9>0C1ZDN;BUXP7N{0gYoSN_(DI=N4sa* zz4;l}i%qWA+Q?SzY^io{*xrFe%O3U22lQUpIdNdn(G;GFM%Hor1 zJp7illcI@|cZ@Pig~m0qe|xloKc!DjqMaWb>G4z9Ca_e+!Cz4FXO$dQqAvDGN*a*h zZ!7P%k`>)_k-UGbZW8~LPY%V0Of3n^*dKL|jl`;6X$cgn!M+?Nw0$+!7kxLXW#+@> zR4~dhx$OJG^349?;a&ZSA}xgS6;IaIIkb-YVOan4hxL(c3#G#KOLLHdYWaG>7?c*2 z7Yd>eLaeBgjqdA{Uf_exH{lNJmw&Fl%TsC~HHgJ>D8A*p zo%qA|9c5a7I&a|*jhFf=Nb4&(ivukZywod6;D$3`3dowl-grA^{i`cq?iJ3Gfl|Si z;E-Mgrx+|!Lz=q6yY(CvNVtQUyvxc48R8qBYuy3gblmByowIuT4aZ^|8}}p8)A-bJ z$v>v#4M8MwWI$)%R$mormqLcFb08dAed)EZ>XfEnaIfPP6UwX%Q(??R$>3M%m*DG4 z1oFWzk<2DZ?tcH>?@z`qj0||pZUUi^G#fjE`SjH6LhX{LaToP)8_%?-$j|DANf&F- z1-tRDG_JBmW>DV`Cx#(j1E7$6d~0@VJcGhMpJ>kzFVJ<4a!OC~Gb-^PIiWATM9IkZ zg6%a%#tVrbOG78HQ#0OM>KS|nWQb8NmT8wE_n~^$nV$f5(mU!c_bLIL%;7zZd#$d-$mm;W1Knf(V!A^8?3TQfvxU4Z>Al>EJ*@yTZ(|2T& zjfjID)eU1Wy2wYG7HNXm#8vZZYCuHcSjw*f4Rg!F-jI>B`87 z0rJ&Nc4er~e<7AhO1>Y*T=n+(a@`Qs+MfwA;7doba8ILgM-;A=%a=PeYQjiR4&>2^ z3NDu&^uj)>5tT2C6D;2RVc42w;4nDV!W)z6Ht{9Q z|Jq>hkTI8xiIyBko0ne=i-qjfVG zO7Gdl177m3=lnFdPW{G1Btz~24<{M^@gNK9u5Hk}&^H(#1{`n&l$dj#@e+P?9}P#> z2IwP((kOUibELM9P%D_;mFlGy`}%9@W8+taX8jELE1Wg+ZFC$==$26KH#~av!!xVg zwT9<^=f+DKo?V>elcLlz^J;(+F#cXl9gvv%y90St#T}fkLC31G660a0YK9X@p)>IJ zQQrl-xK1!j+9R`}y54#mhYag+bVEGV-Q#!`!NW1u;(V>gIdAd7JZU^{?H)bup?*}e z#qc$Ht3v2Q!^AO*SxZ|c93~J%mp8|xLqjJ=hQd83p*Ue15$juHf(>2SocSm8z)HlF z@kH@mb@?WBc}lcQ-7O!7+Xpia_f`S_HN8=?TyRmz-&SIb zn`mh8kCgnn5^JM|J}{VSPgy%NoyJdd_j6Fhnz#y673Xu0=Tff0EoEB`TVd>A!8Tz%EzIwCs=x9&xl89T>z?9wE$EINwgFdq_LZI zP`5Ff(0$+2DbEU!dK8Ep^aUUS%4B3{p;u0Wl?6TZ5zK zM1MNh&*sh`Cu-D;8pLm=!>rK;GK0B4NzoNRX2ZJ>H9)$k#`=&0@(nN~D{d$H(|N03 zgb93)$f+d&F`BR?wGF5<7<4IE)-+QtGgi|>=s-;HsEJc~v3Tj3LtaTHv4n0?E1P-w z-q*caVhyG!`0pvSs21lr5&F>&WV5BK-5tusRm@wf??mu@^CNwiAIyXws}Gf9-lLXa znF=rgdD!wDW+Kan8eeQi=_~wvYePhPMrjJn>Kpqwu^E+OKBfAyHaRBA?E2FO9pzU$ zL(*-0!P1J-93u&$h|6%4vOC8yD|Hvgoa=Rc9D7{98{n9C>)as6Ubmic8*289qyDr{ zD-AOCA2BUuMwYg})2JHF$xx868M!k!g7$c)*+F(*_vf0A@QfEOfol1Wiw&+kZQBZJ zh`Hc$DVSTp#;aLfD$G`{RO;r^!Mw&o5~-u%x@q(&81Lxa9)oxX%DoF!^ZJnXZuBJ* z6&%52BULwUq~xoG%e>dclepL| zD4R4}%c%(VM$obTIOU-eHgP3{H?sh;8E|!{nUYBs9qd=QXct;Jr=?^5lAuS-ko3tS z&VXq&kZr8eIk5#qnxoe4Q=F)kv*yPeVHVS&Y{!QUs|$IE3o~#@-k;5^Dy&g7m&u&J zZ<^!Om?ubAsM3T_RBS(^bK?&6k-=Xk!4a@=Sf&E|b|XE8wEimhA`EJewdadr(0|VT zAJxZdGD{f=U&80+5&0Se?N3(6b>a66#aqMlLtLz4Kpqh?UBQ5C_MdEwA)gQXho5H$ zGlGhtgZ=Z&2moNr2#h|Z>C{ju2eRh*Ebqlb)at-k715L2TD$^I;pQwUTgY$G*su)Sdp0kkX18?!cKyDCXl!|wD;VOPx z5Yy_yhq>_LCOkDCz8n`^bM%^AgidKk1QC(F+s0qRXGAC(W6NDJ#)5`FqsD5`)L5Jk zI>uJA*(xM2&=x2M|4_+SmHcl?)*>n5cK$r|dojDKZVB35aHA>G`sh(EY!sznjg-?O zDS{h`bP_gDFnZNc`{P6D)!4z`qK@EyQDTsPk+W!q|F&}frIHmLqC$Tu>JYDYM>*P> z->a3Qlxh7U zn&o8WToio%9RZp!U}U|O=XnPGV+w*K!FU)GhOD=!xusiD3s4&npx4ThMeIJfjN8%qm z(xIA~TnJ1cGeC~|y{#@n)%kzlt3jI4-=aamKjs7rc6;WSuCogTQ!J*R^-Z1=54_%< z^}*irbcIw^%$88wD(+A+pxV`L&RFp8c{ZXu*0MGtF&rYg^RIc6(S>}nyIDqc)Qsp) zC{A@Y?$wR0)^w9yLVeX=3%W38`kT@vEU zG#)%By@+^^wmM{G-+!GBGRE+NUjv!<+9wSI)3Z_y?x?`OQetGX%@&Gvv88m87lx*+ zXL5dLYSVz)gwI_* zo!bn}N)Mz1-J9gs^_S%8D8E{Rq>EZ5K8E18&3x|S#h!8xV&8TX{NfV)+zs+QREbN$1|T-qRox*wj~M zrNRr(uS^Kn@wMjUX<3t{kVc=`v4#byQY$V5LVH79O&}&_mE6^uekZsK#*72l34BKq zOsT|7>K4-j9Z6z_2_oV}D)J;RF_nGh;$ z-1uz4A*(r|(RdvGxXKvI^z%A1xXyT8V#wY#v+(BnCOZ+aSqY;8o?*t=)PEu-`j^3M zB{GAoBdoo#v*YhgOComo+u~h?DZi0GdvBn(21ne?X{Dpg2=N~0XIdZ-mdP8DY!T{jK9u_Hi9T#qA4a6F z+uTF(w&D4YaiNz6**eN)*~AQo!<_^V3zNe!Nm2x_8+awEtjd?;K`03d!y3j9B|$sq znZs~D#)Hct;bx-R7hSVR9Ue*%5j;*doS*S|hJnG+Ov6;;v*#GM0zR)-=4zppXoW#R z0A~vB4s%e%FBbUI!XC66ayj)21vSoEQS0&f0;>gQWd#a7KeQOIHGK;oY(IVAY=@@; z`d4G{y&c-5|1nrDn-M4J!{GOn7-~19XqaA8C6a(NrS2)eKEjxo&N+i-JcTEm#DCd( z2eI|yG?DgR9|MW=WcS31CjaC+3Ix2_x1L z?;w~h`yC9d4GG6!FT_EsFXrRVGxGMlgvRMbzn3!mw^B;A?;HT4~Wh#YF=~kQQir#uGr>;3ENHYGNm5YO7 z18_=_CIm>r%!PsL_i}lultQh@YD}nFx{#Fcg?7srZt>O~!XJ+QASy3PwTUNP9rFohRpS*@wEE5Dg_wk2nk zOz5MuaCA8mZY+5y8ta#VgiJY`huq152c*TSPA0>i+$1NLMCUkocH9~8O zCE}6fk7Qzrykj$o74z5hG3wXoPv@*heH^*59tY>3Ey^$CTg zn2{U!6HGoyn~xaxj6)&rqgIwuJ6WHNrcQYs&u+G7dwBL`R`#d_fi0pEt!GnE2&N|# zLd*w-Xt|=QHq)}0Z6x>|nr*#gVBZ)FBYw10%^~9K@94rW^GGvy{^ZG5$IqX<5D4%k z)!yjfqW#_DZ=4Iuog6#Sfp5i$Mp#x8q?x&Xi7+@T;l=bVbq$GxP;*#LY(k8cNV^IC zV>_regJFKfFqv>9Ac_9E07f#KabM=;jyuVY<1NoO(Wl7mt%Z*+jA7O^_*sKlF&)qk z)5PFEP;X&F2Y?{ zHcG_)DJbek3yorGSTQ55t(udOWSQZ7wh z&Ud?q?R-1ud)!_-zn}9F_lTW8;2w4RsBeec??yQm+yQrxQg0L%UZG^_Anp(W$#GK6@zC_iLGtjtFh8b3{1xjWG#tU;SFk!+PY9PGh<f|SU}A~9 zL5ZDJs&j!?Oh`-A?42*&7!Q}-2EVI^eqY(^#=Rstj#COtd1@@50n=Po7(2ex9Iv`~ z*a)v3=i%B6iPTK;EhdGuk$PbSK9+M

|x#N172AiqtFFx5v_Ojg;N(v$Wq*#eIs6 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 Y)Vh{D8hx-xkL#*+SBuvMOG}ym0b(wDs{jB1 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py deleted file mode 100644 index cfb318d..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Backports for individual classes and functions.""" - -import os -import sys - -__all__ = ['cache_from_source', 'callable', 'fsencode'] - - -try: - from imp import cache_from_source -except ImportError: - def cache_from_source(py_file, debug=__debug__): - ext = debug and 'c' or 'o' - return py_file + ext - - -try: - callable = callable -except NameError: - from collections import Callable - - def callable(obj): - return isinstance(obj, Callable) - - -try: - fsencode = os.fsencode -except AttributeError: - def fsencode(filename): - if isinstance(filename, bytes): - return filename - elif isinstance(filename, str): - return filename.encode(sys.getfilesystemencoding()) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py deleted file mode 100644 index 10ed362..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py +++ /dev/null @@ -1,764 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Utility functions for copying and archiving files and directory trees. - -XXX The functions here don't copy the resource fork or other metadata on Mac. - -""" - -import os -import sys -import stat -from os.path import abspath -import fnmatch -try: - from collections.abc import Callable -except ImportError: - from collections import Callable -import errno -from . import tarfile - -try: - import bz2 - _BZ2_SUPPORTED = True -except ImportError: - _BZ2_SUPPORTED = False - -try: - from pwd import getpwnam -except ImportError: - getpwnam = None - -try: - from grp import getgrnam -except ImportError: - getgrnam = None - -__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", - "copytree", "move", "rmtree", "Error", "SpecialFileError", - "ExecError", "make_archive", "get_archive_formats", - "register_archive_format", "unregister_archive_format", - "get_unpack_formats", "register_unpack_format", - "unregister_unpack_format", "unpack_archive", "ignore_patterns"] - -class Error(EnvironmentError): - pass - -class SpecialFileError(EnvironmentError): - """Raised when trying to do a kind of operation (e.g. copying) which is - not supported on a special file (e.g. a named pipe)""" - -class ExecError(EnvironmentError): - """Raised when a command could not be executed""" - -class ReadError(EnvironmentError): - """Raised when an archive cannot be read""" - -class RegistryError(Exception): - """Raised when a registry operation with the archiving - and unpacking registries fails""" - - -try: - WindowsError -except NameError: - WindowsError = None - -def copyfileobj(fsrc, fdst, length=16*1024): - """copy data from file-like object fsrc to file-like object fdst""" - while 1: - buf = fsrc.read(length) - if not buf: - break - fdst.write(buf) - -def _samefile(src, dst): - # Macintosh, Unix. - if hasattr(os.path, 'samefile'): - try: - return os.path.samefile(src, dst) - except OSError: - return False - - # All other platforms: check for same pathname. - return (os.path.normcase(os.path.abspath(src)) == - os.path.normcase(os.path.abspath(dst))) - -def copyfile(src, dst): - """Copy data from src to dst""" - if _samefile(src, dst): - raise Error("`%s` and `%s` are the same file" % (src, dst)) - - for fn in [src, dst]: - try: - st = os.stat(fn) - except OSError: - # File most likely does not exist - pass - else: - # XXX What about other special files? (sockets, devices...) - if stat.S_ISFIFO(st.st_mode): - raise SpecialFileError("`%s` is a named pipe" % fn) - - with open(src, 'rb') as fsrc: - with open(dst, 'wb') as fdst: - copyfileobj(fsrc, fdst) - -def copymode(src, dst): - """Copy mode bits from src to dst""" - if hasattr(os, 'chmod'): - st = os.stat(src) - mode = stat.S_IMODE(st.st_mode) - os.chmod(dst, mode) - -def copystat(src, dst): - """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" - st = os.stat(src) - mode = stat.S_IMODE(st.st_mode) - if hasattr(os, 'utime'): - os.utime(dst, (st.st_atime, st.st_mtime)) - if hasattr(os, 'chmod'): - os.chmod(dst, mode) - if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): - try: - os.chflags(dst, st.st_flags) - except OSError as why: - if (not hasattr(errno, 'EOPNOTSUPP') or - why.errno != errno.EOPNOTSUPP): - raise - -def copy(src, dst): - """Copy data and mode bits ("cp src dst"). - - The destination may be a directory. - - """ - if os.path.isdir(dst): - dst = os.path.join(dst, os.path.basename(src)) - copyfile(src, dst) - copymode(src, dst) - -def copy2(src, dst): - """Copy data and all stat info ("cp -p src dst"). - - The destination may be a directory. - - """ - if os.path.isdir(dst): - dst = os.path.join(dst, os.path.basename(src)) - copyfile(src, dst) - copystat(src, dst) - -def ignore_patterns(*patterns): - """Function that can be used as copytree() ignore parameter. - - Patterns is a sequence of glob-style patterns - that are used to exclude files""" - def _ignore_patterns(path, names): - ignored_names = [] - for pattern in patterns: - ignored_names.extend(fnmatch.filter(names, pattern)) - return set(ignored_names) - return _ignore_patterns - -def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, - ignore_dangling_symlinks=False): - """Recursively copy a directory tree. - - The destination directory must not already exist. - If exception(s) occur, an Error is raised with a list of reasons. - - If the optional symlinks flag is true, symbolic links in the - source tree result in symbolic links in the destination tree; if - it is false, the contents of the files pointed to by symbolic - links are copied. If the file pointed by the symlink doesn't - exist, an exception will be added in the list of errors raised in - an Error exception at the end of the copy process. - - You can set the optional ignore_dangling_symlinks flag to true if you - want to silence this exception. Notice that this has no effect on - platforms that don't support os.symlink. - - The optional ignore argument is a callable. If given, it - is called with the `src` parameter, which is the directory - being visited by copytree(), and `names` which is the list of - `src` contents, as returned by os.listdir(): - - callable(src, names) -> ignored_names - - Since copytree() is called recursively, the callable will be - called once for each directory that is copied. It returns a - list of names relative to the `src` directory that should - not be copied. - - The optional copy_function argument is a callable that will be used - to copy each file. It will be called with the source path and the - destination path as arguments. By default, copy2() is used, but any - function that supports the same signature (like copy()) can be used. - - """ - names = os.listdir(src) - if ignore is not None: - ignored_names = ignore(src, names) - else: - ignored_names = set() - - os.makedirs(dst) - errors = [] - for name in names: - if name in ignored_names: - continue - srcname = os.path.join(src, name) - dstname = os.path.join(dst, name) - try: - if os.path.islink(srcname): - linkto = os.readlink(srcname) - if symlinks: - os.symlink(linkto, dstname) - else: - # ignore dangling symlink if the flag is on - if not os.path.exists(linkto) and ignore_dangling_symlinks: - continue - # otherwise let the copy occurs. copy2 will raise an error - copy_function(srcname, dstname) - elif os.path.isdir(srcname): - copytree(srcname, dstname, symlinks, ignore, copy_function) - else: - # Will raise a SpecialFileError for unsupported file types - copy_function(srcname, dstname) - # catch the Error from the recursive copytree so that we can - # continue with other files - except Error as err: - errors.extend(err.args[0]) - except EnvironmentError as why: - errors.append((srcname, dstname, str(why))) - try: - copystat(src, dst) - except OSError as why: - if WindowsError is not None and isinstance(why, WindowsError): - # Copying file access times may fail on Windows - pass - else: - errors.extend((src, dst, str(why))) - if errors: - raise Error(errors) - -def rmtree(path, ignore_errors=False, onerror=None): - """Recursively delete a directory tree. - - If ignore_errors is set, errors are ignored; otherwise, if onerror - is set, it is called to handle the error with arguments (func, - path, exc_info) where func is os.listdir, os.remove, or os.rmdir; - path is the argument to that function that caused it to fail; and - exc_info is a tuple returned by sys.exc_info(). If ignore_errors - is false and onerror is None, an exception is raised. - - """ - if ignore_errors: - def onerror(*args): - pass - elif onerror is None: - def onerror(*args): - raise - try: - if os.path.islink(path): - # symlinks to directories are forbidden, see bug #1669 - raise OSError("Cannot call rmtree on a symbolic link") - except OSError: - onerror(os.path.islink, path, sys.exc_info()) - # can't continue even if onerror hook returns - return - names = [] - try: - names = os.listdir(path) - except os.error: - onerror(os.listdir, path, sys.exc_info()) - for name in names: - fullname = os.path.join(path, name) - try: - mode = os.lstat(fullname).st_mode - except os.error: - mode = 0 - if stat.S_ISDIR(mode): - rmtree(fullname, ignore_errors, onerror) - else: - try: - os.remove(fullname) - except os.error: - onerror(os.remove, fullname, sys.exc_info()) - try: - os.rmdir(path) - except os.error: - onerror(os.rmdir, path, sys.exc_info()) - - -def _basename(path): - # A basename() variant which first strips the trailing slash, if present. - # Thus we always get the last component of the path, even for directories. - return os.path.basename(path.rstrip(os.path.sep)) - -def move(src, dst): - """Recursively move a file or directory to another location. This is - similar to the Unix "mv" command. - - If the destination is a directory or a symlink to a directory, the source - is moved inside the directory. The destination path must not already - exist. - - If the destination already exists but is not a directory, it may be - overwritten depending on os.rename() semantics. - - If the destination is on our current filesystem, then rename() is used. - Otherwise, src is copied to the destination and then removed. - A lot more could be done here... A look at a mv.c shows a lot of - the issues this implementation glosses over. - - """ - real_dst = dst - if os.path.isdir(dst): - if _samefile(src, dst): - # We might be on a case insensitive filesystem, - # perform the rename anyway. - os.rename(src, dst) - return - - real_dst = os.path.join(dst, _basename(src)) - if os.path.exists(real_dst): - raise Error("Destination path '%s' already exists" % real_dst) - try: - os.rename(src, real_dst) - except OSError: - if os.path.isdir(src): - if _destinsrc(src, dst): - raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) - copytree(src, real_dst, symlinks=True) - rmtree(src) - else: - copy2(src, real_dst) - os.unlink(src) - -def _destinsrc(src, dst): - src = abspath(src) - dst = abspath(dst) - if not src.endswith(os.path.sep): - src += os.path.sep - if not dst.endswith(os.path.sep): - dst += os.path.sep - return dst.startswith(src) - -def _get_gid(name): - """Returns a gid, given a group name.""" - if getgrnam is None or name is None: - return None - try: - result = getgrnam(name) - except KeyError: - result = None - if result is not None: - return result[2] - return None - -def _get_uid(name): - """Returns an uid, given a user name.""" - if getpwnam is None or name is None: - return None - try: - result = getpwnam(name) - except KeyError: - result = None - if result is not None: - return result[2] - return None - -def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, - owner=None, group=None, logger=None): - """Create a (possibly compressed) tar file from all the files under - 'base_dir'. - - 'compress' must be "gzip" (the default), "bzip2", or None. - - 'owner' and 'group' can be used to define an owner and a group for the - archive that is being built. If not provided, the current owner and group - will be used. - - The output tar file will be named 'base_name' + ".tar", possibly plus - the appropriate compression extension (".gz", or ".bz2"). - - Returns the output filename. - """ - tar_compression = {'gzip': 'gz', None: ''} - compress_ext = {'gzip': '.gz'} - - if _BZ2_SUPPORTED: - tar_compression['bzip2'] = 'bz2' - compress_ext['bzip2'] = '.bz2' - - # flags for compression program, each element of list will be an argument - if compress is not None and compress not in compress_ext: - raise ValueError("bad value for 'compress', or compression format not " - "supported : {0}".format(compress)) - - archive_name = base_name + '.tar' + compress_ext.get(compress, '') - archive_dir = os.path.dirname(archive_name) - - if not os.path.exists(archive_dir): - if logger is not None: - logger.info("creating %s", archive_dir) - if not dry_run: - os.makedirs(archive_dir) - - # creating the tarball - if logger is not None: - logger.info('Creating tar archive') - - uid = _get_uid(owner) - gid = _get_gid(group) - - def _set_uid_gid(tarinfo): - if gid is not None: - tarinfo.gid = gid - tarinfo.gname = group - if uid is not None: - tarinfo.uid = uid - tarinfo.uname = owner - return tarinfo - - if not dry_run: - tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) - try: - tar.add(base_dir, filter=_set_uid_gid) - finally: - tar.close() - - return archive_name - -def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): - # XXX see if we want to keep an external call here - if verbose: - zipoptions = "-r" - else: - zipoptions = "-rq" - from distutils.errors import DistutilsExecError - from distutils.spawn import spawn - try: - spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) - except DistutilsExecError: - # XXX really should distinguish between "couldn't find - # external 'zip' command" and "zip failed". - raise ExecError("unable to create zip file '%s': " - "could neither import the 'zipfile' module nor " - "find a standalone zip utility") % zip_filename - -def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): - """Create a zip file from all the files under 'base_dir'. - - The output zip file will be named 'base_name' + ".zip". Uses either the - "zipfile" Python module (if available) or the InfoZIP "zip" utility - (if installed and found on the default search path). If neither tool is - available, raises ExecError. Returns the name of the output zip - file. - """ - zip_filename = base_name + ".zip" - archive_dir = os.path.dirname(base_name) - - if not os.path.exists(archive_dir): - if logger is not None: - logger.info("creating %s", archive_dir) - if not dry_run: - os.makedirs(archive_dir) - - # If zipfile module is not available, try spawning an external 'zip' - # command. - try: - import zipfile - except ImportError: - zipfile = None - - if zipfile is None: - _call_external_zip(base_dir, zip_filename, verbose, dry_run) - else: - if logger is not None: - logger.info("creating '%s' and adding '%s' to it", - zip_filename, base_dir) - - if not dry_run: - zip = zipfile.ZipFile(zip_filename, "w", - compression=zipfile.ZIP_DEFLATED) - - for dirpath, dirnames, filenames in os.walk(base_dir): - for name in filenames: - path = os.path.normpath(os.path.join(dirpath, name)) - if os.path.isfile(path): - zip.write(path, path) - if logger is not None: - logger.info("adding '%s'", path) - zip.close() - - return zip_filename - -_ARCHIVE_FORMATS = { - 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), - 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), - 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), - 'zip': (_make_zipfile, [], "ZIP file"), - } - -if _BZ2_SUPPORTED: - _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], - "bzip2'ed tar-file") - -def get_archive_formats(): - """Returns a list of supported formats for archiving and unarchiving. - - Each element of the returned sequence is a tuple (name, description) - """ - formats = [(name, registry[2]) for name, registry in - _ARCHIVE_FORMATS.items()] - formats.sort() - return formats - -def register_archive_format(name, function, extra_args=None, description=''): - """Registers an archive format. - - name is the name of the format. function is the callable that will be - used to create archives. If provided, extra_args is a sequence of - (name, value) tuples that will be passed as arguments to the callable. - description can be provided to describe the format, and will be returned - by the get_archive_formats() function. - """ - if extra_args is None: - extra_args = [] - if not isinstance(function, Callable): - raise TypeError('The %s object is not callable' % function) - if not isinstance(extra_args, (tuple, list)): - raise TypeError('extra_args needs to be a sequence') - for element in extra_args: - if not isinstance(element, (tuple, list)) or len(element) !=2: - raise TypeError('extra_args elements are : (arg_name, value)') - - _ARCHIVE_FORMATS[name] = (function, extra_args, description) - -def unregister_archive_format(name): - del _ARCHIVE_FORMATS[name] - -def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, - dry_run=0, owner=None, group=None, logger=None): - """Create an archive file (eg. zip or tar). - - 'base_name' is the name of the file to create, minus any format-specific - extension; 'format' is the archive format: one of "zip", "tar", "bztar" - or "gztar". - - 'root_dir' is a directory that will be the root directory of the - archive; ie. we typically chdir into 'root_dir' before creating the - archive. 'base_dir' is the directory where we start archiving from; - ie. 'base_dir' will be the common prefix of all files and - directories in the archive. 'root_dir' and 'base_dir' both default - to the current directory. Returns the name of the archive file. - - 'owner' and 'group' are used when creating a tar archive. By default, - uses the current owner and group. - """ - save_cwd = os.getcwd() - if root_dir is not None: - if logger is not None: - logger.debug("changing into '%s'", root_dir) - base_name = os.path.abspath(base_name) - if not dry_run: - os.chdir(root_dir) - - if base_dir is None: - base_dir = os.curdir - - kwargs = {'dry_run': dry_run, 'logger': logger} - - try: - format_info = _ARCHIVE_FORMATS[format] - except KeyError: - raise ValueError("unknown archive format '%s'" % format) - - func = format_info[0] - for arg, val in format_info[1]: - kwargs[arg] = val - - if format != 'zip': - kwargs['owner'] = owner - kwargs['group'] = group - - try: - filename = func(base_name, base_dir, **kwargs) - finally: - if root_dir is not None: - if logger is not None: - logger.debug("changing back to '%s'", save_cwd) - os.chdir(save_cwd) - - return filename - - -def get_unpack_formats(): - """Returns a list of supported formats for unpacking. - - Each element of the returned sequence is a tuple - (name, extensions, description) - """ - formats = [(name, info[0], info[3]) for name, info in - _UNPACK_FORMATS.items()] - formats.sort() - return formats - -def _check_unpack_options(extensions, function, extra_args): - """Checks what gets registered as an unpacker.""" - # first make sure no other unpacker is registered for this extension - existing_extensions = {} - for name, info in _UNPACK_FORMATS.items(): - for ext in info[0]: - existing_extensions[ext] = name - - for extension in extensions: - if extension in existing_extensions: - msg = '%s is already registered for "%s"' - raise RegistryError(msg % (extension, - existing_extensions[extension])) - - if not isinstance(function, Callable): - raise TypeError('The registered function must be a callable') - - -def register_unpack_format(name, extensions, function, extra_args=None, - description=''): - """Registers an unpack format. - - `name` is the name of the format. `extensions` is a list of extensions - corresponding to the format. - - `function` is the callable that will be - used to unpack archives. The callable will receive archives to unpack. - If it's unable to handle an archive, it needs to raise a ReadError - exception. - - If provided, `extra_args` is a sequence of - (name, value) tuples that will be passed as arguments to the callable. - description can be provided to describe the format, and will be returned - by the get_unpack_formats() function. - """ - if extra_args is None: - extra_args = [] - _check_unpack_options(extensions, function, extra_args) - _UNPACK_FORMATS[name] = extensions, function, extra_args, description - -def unregister_unpack_format(name): - """Removes the pack format from the registry.""" - del _UNPACK_FORMATS[name] - -def _ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - if not os.path.isdir(dirname): - os.makedirs(dirname) - -def _unpack_zipfile(filename, extract_dir): - """Unpack zip `filename` to `extract_dir` - """ - try: - import zipfile - except ImportError: - raise ReadError('zlib not supported, cannot unpack this archive.') - - if not zipfile.is_zipfile(filename): - raise ReadError("%s is not a zip file" % filename) - - zip = zipfile.ZipFile(filename) - try: - for info in zip.infolist(): - name = info.filename - - # don't extract absolute paths or ones with .. in them - if name.startswith('/') or '..' in name: - continue - - target = os.path.join(extract_dir, *name.split('/')) - if not target: - continue - - _ensure_directory(target) - if not name.endswith('/'): - # file - data = zip.read(info.filename) - f = open(target, 'wb') - try: - f.write(data) - finally: - f.close() - del data - finally: - zip.close() - -def _unpack_tarfile(filename, extract_dir): - """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` - """ - try: - tarobj = tarfile.open(filename) - except tarfile.TarError: - raise ReadError( - "%s is not a compressed or uncompressed tar file" % filename) - try: - tarobj.extractall(extract_dir) - finally: - tarobj.close() - -_UNPACK_FORMATS = { - 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), - 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), - 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") - } - -if _BZ2_SUPPORTED: - _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], - "bzip2'ed tar-file") - -def _find_unpack_format(filename): - for name, info in _UNPACK_FORMATS.items(): - for extension in info[0]: - if filename.endswith(extension): - return name - return None - -def unpack_archive(filename, extract_dir=None, format=None): - """Unpack an archive. - - `filename` is the name of the archive. - - `extract_dir` is the name of the target directory, where the archive - is unpacked. If not provided, the current working directory is used. - - `format` is the archive format: one of "zip", "tar", or "gztar". Or any - other registered format. If not provided, unpack_archive will use the - filename extension and see if an unpacker was registered for that - extension. - - In case none is found, a ValueError is raised. - """ - if extract_dir is None: - extract_dir = os.getcwd() - - if format is not None: - try: - format_info = _UNPACK_FORMATS[format] - except KeyError: - raise ValueError("Unknown unpack format '{0}'".format(format)) - - func = format_info[1] - func(filename, extract_dir, **dict(format_info[2])) - else: - # we need to look at the registered unpackers supported extensions - format = _find_unpack_format(filename) - if format is None: - raise ReadError("Unknown archive format '{0}'".format(filename)) - - func = _UNPACK_FORMATS[format][1] - kwargs = dict(_UNPACK_FORMATS[format][2]) - func(filename, extract_dir, **kwargs) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg deleted file mode 100644 index 1746bd0..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg +++ /dev/null @@ -1,84 +0,0 @@ -[posix_prefix] -# Configuration directories. Some of these come straight out of the -# configure script. They are for implementing the other variables, not to -# be used directly in [resource_locations]. -confdir = /etc -datadir = /usr/share -libdir = /usr/lib -statedir = /var -# User resource directory -local = ~/.local/{distribution.name} - -stdlib = {base}/lib/python{py_version_short} -platstdlib = {platbase}/lib/python{py_version_short} -purelib = {base}/lib/python{py_version_short}/site-packages -platlib = {platbase}/lib/python{py_version_short}/site-packages -include = {base}/include/python{py_version_short}{abiflags} -platinclude = {platbase}/include/python{py_version_short}{abiflags} -data = {base} - -[posix_home] -stdlib = {base}/lib/python -platstdlib = {base}/lib/python -purelib = {base}/lib/python -platlib = {base}/lib/python -include = {base}/include/python -platinclude = {base}/include/python -scripts = {base}/bin -data = {base} - -[nt] -stdlib = {base}/Lib -platstdlib = {base}/Lib -purelib = {base}/Lib/site-packages -platlib = {base}/Lib/site-packages -include = {base}/Include -platinclude = {base}/Include -scripts = {base}/Scripts -data = {base} - -[os2] -stdlib = {base}/Lib -platstdlib = {base}/Lib -purelib = {base}/Lib/site-packages -platlib = {base}/Lib/site-packages -include = {base}/Include -platinclude = {base}/Include -scripts = {base}/Scripts -data = {base} - -[os2_home] -stdlib = {userbase}/lib/python{py_version_short} -platstdlib = {userbase}/lib/python{py_version_short} -purelib = {userbase}/lib/python{py_version_short}/site-packages -platlib = {userbase}/lib/python{py_version_short}/site-packages -include = {userbase}/include/python{py_version_short} -scripts = {userbase}/bin -data = {userbase} - -[nt_user] -stdlib = {userbase}/Python{py_version_nodot} -platstdlib = {userbase}/Python{py_version_nodot} -purelib = {userbase}/Python{py_version_nodot}/site-packages -platlib = {userbase}/Python{py_version_nodot}/site-packages -include = {userbase}/Python{py_version_nodot}/Include -scripts = {userbase}/Scripts -data = {userbase} - -[posix_user] -stdlib = {userbase}/lib/python{py_version_short} -platstdlib = {userbase}/lib/python{py_version_short} -purelib = {userbase}/lib/python{py_version_short}/site-packages -platlib = {userbase}/lib/python{py_version_short}/site-packages -include = {userbase}/include/python{py_version_short} -scripts = {userbase}/bin -data = {userbase} - -[osx_framework_user] -stdlib = {userbase}/lib/python -platstdlib = {userbase}/lib/python -purelib = {userbase}/lib/python/site-packages -platlib = {userbase}/lib/python/site-packages -include = {userbase}/include -scripts = {userbase}/bin -data = {userbase} diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py deleted file mode 100644 index b470a37..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py +++ /dev/null @@ -1,786 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Access to Python's configuration information.""" - -import codecs -import os -import re -import sys -from os.path import pardir, realpath -try: - import configparser -except ImportError: - import ConfigParser as configparser - - -__all__ = [ - 'get_config_h_filename', - 'get_config_var', - 'get_config_vars', - 'get_makefile_filename', - 'get_path', - 'get_path_names', - 'get_paths', - 'get_platform', - 'get_python_version', - 'get_scheme_names', - 'parse_config_h', -] - - -def _safe_realpath(path): - try: - return realpath(path) - except OSError: - return path - - -if sys.executable: - _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) -else: - # sys.executable can be empty if argv[0] has been changed and Python is - # unable to retrieve the real program name - _PROJECT_BASE = _safe_realpath(os.getcwd()) - -if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) -# PC/VS7.1 -if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) -# PC/AMD64 -if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) - - -def is_python_build(): - for fn in ("Setup.dist", "Setup.local"): - if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): - return True - return False - -_PYTHON_BUILD = is_python_build() - -_cfg_read = False - -def _ensure_cfg_read(): - global _cfg_read - if not _cfg_read: - from ..resources import finder - backport_package = __name__.rsplit('.', 1)[0] - _finder = finder(backport_package) - _cfgfile = _finder.find('sysconfig.cfg') - assert _cfgfile, 'sysconfig.cfg exists' - with _cfgfile.as_stream() as s: - _SCHEMES.readfp(s) - if _PYTHON_BUILD: - for scheme in ('posix_prefix', 'posix_home'): - _SCHEMES.set(scheme, 'include', '{srcdir}/Include') - _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') - - _cfg_read = True - - -_SCHEMES = configparser.RawConfigParser() -_VAR_REPL = re.compile(r'\{([^{]*?)\}') - -def _expand_globals(config): - _ensure_cfg_read() - if config.has_section('globals'): - globals = config.items('globals') - else: - globals = tuple() - - sections = config.sections() - for section in sections: - if section == 'globals': - continue - for option, value in globals: - if config.has_option(section, option): - continue - config.set(section, option, value) - config.remove_section('globals') - - # now expanding local variables defined in the cfg file - # - for section in config.sections(): - variables = dict(config.items(section)) - - def _replacer(matchobj): - name = matchobj.group(1) - if name in variables: - return variables[name] - return matchobj.group(0) - - for option, value in config.items(section): - config.set(section, option, _VAR_REPL.sub(_replacer, value)) - -#_expand_globals(_SCHEMES) - -_PY_VERSION = '%s.%s.%s' % sys.version_info[:3] -_PY_VERSION_SHORT = '%s.%s' % sys.version_info[:2] -_PY_VERSION_SHORT_NO_DOT = '%s%s' % sys.version_info[:2] -_PREFIX = os.path.normpath(sys.prefix) -_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) -_CONFIG_VARS = None -_USER_BASE = None - - -def _subst_vars(path, local_vars): - """In the string `path`, replace tokens like {some.thing} with the - corresponding value from the map `local_vars`. - - If there is no corresponding value, leave the token unchanged. - """ - def _replacer(matchobj): - name = matchobj.group(1) - if name in local_vars: - return local_vars[name] - elif name in os.environ: - return os.environ[name] - return matchobj.group(0) - return _VAR_REPL.sub(_replacer, path) - - -def _extend_dict(target_dict, other_dict): - target_keys = target_dict.keys() - for key, value in other_dict.items(): - if key in target_keys: - continue - target_dict[key] = value - - -def _expand_vars(scheme, vars): - res = {} - if vars is None: - vars = {} - _extend_dict(vars, get_config_vars()) - - for key, value in _SCHEMES.items(scheme): - if os.name in ('posix', 'nt'): - value = os.path.expanduser(value) - res[key] = os.path.normpath(_subst_vars(value, vars)) - return res - - -def format_value(value, vars): - def _replacer(matchobj): - name = matchobj.group(1) - if name in vars: - return vars[name] - return matchobj.group(0) - return _VAR_REPL.sub(_replacer, value) - - -def _get_default_scheme(): - if os.name == 'posix': - # the default scheme for posix is posix_prefix - return 'posix_prefix' - return os.name - - -def _getuserbase(): - env_base = os.environ.get("PYTHONUSERBASE", None) - - def joinuser(*args): - return os.path.expanduser(os.path.join(*args)) - - # what about 'os2emx', 'riscos' ? - if os.name == "nt": - base = os.environ.get("APPDATA") or "~" - if env_base: - return env_base - else: - return joinuser(base, "Python") - - if sys.platform == "darwin": - framework = get_config_var("PYTHONFRAMEWORK") - if framework: - if env_base: - return env_base - else: - return joinuser("~", "Library", framework, "%d.%d" % - sys.version_info[:2]) - - if env_base: - return env_base - else: - return joinuser("~", ".local") - - -def _parse_makefile(filename, vars=None): - """Parse a Makefile-style file. - - A dictionary containing name/value pairs is returned. If an - optional dictionary is passed in as the second argument, it is - used instead of a new dictionary. - """ - # Regexes needed for parsing Makefile (and similar syntaxes, - # like old-style Setup files). - _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") - _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") - _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") - - if vars is None: - vars = {} - done = {} - notdone = {} - - with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: - lines = f.readlines() - - for line in lines: - if line.startswith('#') or line.strip() == '': - continue - m = _variable_rx.match(line) - if m: - n, v = m.group(1, 2) - v = v.strip() - # `$$' is a literal `$' in make - tmpv = v.replace('$$', '') - - if "$" in tmpv: - notdone[n] = v - else: - try: - v = int(v) - except ValueError: - # insert literal `$' - done[n] = v.replace('$$', '$') - else: - done[n] = v - - # do variable interpolation here - variables = list(notdone.keys()) - - # Variables with a 'PY_' prefix in the makefile. These need to - # be made available without that prefix through sysconfig. - # Special care is needed to ensure that variable expansion works, even - # if the expansion uses the name without a prefix. - renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') - - while len(variables) > 0: - for name in tuple(variables): - value = notdone[name] - m = _findvar1_rx.search(value) or _findvar2_rx.search(value) - if m is not None: - n = m.group(1) - found = True - if n in done: - item = str(done[n]) - elif n in notdone: - # get it on a subsequent round - found = False - elif n in os.environ: - # do it like make: fall back to environment - item = os.environ[n] - - elif n in renamed_variables: - if (name.startswith('PY_') and - name[3:] in renamed_variables): - item = "" - - elif 'PY_' + n in notdone: - found = False - - else: - item = str(done['PY_' + n]) - - else: - done[n] = item = "" - - if found: - after = value[m.end():] - value = value[:m.start()] + item + after - if "$" in after: - notdone[name] = value - else: - try: - value = int(value) - except ValueError: - done[name] = value.strip() - else: - done[name] = value - variables.remove(name) - - if (name.startswith('PY_') and - name[3:] in renamed_variables): - - name = name[3:] - if name not in done: - done[name] = value - - else: - # bogus variable reference (e.g. "prefix=$/opt/python"); - # just drop it since we can't deal - done[name] = value - variables.remove(name) - - # strip spurious spaces - for k, v in done.items(): - if isinstance(v, str): - done[k] = v.strip() - - # save the results in the global dictionary - vars.update(done) - return vars - - -def get_makefile_filename(): - """Return the path of the Makefile.""" - if _PYTHON_BUILD: - return os.path.join(_PROJECT_BASE, "Makefile") - if hasattr(sys, 'abiflags'): - config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) - else: - config_dir_name = 'config' - return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') - - -def _init_posix(vars): - """Initialize the module as appropriate for POSIX systems.""" - # load the installed Makefile: - makefile = get_makefile_filename() - try: - _parse_makefile(makefile, vars) - except IOError as e: - msg = "invalid Python installation: unable to open %s" % makefile - if hasattr(e, "strerror"): - msg = msg + " (%s)" % e.strerror - raise IOError(msg) - # load the installed pyconfig.h: - config_h = get_config_h_filename() - try: - with open(config_h) as f: - parse_config_h(f, vars) - except IOError as e: - msg = "invalid Python installation: unable to open %s" % config_h - if hasattr(e, "strerror"): - msg = msg + " (%s)" % e.strerror - raise IOError(msg) - # On AIX, there are wrong paths to the linker scripts in the Makefile - # -- these paths are relative to the Python source, but when installed - # the scripts are in another directory. - if _PYTHON_BUILD: - vars['LDSHARED'] = vars['BLDSHARED'] - - -def _init_non_posix(vars): - """Initialize the module as appropriate for NT""" - # set basic install directories - vars['LIBDEST'] = get_path('stdlib') - vars['BINLIBDEST'] = get_path('platstdlib') - vars['INCLUDEPY'] = get_path('include') - vars['SO'] = '.pyd' - vars['EXE'] = '.exe' - vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT - vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) - -# -# public APIs -# - - -def parse_config_h(fp, vars=None): - """Parse a config.h-style file. - - A dictionary containing name/value pairs is returned. If an - optional dictionary is passed in as the second argument, it is - used instead of a new dictionary. - """ - if vars is None: - vars = {} - define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") - undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") - - while True: - line = fp.readline() - if not line: - break - m = define_rx.match(line) - if m: - n, v = m.group(1, 2) - try: - v = int(v) - except ValueError: - pass - vars[n] = v - else: - m = undef_rx.match(line) - if m: - vars[m.group(1)] = 0 - return vars - - -def get_config_h_filename(): - """Return the path of pyconfig.h.""" - if _PYTHON_BUILD: - if os.name == "nt": - inc_dir = os.path.join(_PROJECT_BASE, "PC") - else: - inc_dir = _PROJECT_BASE - else: - inc_dir = get_path('platinclude') - return os.path.join(inc_dir, 'pyconfig.h') - - -def get_scheme_names(): - """Return a tuple containing the schemes names.""" - return tuple(sorted(_SCHEMES.sections())) - - -def get_path_names(): - """Return a tuple containing the paths names.""" - # xxx see if we want a static list - return _SCHEMES.options('posix_prefix') - - -def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): - """Return a mapping containing an install scheme. - - ``scheme`` is the install scheme name. If not provided, it will - return the default scheme for the current platform. - """ - _ensure_cfg_read() - if expand: - return _expand_vars(scheme, vars) - else: - return dict(_SCHEMES.items(scheme)) - - -def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): - """Return a path corresponding to the scheme. - - ``scheme`` is the install scheme name. - """ - return get_paths(scheme, vars, expand)[name] - - -def get_config_vars(*args): - """With no arguments, return a dictionary of all configuration - variables relevant for the current platform. - - On Unix, this means every variable defined in Python's installed Makefile; - On Windows and Mac OS it's a much smaller set. - - With arguments, return a list of values that result from looking up - each argument in the configuration variable dictionary. - """ - global _CONFIG_VARS - if _CONFIG_VARS is None: - _CONFIG_VARS = {} - # Normalized versions of prefix and exec_prefix are handy to have; - # in fact, these are the standard versions used most places in the - # distutils2 module. - _CONFIG_VARS['prefix'] = _PREFIX - _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX - _CONFIG_VARS['py_version'] = _PY_VERSION - _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT - _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] - _CONFIG_VARS['base'] = _PREFIX - _CONFIG_VARS['platbase'] = _EXEC_PREFIX - _CONFIG_VARS['projectbase'] = _PROJECT_BASE - try: - _CONFIG_VARS['abiflags'] = sys.abiflags - except AttributeError: - # sys.abiflags may not be defined on all platforms. - _CONFIG_VARS['abiflags'] = '' - - if os.name in ('nt', 'os2'): - _init_non_posix(_CONFIG_VARS) - if os.name == 'posix': - _init_posix(_CONFIG_VARS) - # Setting 'userbase' is done below the call to the - # init function to enable using 'get_config_var' in - # the init-function. - if sys.version >= '2.6': - _CONFIG_VARS['userbase'] = _getuserbase() - - if 'srcdir' not in _CONFIG_VARS: - _CONFIG_VARS['srcdir'] = _PROJECT_BASE - else: - _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) - - # Convert srcdir into an absolute path if it appears necessary. - # Normally it is relative to the build directory. However, during - # testing, for example, we might be running a non-installed python - # from a different directory. - if _PYTHON_BUILD and os.name == "posix": - base = _PROJECT_BASE - try: - cwd = os.getcwd() - except OSError: - cwd = None - if (not os.path.isabs(_CONFIG_VARS['srcdir']) and - base != cwd): - # srcdir is relative and we are not in the same directory - # as the executable. Assume executable is in the build - # directory and make srcdir absolute. - srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) - _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) - - if sys.platform == 'darwin': - kernel_version = os.uname()[2] # Kernel version (8.4.3) - major_version = int(kernel_version.split('.')[0]) - - if major_version < 8: - # On Mac OS X before 10.4, check if -arch and -isysroot - # are in CFLAGS or LDFLAGS and remove them if they are. - # This is needed when building extensions on a 10.3 system - # using a universal build of python. - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - flags = _CONFIG_VARS[key] - flags = re.sub(r'-arch\s+\w+\s', ' ', flags) - flags = re.sub('-isysroot [^ \t]*', ' ', flags) - _CONFIG_VARS[key] = flags - else: - # Allow the user to override the architecture flags using - # an environment variable. - # NOTE: This name was introduced by Apple in OSX 10.5 and - # is used by several scripting languages distributed with - # that OS release. - if 'ARCHFLAGS' in os.environ: - arch = os.environ['ARCHFLAGS'] - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - - flags = _CONFIG_VARS[key] - flags = re.sub(r'-arch\s+\w+\s', ' ', flags) - flags = flags + ' ' + arch - _CONFIG_VARS[key] = flags - - # If we're on OSX 10.5 or later and the user tries to - # compiles an extension using an SDK that is not present - # on the current machine it is better to not use an SDK - # than to fail. - # - # The major usecase for this is users using a Python.org - # binary installer on OSX 10.6: that installer uses - # the 10.4u SDK, but that SDK is not installed by default - # when you install Xcode. - # - CFLAGS = _CONFIG_VARS.get('CFLAGS', '') - m = re.search(r'-isysroot\s+(\S+)', CFLAGS) - if m is not None: - sdk = m.group(1) - if not os.path.exists(sdk): - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - - flags = _CONFIG_VARS[key] - flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) - _CONFIG_VARS[key] = flags - - if args: - vals = [] - for name in args: - vals.append(_CONFIG_VARS.get(name)) - return vals - else: - return _CONFIG_VARS - - -def get_config_var(name): - """Return the value of a single variable using the dictionary returned by - 'get_config_vars()'. - - Equivalent to get_config_vars().get(name) - """ - return get_config_vars().get(name) - - -def get_platform(): - """Return a string that identifies the current platform. - - This is used mainly to distinguish platform-specific build directories and - platform-specific built distributions. Typically includes the OS name - and version and the architecture (as supplied by 'os.uname()'), - although the exact information included depends on the OS; eg. for IRIX - the architecture isn't particularly important (IRIX only runs on SGI - hardware), but for Linux the kernel version isn't particularly - important. - - Examples of returned values: - linux-i586 - linux-alpha (?) - solaris-2.6-sun4u - irix-5.3 - irix64-6.2 - - Windows will return one of: - win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) - win-ia64 (64bit Windows on Itanium) - win32 (all others - specifically, sys.platform is returned) - - For other non-POSIX platforms, currently just returns 'sys.platform'. - """ - if os.name == 'nt': - # sniff sys.version for architecture. - prefix = " bit (" - i = sys.version.find(prefix) - if i == -1: - return sys.platform - j = sys.version.find(")", i) - look = sys.version[i+len(prefix):j].lower() - if look == 'amd64': - return 'win-amd64' - if look == 'itanium': - return 'win-ia64' - return sys.platform - - if os.name != "posix" or not hasattr(os, 'uname'): - # XXX what about the architecture? NT is Intel or Alpha, - # Mac OS is M68k or PPC, etc. - return sys.platform - - # Try to distinguish various flavours of Unix - osname, host, release, version, machine = os.uname() - - # Convert the OS name to lowercase, remove '/' characters - # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") - osname = osname.lower().replace('/', '') - machine = machine.replace(' ', '_') - machine = machine.replace('/', '-') - - if osname[:5] == "linux": - # At least on Linux/Intel, 'machine' is the processor -- - # i386, etc. - # XXX what about Alpha, SPARC, etc? - return "%s-%s" % (osname, machine) - elif osname[:5] == "sunos": - if release[0] >= "5": # SunOS 5 == Solaris 2 - osname = "solaris" - release = "%d.%s" % (int(release[0]) - 3, release[2:]) - # fall through to standard osname-release-machine representation - elif osname[:4] == "irix": # could be "irix64"! - return "%s-%s" % (osname, release) - elif osname[:3] == "aix": - return "%s-%s.%s" % (osname, version, release) - elif osname[:6] == "cygwin": - osname = "cygwin" - rel_re = re.compile(r'[\d.]+') - m = rel_re.match(release) - if m: - release = m.group() - elif osname[:6] == "darwin": - # - # For our purposes, we'll assume that the system version from - # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set - # to. This makes the compatibility story a bit more sane because the - # machine is going to compile and link as if it were - # MACOSX_DEPLOYMENT_TARGET. - cfgvars = get_config_vars() - macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') - - if True: - # Always calculate the release of the running machine, - # needed to determine if we can build fat binaries or not. - - macrelease = macver - # Get the system version. Reading this plist is a documented - # way to get the system version (see the documentation for - # the Gestalt Manager) - try: - f = open('/System/Library/CoreServices/SystemVersion.plist') - except IOError: - # We're on a plain darwin box, fall back to the default - # behaviour. - pass - else: - try: - m = re.search(r'ProductUserVisibleVersion\s*' - r'(.*?)', f.read()) - finally: - f.close() - if m is not None: - macrelease = '.'.join(m.group(1).split('.')[:2]) - # else: fall back to the default behaviour - - if not macver: - macver = macrelease - - if macver: - release = macver - osname = "macosx" - - if ((macrelease + '.') >= '10.4.' and - '-arch' in get_config_vars().get('CFLAGS', '').strip()): - # The universal build will build fat binaries, but not on - # systems before 10.4 - # - # Try to detect 4-way universal builds, those have machine-type - # 'universal' instead of 'fat'. - - machine = 'fat' - cflags = get_config_vars().get('CFLAGS') - - archs = re.findall(r'-arch\s+(\S+)', cflags) - archs = tuple(sorted(set(archs))) - - if len(archs) == 1: - machine = archs[0] - elif archs == ('i386', 'ppc'): - machine = 'fat' - elif archs == ('i386', 'x86_64'): - machine = 'intel' - elif archs == ('i386', 'ppc', 'x86_64'): - machine = 'fat3' - elif archs == ('ppc64', 'x86_64'): - machine = 'fat64' - elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): - machine = 'universal' - else: - raise ValueError( - "Don't know machine value for archs=%r" % (archs,)) - - elif machine == 'i386': - # On OSX the machine type returned by uname is always the - # 32-bit variant, even if the executable architecture is - # the 64-bit variant - if sys.maxsize >= 2**32: - machine = 'x86_64' - - elif machine in ('PowerPC', 'Power_Macintosh'): - # Pick a sane name for the PPC architecture. - # See 'i386' case - if sys.maxsize >= 2**32: - machine = 'ppc64' - else: - machine = 'ppc' - - return "%s-%s-%s" % (osname, release, machine) - - -def get_python_version(): - return _PY_VERSION_SHORT - - -def _print_dict(title, data): - for index, (key, value) in enumerate(sorted(data.items())): - if index == 0: - print('%s: ' % (title)) - print('\t%s = "%s"' % (key, value)) - - -def _main(): - """Display all information sysconfig detains.""" - print('Platform: "%s"' % get_platform()) - print('Python version: "%s"' % get_python_version()) - print('Current installation scheme: "%s"' % _get_default_scheme()) - print() - _print_dict('Paths', get_paths()) - print() - _print_dict('Variables', get_config_vars()) - - -if __name__ == '__main__': - _main() diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py deleted file mode 100644 index d66d856..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py +++ /dev/null @@ -1,2607 +0,0 @@ -#------------------------------------------------------------------- -# tarfile.py -#------------------------------------------------------------------- -# Copyright (C) 2002 Lars Gustaebel -# All rights reserved. -# -# 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. -# -from __future__ import print_function - -"""Read from and write to tar format archives. -""" - -__version__ = "$Revision$" - -version = "0.9.0" -__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" -__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" -__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" -__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." - -#--------- -# Imports -#--------- -import sys -import os -import stat -import errno -import time -import struct -import copy -import re - -try: - import grp, pwd -except ImportError: - grp = pwd = None - -# os.symlink on Windows prior to 6.0 raises NotImplementedError -symlink_exception = (AttributeError, NotImplementedError) -try: - # WindowsError (1314) will be raised if the caller does not hold the - # SeCreateSymbolicLinkPrivilege privilege - symlink_exception += (WindowsError,) -except NameError: - pass - -# from tarfile import * -__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] - -if sys.version_info[0] < 3: - import __builtin__ as builtins -else: - import builtins - -_open = builtins.open # Since 'open' is TarFile.open - -#--------------------------------------------------------- -# tar constants -#--------------------------------------------------------- -NUL = b"\0" # the null character -BLOCKSIZE = 512 # length of processing blocks -RECORDSIZE = BLOCKSIZE * 20 # length of records -GNU_MAGIC = b"ustar \0" # magic gnu tar string -POSIX_MAGIC = b"ustar\x0000" # magic posix tar string - -LENGTH_NAME = 100 # maximum length of a filename -LENGTH_LINK = 100 # maximum length of a linkname -LENGTH_PREFIX = 155 # maximum length of the prefix field - -REGTYPE = b"0" # regular file -AREGTYPE = b"\0" # regular file -LNKTYPE = b"1" # link (inside tarfile) -SYMTYPE = b"2" # symbolic link -CHRTYPE = b"3" # character special device -BLKTYPE = b"4" # block special device -DIRTYPE = b"5" # directory -FIFOTYPE = b"6" # fifo special device -CONTTYPE = b"7" # contiguous file - -GNUTYPE_LONGNAME = b"L" # GNU tar longname -GNUTYPE_LONGLINK = b"K" # GNU tar longlink -GNUTYPE_SPARSE = b"S" # GNU tar sparse file - -XHDTYPE = b"x" # POSIX.1-2001 extended header -XGLTYPE = b"g" # POSIX.1-2001 global header -SOLARIS_XHDTYPE = b"X" # Solaris extended header - -USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format -GNU_FORMAT = 1 # GNU tar format -PAX_FORMAT = 2 # POSIX.1-2001 (pax) format -DEFAULT_FORMAT = GNU_FORMAT - -#--------------------------------------------------------- -# tarfile constants -#--------------------------------------------------------- -# File types that tarfile supports: -SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, - SYMTYPE, DIRTYPE, FIFOTYPE, - CONTTYPE, CHRTYPE, BLKTYPE, - GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# File types that will be treated as a regular file. -REGULAR_TYPES = (REGTYPE, AREGTYPE, - CONTTYPE, GNUTYPE_SPARSE) - -# File types that are part of the GNU tar format. -GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# Fields from a pax header that override a TarInfo attribute. -PAX_FIELDS = ("path", "linkpath", "size", "mtime", - "uid", "gid", "uname", "gname") - -# Fields from a pax header that are affected by hdrcharset. -PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) - -# Fields in a pax header that are numbers, all other fields -# are treated as strings. -PAX_NUMBER_FIELDS = { - "atime": float, - "ctime": float, - "mtime": float, - "uid": int, - "gid": int, - "size": int -} - -#--------------------------------------------------------- -# Bits used in the mode field, values in octal. -#--------------------------------------------------------- -S_IFLNK = 0o120000 # symbolic link -S_IFREG = 0o100000 # regular file -S_IFBLK = 0o060000 # block device -S_IFDIR = 0o040000 # directory -S_IFCHR = 0o020000 # character device -S_IFIFO = 0o010000 # fifo - -TSUID = 0o4000 # set UID on execution -TSGID = 0o2000 # set GID on execution -TSVTX = 0o1000 # reserved - -TUREAD = 0o400 # read by owner -TUWRITE = 0o200 # write by owner -TUEXEC = 0o100 # execute/search by owner -TGREAD = 0o040 # read by group -TGWRITE = 0o020 # write by group -TGEXEC = 0o010 # execute/search by group -TOREAD = 0o004 # read by other -TOWRITE = 0o002 # write by other -TOEXEC = 0o001 # execute/search by other - -#--------------------------------------------------------- -# initialization -#--------------------------------------------------------- -if os.name in ("nt", "ce"): - ENCODING = "utf-8" -else: - ENCODING = sys.getfilesystemencoding() - -#--------------------------------------------------------- -# Some useful functions -#--------------------------------------------------------- - -def stn(s, length, encoding, errors): - """Convert a string to a null-terminated bytes object. - """ - s = s.encode(encoding, errors) - return s[:length] + (length - len(s)) * NUL - -def nts(s, encoding, errors): - """Convert a null-terminated bytes object to a string. - """ - p = s.find(b"\0") - if p != -1: - s = s[:p] - return s.decode(encoding, errors) - -def nti(s): - """Convert a number field to a python number. - """ - # There are two possible encodings for a number field, see - # itn() below. - if s[0] != chr(0o200): - try: - n = int(nts(s, "ascii", "strict") or "0", 8) - except ValueError: - raise InvalidHeaderError("invalid header") - else: - n = 0 - for i in range(len(s) - 1): - n <<= 8 - n += ord(s[i + 1]) - return n - -def itn(n, digits=8, format=DEFAULT_FORMAT): - """Convert a python number to a number field. - """ - # POSIX 1003.1-1988 requires numbers to be encoded as a string of - # octal digits followed by a null-byte, this allows values up to - # (8**(digits-1))-1. GNU tar allows storing numbers greater than - # that if necessary. A leading 0o200 byte indicates this particular - # encoding, the following digits-1 bytes are a big-endian - # representation. This allows values up to (256**(digits-1))-1. - if 0 <= n < 8 ** (digits - 1): - s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL - else: - if format != GNU_FORMAT or n >= 256 ** (digits - 1): - raise ValueError("overflow in number field") - - if n < 0: - # XXX We mimic GNU tar's behaviour with negative numbers, - # this could raise OverflowError. - n = struct.unpack("L", struct.pack("l", n))[0] - - s = bytearray() - for i in range(digits - 1): - s.insert(0, n & 0o377) - n >>= 8 - s.insert(0, 0o200) - return s - -def calc_chksums(buf): - """Calculate the checksum for a member's header by summing up all - characters except for the chksum field which is treated as if - it was filled with spaces. According to the GNU tar sources, - some tars (Sun and NeXT) calculate chksum with signed char, - which will be different if there are chars in the buffer with - the high bit set. So we calculate two checksums, unsigned and - signed. - """ - unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) - signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) - return unsigned_chksum, signed_chksum - -def copyfileobj(src, dst, length=None): - """Copy length bytes from fileobj src to fileobj dst. - If length is None, copy the entire content. - """ - if length == 0: - return - if length is None: - while True: - buf = src.read(16*1024) - if not buf: - break - dst.write(buf) - return - - BUFSIZE = 16 * 1024 - blocks, remainder = divmod(length, BUFSIZE) - for b in range(blocks): - buf = src.read(BUFSIZE) - if len(buf) < BUFSIZE: - raise IOError("end of file reached") - dst.write(buf) - - if remainder != 0: - buf = src.read(remainder) - if len(buf) < remainder: - raise IOError("end of file reached") - dst.write(buf) - return - -filemode_table = ( - ((S_IFLNK, "l"), - (S_IFREG, "-"), - (S_IFBLK, "b"), - (S_IFDIR, "d"), - (S_IFCHR, "c"), - (S_IFIFO, "p")), - - ((TUREAD, "r"),), - ((TUWRITE, "w"),), - ((TUEXEC|TSUID, "s"), - (TSUID, "S"), - (TUEXEC, "x")), - - ((TGREAD, "r"),), - ((TGWRITE, "w"),), - ((TGEXEC|TSGID, "s"), - (TSGID, "S"), - (TGEXEC, "x")), - - ((TOREAD, "r"),), - ((TOWRITE, "w"),), - ((TOEXEC|TSVTX, "t"), - (TSVTX, "T"), - (TOEXEC, "x")) -) - -def filemode(mode): - """Convert a file's mode to a string of the form - -rwxrwxrwx. - Used by TarFile.list() - """ - perm = [] - for table in filemode_table: - for bit, char in table: - if mode & bit == bit: - perm.append(char) - break - else: - perm.append("-") - return "".join(perm) - -class TarError(Exception): - """Base exception.""" - pass -class ExtractError(TarError): - """General exception for extract errors.""" - pass -class ReadError(TarError): - """Exception for unreadable tar archives.""" - pass -class CompressionError(TarError): - """Exception for unavailable compression methods.""" - pass -class StreamError(TarError): - """Exception for unsupported operations on stream-like TarFiles.""" - pass -class HeaderError(TarError): - """Base exception for header errors.""" - pass -class EmptyHeaderError(HeaderError): - """Exception for empty headers.""" - pass -class TruncatedHeaderError(HeaderError): - """Exception for truncated headers.""" - pass -class EOFHeaderError(HeaderError): - """Exception for end of file headers.""" - pass -class InvalidHeaderError(HeaderError): - """Exception for invalid headers.""" - pass -class SubsequentHeaderError(HeaderError): - """Exception for missing and invalid extended headers.""" - pass - -#--------------------------- -# internal stream interface -#--------------------------- -class _LowLevelFile(object): - """Low-level file object. Supports reading and writing. - It is used instead of a regular file object for streaming - access. - """ - - def __init__(self, name, mode): - mode = { - "r": os.O_RDONLY, - "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, - }[mode] - if hasattr(os, "O_BINARY"): - mode |= os.O_BINARY - self.fd = os.open(name, mode, 0o666) - - def close(self): - os.close(self.fd) - - def read(self, size): - return os.read(self.fd, size) - - def write(self, s): - os.write(self.fd, s) - -class _Stream(object): - """Class that serves as an adapter between TarFile and - a stream-like object. The stream-like object only - needs to have a read() or write() method and is accessed - blockwise. Use of gzip or bzip2 compression is possible. - A stream-like object could be for example: sys.stdin, - sys.stdout, a socket, a tape device etc. - - _Stream is intended to be used only internally. - """ - - def __init__(self, name, mode, comptype, fileobj, bufsize): - """Construct a _Stream object. - """ - self._extfileobj = True - if fileobj is None: - fileobj = _LowLevelFile(name, mode) - self._extfileobj = False - - if comptype == '*': - # Enable transparent compression detection for the - # stream interface - fileobj = _StreamProxy(fileobj) - comptype = fileobj.getcomptype() - - self.name = name or "" - self.mode = mode - self.comptype = comptype - self.fileobj = fileobj - self.bufsize = bufsize - self.buf = b"" - self.pos = 0 - self.closed = False - - try: - if comptype == "gz": - try: - import zlib - except ImportError: - raise CompressionError("zlib module is not available") - self.zlib = zlib - self.crc = zlib.crc32(b"") - if mode == "r": - self._init_read_gz() - else: - self._init_write_gz() - - if comptype == "bz2": - try: - import bz2 - except ImportError: - raise CompressionError("bz2 module is not available") - if mode == "r": - self.dbuf = b"" - self.cmp = bz2.BZ2Decompressor() - else: - self.cmp = bz2.BZ2Compressor() - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - def __del__(self): - if hasattr(self, "closed") and not self.closed: - self.close() - - def _init_write_gz(self): - """Initialize for writing with gzip compression. - """ - self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, - -self.zlib.MAX_WBITS, - self.zlib.DEF_MEM_LEVEL, - 0) - timestamp = struct.pack(" self.bufsize: - self.fileobj.write(self.buf[:self.bufsize]) - self.buf = self.buf[self.bufsize:] - - def close(self): - """Close the _Stream object. No operation should be - done on it afterwards. - """ - if self.closed: - return - - if self.mode == "w" and self.comptype != "tar": - self.buf += self.cmp.flush() - - if self.mode == "w" and self.buf: - self.fileobj.write(self.buf) - self.buf = b"" - if self.comptype == "gz": - # The native zlib crc is an unsigned 32-bit integer, but - # the Python wrapper implicitly casts that to a signed C - # long. So, on a 32-bit box self.crc may "look negative", - # while the same crc on a 64-bit box may "look positive". - # To avoid irksome warnings from the `struct` module, force - # it to look positive on all boxes. - self.fileobj.write(struct.pack("= 0: - blocks, remainder = divmod(pos - self.pos, self.bufsize) - for i in range(blocks): - self.read(self.bufsize) - self.read(remainder) - else: - raise StreamError("seeking backwards is not allowed") - return self.pos - - def read(self, size=None): - """Return the next size number of bytes from the stream. - If size is not defined, return all bytes of the stream - up to EOF. - """ - if size is None: - t = [] - while True: - buf = self._read(self.bufsize) - if not buf: - break - t.append(buf) - buf = "".join(t) - else: - buf = self._read(size) - self.pos += len(buf) - return buf - - def _read(self, size): - """Return size bytes from the stream. - """ - if self.comptype == "tar": - return self.__read(size) - - c = len(self.dbuf) - while c < size: - buf = self.__read(self.bufsize) - if not buf: - break - try: - buf = self.cmp.decompress(buf) - except IOError: - raise ReadError("invalid compressed data") - self.dbuf += buf - c += len(buf) - buf = self.dbuf[:size] - self.dbuf = self.dbuf[size:] - return buf - - def __read(self, size): - """Return size bytes from stream. If internal buffer is empty, - read another block from the stream. - """ - c = len(self.buf) - while c < size: - buf = self.fileobj.read(self.bufsize) - if not buf: - break - self.buf += buf - c += len(buf) - buf = self.buf[:size] - self.buf = self.buf[size:] - return buf -# class _Stream - -class _StreamProxy(object): - """Small proxy class that enables transparent compression - detection for the Stream interface (mode 'r|*'). - """ - - def __init__(self, fileobj): - self.fileobj = fileobj - self.buf = self.fileobj.read(BLOCKSIZE) - - def read(self, size): - self.read = self.fileobj.read - return self.buf - - def getcomptype(self): - if self.buf.startswith(b"\037\213\010"): - return "gz" - if self.buf.startswith(b"BZh91"): - return "bz2" - return "tar" - - def close(self): - self.fileobj.close() -# class StreamProxy - -class _BZ2Proxy(object): - """Small proxy class that enables external file object - support for "r:bz2" and "w:bz2" modes. This is actually - a workaround for a limitation in bz2 module's BZ2File - class which (unlike gzip.GzipFile) has no support for - a file object argument. - """ - - blocksize = 16 * 1024 - - def __init__(self, fileobj, mode): - self.fileobj = fileobj - self.mode = mode - self.name = getattr(self.fileobj, "name", None) - self.init() - - def init(self): - import bz2 - self.pos = 0 - if self.mode == "r": - self.bz2obj = bz2.BZ2Decompressor() - self.fileobj.seek(0) - self.buf = b"" - else: - self.bz2obj = bz2.BZ2Compressor() - - def read(self, size): - x = len(self.buf) - while x < size: - raw = self.fileobj.read(self.blocksize) - if not raw: - break - data = self.bz2obj.decompress(raw) - self.buf += data - x += len(data) - - buf = self.buf[:size] - self.buf = self.buf[size:] - self.pos += len(buf) - return buf - - def seek(self, pos): - if pos < self.pos: - self.init() - self.read(pos - self.pos) - - def tell(self): - return self.pos - - def write(self, data): - self.pos += len(data) - raw = self.bz2obj.compress(data) - self.fileobj.write(raw) - - def close(self): - if self.mode == "w": - raw = self.bz2obj.flush() - self.fileobj.write(raw) -# class _BZ2Proxy - -#------------------------ -# Extraction file object -#------------------------ -class _FileInFile(object): - """A thin wrapper around an existing file object that - provides a part of its data as an individual file - object. - """ - - def __init__(self, fileobj, offset, size, blockinfo=None): - self.fileobj = fileobj - self.offset = offset - self.size = size - self.position = 0 - - if blockinfo is None: - blockinfo = [(0, size)] - - # Construct a map with data and zero blocks. - self.map_index = 0 - self.map = [] - lastpos = 0 - realpos = self.offset - for offset, size in blockinfo: - if offset > lastpos: - self.map.append((False, lastpos, offset, None)) - self.map.append((True, offset, offset + size, realpos)) - realpos += size - lastpos = offset + size - if lastpos < self.size: - self.map.append((False, lastpos, self.size, None)) - - def seekable(self): - if not hasattr(self.fileobj, "seekable"): - # XXX gzip.GzipFile and bz2.BZ2File - return True - return self.fileobj.seekable() - - def tell(self): - """Return the current file position. - """ - return self.position - - def seek(self, position): - """Seek to a position in the file. - """ - self.position = position - - def read(self, size=None): - """Read data from the file. - """ - if size is None: - size = self.size - self.position - else: - size = min(size, self.size - self.position) - - buf = b"" - while size > 0: - while True: - data, start, stop, offset = self.map[self.map_index] - if start <= self.position < stop: - break - else: - self.map_index += 1 - if self.map_index == len(self.map): - self.map_index = 0 - length = min(size, stop - self.position) - if data: - self.fileobj.seek(offset + (self.position - start)) - buf += self.fileobj.read(length) - else: - buf += NUL * length - size -= length - self.position += length - return buf -#class _FileInFile - - -class ExFileObject(object): - """File-like object for reading an archive member. - Is returned by TarFile.extractfile(). - """ - blocksize = 1024 - - def __init__(self, tarfile, tarinfo): - self.fileobj = _FileInFile(tarfile.fileobj, - tarinfo.offset_data, - tarinfo.size, - tarinfo.sparse) - self.name = tarinfo.name - self.mode = "r" - self.closed = False - self.size = tarinfo.size - - self.position = 0 - self.buffer = b"" - - def readable(self): - return True - - def writable(self): - return False - - def seekable(self): - return self.fileobj.seekable() - - def read(self, size=None): - """Read at most size bytes from the file. If size is not - present or None, read all data until EOF is reached. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - buf = b"" - if self.buffer: - if size is None: - buf = self.buffer - self.buffer = b"" - else: - buf = self.buffer[:size] - self.buffer = self.buffer[size:] - - if size is None: - buf += self.fileobj.read() - else: - buf += self.fileobj.read(size - len(buf)) - - self.position += len(buf) - return buf - - # XXX TextIOWrapper uses the read1() method. - read1 = read - - def readline(self, size=-1): - """Read one entire line from the file. If size is present - and non-negative, return a string with at most that - size, which may be an incomplete line. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - pos = self.buffer.find(b"\n") + 1 - if pos == 0: - # no newline found. - while True: - buf = self.fileobj.read(self.blocksize) - self.buffer += buf - if not buf or b"\n" in buf: - pos = self.buffer.find(b"\n") + 1 - if pos == 0: - # no newline found. - pos = len(self.buffer) - break - - if size != -1: - pos = min(size, pos) - - buf = self.buffer[:pos] - self.buffer = self.buffer[pos:] - self.position += len(buf) - return buf - - def readlines(self): - """Return a list with all remaining lines. - """ - result = [] - while True: - line = self.readline() - if not line: break - result.append(line) - return result - - def tell(self): - """Return the current file position. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - return self.position - - def seek(self, pos, whence=os.SEEK_SET): - """Seek to a position in the file. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - if whence == os.SEEK_SET: - self.position = min(max(pos, 0), self.size) - elif whence == os.SEEK_CUR: - if pos < 0: - self.position = max(self.position + pos, 0) - else: - self.position = min(self.position + pos, self.size) - elif whence == os.SEEK_END: - self.position = max(min(self.size + pos, self.size), 0) - else: - raise ValueError("Invalid argument") - - self.buffer = b"" - self.fileobj.seek(self.position) - - def close(self): - """Close the file object. - """ - self.closed = True - - def __iter__(self): - """Get an iterator over the file's lines. - """ - while True: - line = self.readline() - if not line: - break - yield line -#class ExFileObject - -#------------------ -# Exported Classes -#------------------ -class TarInfo(object): - """Informational class which holds the details about an - archive member given by a tar header block. - TarInfo objects are returned by TarFile.getmember(), - TarFile.getmembers() and TarFile.gettarinfo() and are - usually created internally. - """ - - __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", - "chksum", "type", "linkname", "uname", "gname", - "devmajor", "devminor", - "offset", "offset_data", "pax_headers", "sparse", - "tarfile", "_sparse_structs", "_link_target") - - def __init__(self, name=""): - """Construct a TarInfo object. name is the optional name - of the member. - """ - self.name = name # member name - self.mode = 0o644 # file permissions - self.uid = 0 # user id - self.gid = 0 # group id - self.size = 0 # file size - self.mtime = 0 # modification time - self.chksum = 0 # header checksum - self.type = REGTYPE # member type - self.linkname = "" # link name - self.uname = "" # user name - self.gname = "" # group name - self.devmajor = 0 # device major number - self.devminor = 0 # device minor number - - self.offset = 0 # the tar header starts here - self.offset_data = 0 # the file's data starts here - - self.sparse = None # sparse member information - self.pax_headers = {} # pax header information - - # In pax headers the "name" and "linkname" field are called - # "path" and "linkpath". - def _getpath(self): - return self.name - def _setpath(self, name): - self.name = name - path = property(_getpath, _setpath) - - def _getlinkpath(self): - return self.linkname - def _setlinkpath(self, linkname): - self.linkname = linkname - linkpath = property(_getlinkpath, _setlinkpath) - - def __repr__(self): - return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) - - def get_info(self): - """Return the TarInfo's attributes as a dictionary. - """ - info = { - "name": self.name, - "mode": self.mode & 0o7777, - "uid": self.uid, - "gid": self.gid, - "size": self.size, - "mtime": self.mtime, - "chksum": self.chksum, - "type": self.type, - "linkname": self.linkname, - "uname": self.uname, - "gname": self.gname, - "devmajor": self.devmajor, - "devminor": self.devminor - } - - if info["type"] == DIRTYPE and not info["name"].endswith("/"): - info["name"] += "/" - - return info - - def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): - """Return a tar header as a string of 512 byte blocks. - """ - info = self.get_info() - - if format == USTAR_FORMAT: - return self.create_ustar_header(info, encoding, errors) - elif format == GNU_FORMAT: - return self.create_gnu_header(info, encoding, errors) - elif format == PAX_FORMAT: - return self.create_pax_header(info, encoding) - else: - raise ValueError("invalid format") - - def create_ustar_header(self, info, encoding, errors): - """Return the object as a ustar header block. - """ - info["magic"] = POSIX_MAGIC - - if len(info["linkname"]) > LENGTH_LINK: - raise ValueError("linkname is too long") - - if len(info["name"]) > LENGTH_NAME: - info["prefix"], info["name"] = self._posix_split_name(info["name"]) - - return self._create_header(info, USTAR_FORMAT, encoding, errors) - - def create_gnu_header(self, info, encoding, errors): - """Return the object as a GNU header block sequence. - """ - info["magic"] = GNU_MAGIC - - buf = b"" - if len(info["linkname"]) > LENGTH_LINK: - buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) - - if len(info["name"]) > LENGTH_NAME: - buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) - - return buf + self._create_header(info, GNU_FORMAT, encoding, errors) - - def create_pax_header(self, info, encoding): - """Return the object as a ustar header block. If it cannot be - represented this way, prepend a pax extended header sequence - with supplement information. - """ - info["magic"] = POSIX_MAGIC - pax_headers = self.pax_headers.copy() - - # Test string fields for values that exceed the field length or cannot - # be represented in ASCII encoding. - for name, hname, length in ( - ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), - ("uname", "uname", 32), ("gname", "gname", 32)): - - if hname in pax_headers: - # The pax header has priority. - continue - - # Try to encode the string as ASCII. - try: - info[name].encode("ascii", "strict") - except UnicodeEncodeError: - pax_headers[hname] = info[name] - continue - - if len(info[name]) > length: - pax_headers[hname] = info[name] - - # Test number fields for values that exceed the field limit or values - # that like to be stored as float. - for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): - if name in pax_headers: - # The pax header has priority. Avoid overflow. - info[name] = 0 - continue - - val = info[name] - if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): - pax_headers[name] = str(val) - info[name] = 0 - - # Create a pax extended header if necessary. - if pax_headers: - buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) - else: - buf = b"" - - return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") - - @classmethod - def create_pax_global_header(cls, pax_headers): - """Return the object as a pax global header block sequence. - """ - return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") - - def _posix_split_name(self, name): - """Split a name longer than 100 chars into a prefix - and a name part. - """ - prefix = name[:LENGTH_PREFIX + 1] - while prefix and prefix[-1] != "/": - prefix = prefix[:-1] - - name = name[len(prefix):] - prefix = prefix[:-1] - - if not prefix or len(name) > LENGTH_NAME: - raise ValueError("name is too long") - return prefix, name - - @staticmethod - def _create_header(info, format, encoding, errors): - """Return a header block. info is a dictionary with file - information, format must be one of the *_FORMAT constants. - """ - parts = [ - stn(info.get("name", ""), 100, encoding, errors), - itn(info.get("mode", 0) & 0o7777, 8, format), - itn(info.get("uid", 0), 8, format), - itn(info.get("gid", 0), 8, format), - itn(info.get("size", 0), 12, format), - itn(info.get("mtime", 0), 12, format), - b" ", # checksum field - info.get("type", REGTYPE), - stn(info.get("linkname", ""), 100, encoding, errors), - info.get("magic", POSIX_MAGIC), - stn(info.get("uname", ""), 32, encoding, errors), - stn(info.get("gname", ""), 32, encoding, errors), - itn(info.get("devmajor", 0), 8, format), - itn(info.get("devminor", 0), 8, format), - stn(info.get("prefix", ""), 155, encoding, errors) - ] - - buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) - chksum = calc_chksums(buf[-BLOCKSIZE:])[0] - buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] - return buf - - @staticmethod - def _create_payload(payload): - """Return the string payload filled with zero bytes - up to the next 512 byte border. - """ - blocks, remainder = divmod(len(payload), BLOCKSIZE) - if remainder > 0: - payload += (BLOCKSIZE - remainder) * NUL - return payload - - @classmethod - def _create_gnu_long_header(cls, name, type, encoding, errors): - """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence - for name. - """ - name = name.encode(encoding, errors) + NUL - - info = {} - info["name"] = "././@LongLink" - info["type"] = type - info["size"] = len(name) - info["magic"] = GNU_MAGIC - - # create extended header + name blocks. - return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ - cls._create_payload(name) - - @classmethod - def _create_pax_generic_header(cls, pax_headers, type, encoding): - """Return a POSIX.1-2008 extended or global header sequence - that contains a list of keyword, value pairs. The values - must be strings. - """ - # Check if one of the fields contains surrogate characters and thereby - # forces hdrcharset=BINARY, see _proc_pax() for more information. - binary = False - for keyword, value in pax_headers.items(): - try: - value.encode("utf8", "strict") - except UnicodeEncodeError: - binary = True - break - - records = b"" - if binary: - # Put the hdrcharset field at the beginning of the header. - records += b"21 hdrcharset=BINARY\n" - - for keyword, value in pax_headers.items(): - keyword = keyword.encode("utf8") - if binary: - # Try to restore the original byte representation of `value'. - # Needless to say, that the encoding must match the string. - value = value.encode(encoding, "surrogateescape") - else: - value = value.encode("utf8") - - l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' - n = p = 0 - while True: - n = l + len(str(p)) - if n == p: - break - p = n - records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" - - # We use a hardcoded "././@PaxHeader" name like star does - # instead of the one that POSIX recommends. - info = {} - info["name"] = "././@PaxHeader" - info["type"] = type - info["size"] = len(records) - info["magic"] = POSIX_MAGIC - - # Create pax header + record blocks. - return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ - cls._create_payload(records) - - @classmethod - def frombuf(cls, buf, encoding, errors): - """Construct a TarInfo object from a 512 byte bytes object. - """ - if len(buf) == 0: - raise EmptyHeaderError("empty header") - if len(buf) != BLOCKSIZE: - raise TruncatedHeaderError("truncated header") - if buf.count(NUL) == BLOCKSIZE: - raise EOFHeaderError("end of file header") - - chksum = nti(buf[148:156]) - if chksum not in calc_chksums(buf): - raise InvalidHeaderError("bad checksum") - - obj = cls() - obj.name = nts(buf[0:100], encoding, errors) - obj.mode = nti(buf[100:108]) - obj.uid = nti(buf[108:116]) - obj.gid = nti(buf[116:124]) - obj.size = nti(buf[124:136]) - obj.mtime = nti(buf[136:148]) - obj.chksum = chksum - obj.type = buf[156:157] - obj.linkname = nts(buf[157:257], encoding, errors) - obj.uname = nts(buf[265:297], encoding, errors) - obj.gname = nts(buf[297:329], encoding, errors) - obj.devmajor = nti(buf[329:337]) - obj.devminor = nti(buf[337:345]) - prefix = nts(buf[345:500], encoding, errors) - - # Old V7 tar format represents a directory as a regular - # file with a trailing slash. - if obj.type == AREGTYPE and obj.name.endswith("/"): - obj.type = DIRTYPE - - # The old GNU sparse format occupies some of the unused - # space in the buffer for up to 4 sparse structures. - # Save the them for later processing in _proc_sparse(). - if obj.type == GNUTYPE_SPARSE: - pos = 386 - structs = [] - for i in range(4): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[482]) - origsize = nti(buf[483:495]) - obj._sparse_structs = (structs, isextended, origsize) - - # Remove redundant slashes from directories. - if obj.isdir(): - obj.name = obj.name.rstrip("/") - - # Reconstruct a ustar longname. - if prefix and obj.type not in GNU_TYPES: - obj.name = prefix + "/" + obj.name - return obj - - @classmethod - def fromtarfile(cls, tarfile): - """Return the next TarInfo object from TarFile object - tarfile. - """ - buf = tarfile.fileobj.read(BLOCKSIZE) - obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) - obj.offset = tarfile.fileobj.tell() - BLOCKSIZE - return obj._proc_member(tarfile) - - #-------------------------------------------------------------------------- - # The following are methods that are called depending on the type of a - # member. The entry point is _proc_member() which can be overridden in a - # subclass to add custom _proc_*() methods. A _proc_*() method MUST - # implement the following - # operations: - # 1. Set self.offset_data to the position where the data blocks begin, - # if there is data that follows. - # 2. Set tarfile.offset to the position where the next member's header will - # begin. - # 3. Return self or another valid TarInfo object. - def _proc_member(self, tarfile): - """Choose the right processing method depending on - the type and call it. - """ - if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): - return self._proc_gnulong(tarfile) - elif self.type == GNUTYPE_SPARSE: - return self._proc_sparse(tarfile) - elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): - return self._proc_pax(tarfile) - else: - return self._proc_builtin(tarfile) - - def _proc_builtin(self, tarfile): - """Process a builtin type or an unknown type which - will be treated as a regular file. - """ - self.offset_data = tarfile.fileobj.tell() - offset = self.offset_data - if self.isreg() or self.type not in SUPPORTED_TYPES: - # Skip the following data blocks. - offset += self._block(self.size) - tarfile.offset = offset - - # Patch the TarInfo object with saved global - # header information. - self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) - - return self - - def _proc_gnulong(self, tarfile): - """Process the blocks that hold a GNU longname - or longlink member. - """ - buf = tarfile.fileobj.read(self._block(self.size)) - - # Fetch the next header and process it. - try: - next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") - - # Patch the TarInfo object from the next header with - # the longname information. - next.offset = self.offset - if self.type == GNUTYPE_LONGNAME: - next.name = nts(buf, tarfile.encoding, tarfile.errors) - elif self.type == GNUTYPE_LONGLINK: - next.linkname = nts(buf, tarfile.encoding, tarfile.errors) - - return next - - def _proc_sparse(self, tarfile): - """Process a GNU sparse header plus extra headers. - """ - # We already collected some sparse structures in frombuf(). - structs, isextended, origsize = self._sparse_structs - del self._sparse_structs - - # Collect sparse structures from extended header blocks. - while isextended: - buf = tarfile.fileobj.read(BLOCKSIZE) - pos = 0 - for i in range(21): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - if offset and numbytes: - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[504]) - self.sparse = structs - - self.offset_data = tarfile.fileobj.tell() - tarfile.offset = self.offset_data + self._block(self.size) - self.size = origsize - return self - - def _proc_pax(self, tarfile): - """Process an extended or global header as described in - POSIX.1-2008. - """ - # Read the header information. - buf = tarfile.fileobj.read(self._block(self.size)) - - # A pax header stores supplemental information for either - # the following file (extended) or all following files - # (global). - if self.type == XGLTYPE: - pax_headers = tarfile.pax_headers - else: - pax_headers = tarfile.pax_headers.copy() - - # Check if the pax header contains a hdrcharset field. This tells us - # the encoding of the path, linkpath, uname and gname fields. Normally, - # these fields are UTF-8 encoded but since POSIX.1-2008 tar - # implementations are allowed to store them as raw binary strings if - # the translation to UTF-8 fails. - match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) - if match is not None: - pax_headers["hdrcharset"] = match.group(1).decode("utf8") - - # For the time being, we don't care about anything other than "BINARY". - # The only other value that is currently allowed by the standard is - # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. - hdrcharset = pax_headers.get("hdrcharset") - if hdrcharset == "BINARY": - encoding = tarfile.encoding - else: - encoding = "utf8" - - # Parse pax header information. A record looks like that: - # "%d %s=%s\n" % (length, keyword, value). length is the size - # of the complete record including the length field itself and - # the newline. keyword and value are both UTF-8 encoded strings. - regex = re.compile(br"(\d+) ([^=]+)=") - pos = 0 - while True: - match = regex.match(buf, pos) - if not match: - break - - length, keyword = match.groups() - length = int(length) - value = buf[match.end(2) + 1:match.start(1) + length - 1] - - # Normally, we could just use "utf8" as the encoding and "strict" - # as the error handler, but we better not take the risk. For - # example, GNU tar <= 1.23 is known to store filenames it cannot - # translate to UTF-8 as raw strings (unfortunately without a - # hdrcharset=BINARY header). - # We first try the strict standard encoding, and if that fails we - # fall back on the user's encoding and error handler. - keyword = self._decode_pax_field(keyword, "utf8", "utf8", - tarfile.errors) - if keyword in PAX_NAME_FIELDS: - value = self._decode_pax_field(value, encoding, tarfile.encoding, - tarfile.errors) - else: - value = self._decode_pax_field(value, "utf8", "utf8", - tarfile.errors) - - pax_headers[keyword] = value - pos += length - - # Fetch the next header. - try: - next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") - - # Process GNU sparse information. - if "GNU.sparse.map" in pax_headers: - # GNU extended sparse format version 0.1. - self._proc_gnusparse_01(next, pax_headers) - - elif "GNU.sparse.size" in pax_headers: - # GNU extended sparse format version 0.0. - self._proc_gnusparse_00(next, pax_headers, buf) - - elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": - # GNU extended sparse format version 1.0. - self._proc_gnusparse_10(next, pax_headers, tarfile) - - if self.type in (XHDTYPE, SOLARIS_XHDTYPE): - # Patch the TarInfo object with the extended header info. - next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) - next.offset = self.offset - - if "size" in pax_headers: - # If the extended header replaces the size field, - # we need to recalculate the offset where the next - # header starts. - offset = next.offset_data - if next.isreg() or next.type not in SUPPORTED_TYPES: - offset += next._block(next.size) - tarfile.offset = offset - - return next - - def _proc_gnusparse_00(self, next, pax_headers, buf): - """Process a GNU tar extended sparse header, version 0.0. - """ - offsets = [] - for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): - offsets.append(int(match.group(1))) - numbytes = [] - for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): - numbytes.append(int(match.group(1))) - next.sparse = list(zip(offsets, numbytes)) - - def _proc_gnusparse_01(self, next, pax_headers): - """Process a GNU tar extended sparse header, version 0.1. - """ - sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _proc_gnusparse_10(self, next, pax_headers, tarfile): - """Process a GNU tar extended sparse header, version 1.0. - """ - fields = None - sparse = [] - buf = tarfile.fileobj.read(BLOCKSIZE) - fields, buf = buf.split(b"\n", 1) - fields = int(fields) - while len(sparse) < fields * 2: - if b"\n" not in buf: - buf += tarfile.fileobj.read(BLOCKSIZE) - number, buf = buf.split(b"\n", 1) - sparse.append(int(number)) - next.offset_data = tarfile.fileobj.tell() - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _apply_pax_info(self, pax_headers, encoding, errors): - """Replace fields with supplemental information from a previous - pax extended or global header. - """ - for keyword, value in pax_headers.items(): - if keyword == "GNU.sparse.name": - setattr(self, "path", value) - elif keyword == "GNU.sparse.size": - setattr(self, "size", int(value)) - elif keyword == "GNU.sparse.realsize": - setattr(self, "size", int(value)) - elif keyword in PAX_FIELDS: - if keyword in PAX_NUMBER_FIELDS: - try: - value = PAX_NUMBER_FIELDS[keyword](value) - except ValueError: - value = 0 - if keyword == "path": - value = value.rstrip("/") - setattr(self, keyword, value) - - self.pax_headers = pax_headers.copy() - - def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): - """Decode a single field from a pax record. - """ - try: - return value.decode(encoding, "strict") - except UnicodeDecodeError: - return value.decode(fallback_encoding, fallback_errors) - - def _block(self, count): - """Round up a byte count by BLOCKSIZE and return it, - e.g. _block(834) => 1024. - """ - blocks, remainder = divmod(count, BLOCKSIZE) - if remainder: - blocks += 1 - return blocks * BLOCKSIZE - - def isreg(self): - return self.type in REGULAR_TYPES - def isfile(self): - return self.isreg() - def isdir(self): - return self.type == DIRTYPE - def issym(self): - return self.type == SYMTYPE - def islnk(self): - return self.type == LNKTYPE - def ischr(self): - return self.type == CHRTYPE - def isblk(self): - return self.type == BLKTYPE - def isfifo(self): - return self.type == FIFOTYPE - def issparse(self): - return self.sparse is not None - def isdev(self): - return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) -# class TarInfo - -class TarFile(object): - """The TarFile Class provides an interface to tar archives. - """ - - debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) - - dereference = False # If true, add content of linked file to the - # tar file, else the link. - - ignore_zeros = False # If true, skips empty or invalid blocks and - # continues processing. - - errorlevel = 1 # If 0, fatal errors only appear in debug - # messages (if debug >= 0). If > 0, errors - # are passed to the caller as exceptions. - - format = DEFAULT_FORMAT # The format to use when creating an archive. - - encoding = ENCODING # Encoding for 8-bit character strings. - - errors = None # Error handler for unicode conversion. - - tarinfo = TarInfo # The default TarInfo class to use. - - fileobject = ExFileObject # The default ExFileObject class to use. - - def __init__(self, name=None, mode="r", fileobj=None, format=None, - tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, - errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): - """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to - read from an existing archive, 'a' to append data to an existing - file or 'w' to create a new file overwriting an existing one. `mode' - defaults to 'r'. - If `fileobj' is given, it is used for reading or writing data. If it - can be determined, `mode' is overridden by `fileobj's mode. - `fileobj' is not closed, when TarFile is closed. - """ - if len(mode) > 1 or mode not in "raw": - raise ValueError("mode must be 'r', 'a' or 'w'") - self.mode = mode - self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] - - if not fileobj: - if self.mode == "a" and not os.path.exists(name): - # Create nonexistent files in append mode. - self.mode = "w" - self._mode = "wb" - fileobj = bltn_open(name, self._mode) - self._extfileobj = False - else: - if name is None and hasattr(fileobj, "name"): - name = fileobj.name - if hasattr(fileobj, "mode"): - self._mode = fileobj.mode - self._extfileobj = True - self.name = os.path.abspath(name) if name else None - self.fileobj = fileobj - - # Init attributes. - if format is not None: - self.format = format - if tarinfo is not None: - self.tarinfo = tarinfo - if dereference is not None: - self.dereference = dereference - if ignore_zeros is not None: - self.ignore_zeros = ignore_zeros - if encoding is not None: - self.encoding = encoding - self.errors = errors - - if pax_headers is not None and self.format == PAX_FORMAT: - self.pax_headers = pax_headers - else: - self.pax_headers = {} - - if debug is not None: - self.debug = debug - if errorlevel is not None: - self.errorlevel = errorlevel - - # Init datastructures. - self.closed = False - self.members = [] # list of members as TarInfo objects - self._loaded = False # flag if all members have been read - self.offset = self.fileobj.tell() - # current position in the archive file - self.inodes = {} # dictionary caching the inodes of - # archive members already added - - try: - if self.mode == "r": - self.firstmember = None - self.firstmember = self.next() - - if self.mode == "a": - # Move to the end of the archive, - # before the first empty block. - while True: - self.fileobj.seek(self.offset) - try: - tarinfo = self.tarinfo.fromtarfile(self) - self.members.append(tarinfo) - except EOFHeaderError: - self.fileobj.seek(self.offset) - break - except HeaderError as e: - raise ReadError(str(e)) - - if self.mode in "aw": - self._loaded = True - - if self.pax_headers: - buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) - self.fileobj.write(buf) - self.offset += len(buf) - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - #-------------------------------------------------------------------------- - # Below are the classmethods which act as alternate constructors to the - # TarFile class. The open() method is the only one that is needed for - # public use; it is the "super"-constructor and is able to select an - # adequate "sub"-constructor for a particular compression using the mapping - # from OPEN_METH. - # - # This concept allows one to subclass TarFile without losing the comfort of - # the super-constructor. A sub-constructor is registered and made available - # by adding it to the mapping in OPEN_METH. - - @classmethod - def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): - """Open a tar archive for reading, writing or appending. Return - an appropriate TarFile class. - - mode: - 'r' or 'r:*' open for reading with transparent compression - 'r:' open for reading exclusively uncompressed - 'r:gz' open for reading with gzip compression - 'r:bz2' open for reading with bzip2 compression - 'a' or 'a:' open for appending, creating the file if necessary - 'w' or 'w:' open for writing without compression - 'w:gz' open for writing with gzip compression - 'w:bz2' open for writing with bzip2 compression - - 'r|*' open a stream of tar blocks with transparent compression - 'r|' open an uncompressed stream of tar blocks for reading - 'r|gz' open a gzip compressed stream of tar blocks - 'r|bz2' open a bzip2 compressed stream of tar blocks - 'w|' open an uncompressed stream for writing - 'w|gz' open a gzip compressed stream for writing - 'w|bz2' open a bzip2 compressed stream for writing - """ - - if not name and not fileobj: - raise ValueError("nothing to open") - - if mode in ("r", "r:*"): - # Find out which *open() is appropriate for opening the file. - for comptype in cls.OPEN_METH: - func = getattr(cls, cls.OPEN_METH[comptype]) - if fileobj is not None: - saved_pos = fileobj.tell() - try: - return func(name, "r", fileobj, **kwargs) - except (ReadError, CompressionError) as e: - if fileobj is not None: - fileobj.seek(saved_pos) - continue - raise ReadError("file could not be opened successfully") - - elif ":" in mode: - filemode, comptype = mode.split(":", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - # Select the *open() function according to - # given compression. - if comptype in cls.OPEN_METH: - func = getattr(cls, cls.OPEN_METH[comptype]) - else: - raise CompressionError("unknown compression type %r" % comptype) - return func(name, filemode, fileobj, **kwargs) - - elif "|" in mode: - filemode, comptype = mode.split("|", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - if filemode not in "rw": - raise ValueError("mode must be 'r' or 'w'") - - stream = _Stream(name, filemode, comptype, fileobj, bufsize) - try: - t = cls(name, filemode, stream, **kwargs) - except: - stream.close() - raise - t._extfileobj = False - return t - - elif mode in "aw": - return cls.taropen(name, mode, fileobj, **kwargs) - - raise ValueError("undiscernible mode") - - @classmethod - def taropen(cls, name, mode="r", fileobj=None, **kwargs): - """Open uncompressed tar archive name for reading or writing. - """ - if len(mode) > 1 or mode not in "raw": - raise ValueError("mode must be 'r', 'a' or 'w'") - return cls(name, mode, fileobj, **kwargs) - - @classmethod - def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open gzip compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if len(mode) > 1 or mode not in "rw": - raise ValueError("mode must be 'r' or 'w'") - - try: - import gzip - gzip.GzipFile - except (ImportError, AttributeError): - raise CompressionError("gzip module is not available") - - extfileobj = fileobj is not None - try: - fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) - t = cls.taropen(name, mode, fileobj, **kwargs) - except IOError: - if not extfileobj and fileobj is not None: - fileobj.close() - if fileobj is None: - raise - raise ReadError("not a gzip file") - except: - if not extfileobj and fileobj is not None: - fileobj.close() - raise - t._extfileobj = extfileobj - return t - - @classmethod - def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open bzip2 compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if len(mode) > 1 or mode not in "rw": - raise ValueError("mode must be 'r' or 'w'.") - - try: - import bz2 - except ImportError: - raise CompressionError("bz2 module is not available") - - if fileobj is not None: - fileobj = _BZ2Proxy(fileobj, mode) - else: - fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) - - try: - t = cls.taropen(name, mode, fileobj, **kwargs) - except (IOError, EOFError): - fileobj.close() - raise ReadError("not a bzip2 file") - t._extfileobj = False - return t - - # All *open() methods are registered here. - OPEN_METH = { - "tar": "taropen", # uncompressed tar - "gz": "gzopen", # gzip compressed tar - "bz2": "bz2open" # bzip2 compressed tar - } - - #-------------------------------------------------------------------------- - # The public methods which TarFile provides: - - def close(self): - """Close the TarFile. In write-mode, two finishing zero blocks are - appended to the archive. - """ - if self.closed: - return - - if self.mode in "aw": - self.fileobj.write(NUL * (BLOCKSIZE * 2)) - self.offset += (BLOCKSIZE * 2) - # fill up the end with zero-blocks - # (like option -b20 for tar does) - blocks, remainder = divmod(self.offset, RECORDSIZE) - if remainder > 0: - self.fileobj.write(NUL * (RECORDSIZE - remainder)) - - if not self._extfileobj: - self.fileobj.close() - self.closed = True - - def getmember(self, name): - """Return a TarInfo object for member `name'. If `name' can not be - found in the archive, KeyError is raised. If a member occurs more - than once in the archive, its last occurrence is assumed to be the - most up-to-date version. - """ - tarinfo = self._getmember(name) - if tarinfo is None: - raise KeyError("filename %r not found" % name) - return tarinfo - - def getmembers(self): - """Return the members of the archive as a list of TarInfo objects. The - list has the same order as the members in the archive. - """ - self._check() - if not self._loaded: # if we want to obtain a list of - self._load() # all members, we first have to - # scan the whole archive. - return self.members - - def getnames(self): - """Return the members of the archive as a list of their names. It has - the same order as the list returned by getmembers(). - """ - return [tarinfo.name for tarinfo in self.getmembers()] - - def gettarinfo(self, name=None, arcname=None, fileobj=None): - """Create a TarInfo object for either the file `name' or the file - object `fileobj' (using os.fstat on its file descriptor). You can - modify some of the TarInfo's attributes before you add it using - addfile(). If given, `arcname' specifies an alternative name for the - file in the archive. - """ - self._check("aw") - - # When fileobj is given, replace name by - # fileobj's real name. - if fileobj is not None: - name = fileobj.name - - # Building the name of the member in the archive. - # Backward slashes are converted to forward slashes, - # Absolute paths are turned to relative paths. - if arcname is None: - arcname = name - drv, arcname = os.path.splitdrive(arcname) - arcname = arcname.replace(os.sep, "/") - arcname = arcname.lstrip("/") - - # Now, fill the TarInfo object with - # information specific for the file. - tarinfo = self.tarinfo() - tarinfo.tarfile = self - - # Use os.stat or os.lstat, depending on platform - # and if symlinks shall be resolved. - if fileobj is None: - if hasattr(os, "lstat") and not self.dereference: - statres = os.lstat(name) - else: - statres = os.stat(name) - else: - statres = os.fstat(fileobj.fileno()) - linkname = "" - - stmd = statres.st_mode - if stat.S_ISREG(stmd): - inode = (statres.st_ino, statres.st_dev) - if not self.dereference and statres.st_nlink > 1 and \ - inode in self.inodes and arcname != self.inodes[inode]: - # Is it a hardlink to an already - # archived file? - type = LNKTYPE - linkname = self.inodes[inode] - else: - # The inode is added only if its valid. - # For win32 it is always 0. - type = REGTYPE - if inode[0]: - self.inodes[inode] = arcname - elif stat.S_ISDIR(stmd): - type = DIRTYPE - elif stat.S_ISFIFO(stmd): - type = FIFOTYPE - elif stat.S_ISLNK(stmd): - type = SYMTYPE - linkname = os.readlink(name) - elif stat.S_ISCHR(stmd): - type = CHRTYPE - elif stat.S_ISBLK(stmd): - type = BLKTYPE - else: - return None - - # Fill the TarInfo object with all - # information we can get. - tarinfo.name = arcname - tarinfo.mode = stmd - tarinfo.uid = statres.st_uid - tarinfo.gid = statres.st_gid - if type == REGTYPE: - tarinfo.size = statres.st_size - else: - tarinfo.size = 0 - tarinfo.mtime = statres.st_mtime - tarinfo.type = type - tarinfo.linkname = linkname - if pwd: - try: - tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] - except KeyError: - pass - if grp: - try: - tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] - except KeyError: - pass - - if type in (CHRTYPE, BLKTYPE): - if hasattr(os, "major") and hasattr(os, "minor"): - tarinfo.devmajor = os.major(statres.st_rdev) - tarinfo.devminor = os.minor(statres.st_rdev) - return tarinfo - - def list(self, verbose=True): - """Print a table of contents to sys.stdout. If `verbose' is False, only - the names of the members are printed. If it is True, an `ls -l'-like - output is produced. - """ - self._check() - - for tarinfo in self: - if verbose: - print(filemode(tarinfo.mode), end=' ') - print("%s/%s" % (tarinfo.uname or tarinfo.uid, - tarinfo.gname or tarinfo.gid), end=' ') - if tarinfo.ischr() or tarinfo.isblk(): - print("%10s" % ("%d,%d" \ - % (tarinfo.devmajor, tarinfo.devminor)), end=' ') - else: - print("%10d" % tarinfo.size, end=' ') - print("%d-%02d-%02d %02d:%02d:%02d" \ - % time.localtime(tarinfo.mtime)[:6], end=' ') - - print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') - - if verbose: - if tarinfo.issym(): - print("->", tarinfo.linkname, end=' ') - if tarinfo.islnk(): - print("link to", tarinfo.linkname, end=' ') - print() - - def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): - """Add the file `name' to the archive. `name' may be any type of file - (directory, fifo, symbolic link, etc.). If given, `arcname' - specifies an alternative name for the file in the archive. - Directories are added recursively by default. This can be avoided by - setting `recursive' to False. `exclude' is a function that should - return True for each filename to be excluded. `filter' is a function - that expects a TarInfo object argument and returns the changed - TarInfo object, if it returns None the TarInfo object will be - excluded from the archive. - """ - self._check("aw") - - if arcname is None: - arcname = name - - # Exclude pathnames. - if exclude is not None: - import warnings - warnings.warn("use the filter argument instead", - DeprecationWarning, 2) - if exclude(name): - self._dbg(2, "tarfile: Excluded %r" % name) - return - - # Skip if somebody tries to archive the archive... - if self.name is not None and os.path.abspath(name) == self.name: - self._dbg(2, "tarfile: Skipped %r" % name) - return - - self._dbg(1, name) - - # Create a TarInfo object from the file. - tarinfo = self.gettarinfo(name, arcname) - - if tarinfo is None: - self._dbg(1, "tarfile: Unsupported type %r" % name) - return - - # Change or exclude the TarInfo object. - if filter is not None: - tarinfo = filter(tarinfo) - if tarinfo is None: - self._dbg(2, "tarfile: Excluded %r" % name) - return - - # Append the tar header and data to the archive. - if tarinfo.isreg(): - f = bltn_open(name, "rb") - self.addfile(tarinfo, f) - f.close() - - elif tarinfo.isdir(): - self.addfile(tarinfo) - if recursive: - for f in os.listdir(name): - self.add(os.path.join(name, f), os.path.join(arcname, f), - recursive, exclude, filter=filter) - - else: - self.addfile(tarinfo) - - def addfile(self, tarinfo, fileobj=None): - """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is - given, tarinfo.size bytes are read from it and added to the archive. - You can create TarInfo objects using gettarinfo(). - On Windows platforms, `fileobj' should always be opened with mode - 'rb' to avoid irritation about the file size. - """ - self._check("aw") - - tarinfo = copy.copy(tarinfo) - - buf = tarinfo.tobuf(self.format, self.encoding, self.errors) - self.fileobj.write(buf) - self.offset += len(buf) - - # If there's data to follow, append it. - if fileobj is not None: - copyfileobj(fileobj, self.fileobj, tarinfo.size) - blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) - if remainder > 0: - self.fileobj.write(NUL * (BLOCKSIZE - remainder)) - blocks += 1 - self.offset += blocks * BLOCKSIZE - - self.members.append(tarinfo) - - def extractall(self, path=".", members=None): - """Extract all members from the archive to the current working - directory and set owner, modification time and permissions on - directories afterwards. `path' specifies a different directory - to extract to. `members' is optional and must be a subset of the - list returned by getmembers(). - """ - directories = [] - - if members is None: - members = self - - for tarinfo in members: - if tarinfo.isdir(): - # Extract directories with a safe mode. - directories.append(tarinfo) - tarinfo = copy.copy(tarinfo) - tarinfo.mode = 0o700 - # Do not set_attrs directories, as we will do that further down - self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) - - # Reverse sort directories. - directories.sort(key=lambda a: a.name) - directories.reverse() - - # Set correct owner, mtime and filemode on directories. - for tarinfo in directories: - dirpath = os.path.join(path, tarinfo.name) - try: - self.chown(tarinfo, dirpath) - self.utime(tarinfo, dirpath) - self.chmod(tarinfo, dirpath) - except ExtractError as e: - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - def extract(self, member, path="", set_attrs=True): - """Extract a member from the archive to the current working directory, - using its full name. Its file information is extracted as accurately - as possible. `member' may be a filename or a TarInfo object. You can - specify a different directory using `path'. File attributes (owner, - mtime, mode) are set unless `set_attrs' is False. - """ - self._check("r") - - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - # Prepare the link target for makelink(). - if tarinfo.islnk(): - tarinfo._link_target = os.path.join(path, tarinfo.linkname) - - try: - self._extract_member(tarinfo, os.path.join(path, tarinfo.name), - set_attrs=set_attrs) - except EnvironmentError as e: - if self.errorlevel > 0: - raise - else: - if e.filename is None: - self._dbg(1, "tarfile: %s" % e.strerror) - else: - self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) - except ExtractError as e: - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - def extractfile(self, member): - """Extract a member from the archive as a file object. `member' may be - a filename or a TarInfo object. If `member' is a regular file, a - file-like object is returned. If `member' is a link, a file-like - object is constructed from the link's target. If `member' is none of - the above, None is returned. - The file-like object is read-only and provides the following - methods: read(), readline(), readlines(), seek() and tell() - """ - self._check("r") - - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - if tarinfo.isreg(): - return self.fileobject(self, tarinfo) - - elif tarinfo.type not in SUPPORTED_TYPES: - # If a member's type is unknown, it is treated as a - # regular file. - return self.fileobject(self, tarinfo) - - elif tarinfo.islnk() or tarinfo.issym(): - if isinstance(self.fileobj, _Stream): - # A small but ugly workaround for the case that someone tries - # to extract a (sym)link as a file-object from a non-seekable - # stream of tar blocks. - raise StreamError("cannot extract (sym)link as file object") - else: - # A (sym)link's file object is its target's file object. - return self.extractfile(self._find_link_target(tarinfo)) - else: - # If there's no data associated with the member (directory, chrdev, - # blkdev, etc.), return None instead of a file object. - return None - - def _extract_member(self, tarinfo, targetpath, set_attrs=True): - """Extract the TarInfo object tarinfo to a physical - file called targetpath. - """ - # Fetch the TarInfo object for the given name - # and build the destination pathname, replacing - # forward slashes to platform specific separators. - targetpath = targetpath.rstrip("/") - targetpath = targetpath.replace("/", os.sep) - - # Create all upper directories. - upperdirs = os.path.dirname(targetpath) - if upperdirs and not os.path.exists(upperdirs): - # Create directories that are not part of the archive with - # default permissions. - os.makedirs(upperdirs) - - if tarinfo.islnk() or tarinfo.issym(): - self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) - else: - self._dbg(1, tarinfo.name) - - if tarinfo.isreg(): - self.makefile(tarinfo, targetpath) - elif tarinfo.isdir(): - self.makedir(tarinfo, targetpath) - elif tarinfo.isfifo(): - self.makefifo(tarinfo, targetpath) - elif tarinfo.ischr() or tarinfo.isblk(): - self.makedev(tarinfo, targetpath) - elif tarinfo.islnk() or tarinfo.issym(): - self.makelink(tarinfo, targetpath) - elif tarinfo.type not in SUPPORTED_TYPES: - self.makeunknown(tarinfo, targetpath) - else: - self.makefile(tarinfo, targetpath) - - if set_attrs: - self.chown(tarinfo, targetpath) - if not tarinfo.issym(): - self.chmod(tarinfo, targetpath) - self.utime(tarinfo, targetpath) - - #-------------------------------------------------------------------------- - # Below are the different file methods. They are called via - # _extract_member() when extract() is called. They can be replaced in a - # subclass to implement other functionality. - - def makedir(self, tarinfo, targetpath): - """Make a directory called targetpath. - """ - try: - # Use a safe mode for the directory, the real mode is set - # later in _extract_member(). - os.mkdir(targetpath, 0o700) - except EnvironmentError as e: - if e.errno != errno.EEXIST: - raise - - def makefile(self, tarinfo, targetpath): - """Make a file called targetpath. - """ - source = self.fileobj - source.seek(tarinfo.offset_data) - target = bltn_open(targetpath, "wb") - if tarinfo.sparse is not None: - for offset, size in tarinfo.sparse: - target.seek(offset) - copyfileobj(source, target, size) - else: - copyfileobj(source, target, tarinfo.size) - target.seek(tarinfo.size) - target.truncate() - target.close() - - def makeunknown(self, tarinfo, targetpath): - """Make a file from a TarInfo object with an unknown type - at targetpath. - """ - self.makefile(tarinfo, targetpath) - self._dbg(1, "tarfile: Unknown file type %r, " \ - "extracted as regular file." % tarinfo.type) - - def makefifo(self, tarinfo, targetpath): - """Make a fifo called targetpath. - """ - if hasattr(os, "mkfifo"): - os.mkfifo(targetpath) - else: - raise ExtractError("fifo not supported by system") - - def makedev(self, tarinfo, targetpath): - """Make a character or block device called targetpath. - """ - if not hasattr(os, "mknod") or not hasattr(os, "makedev"): - raise ExtractError("special devices not supported by system") - - mode = tarinfo.mode - if tarinfo.isblk(): - mode |= stat.S_IFBLK - else: - mode |= stat.S_IFCHR - - os.mknod(targetpath, mode, - os.makedev(tarinfo.devmajor, tarinfo.devminor)) - - def makelink(self, tarinfo, targetpath): - """Make a (symbolic) link called targetpath. If it cannot be created - (platform limitation), we try to make a copy of the referenced file - instead of a link. - """ - try: - # For systems that support symbolic and hard links. - if tarinfo.issym(): - os.symlink(tarinfo.linkname, targetpath) - else: - # See extract(). - if os.path.exists(tarinfo._link_target): - os.link(tarinfo._link_target, targetpath) - else: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except symlink_exception: - if tarinfo.issym(): - linkpath = os.path.join(os.path.dirname(tarinfo.name), - tarinfo.linkname) - else: - linkpath = tarinfo.linkname - else: - try: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except KeyError: - raise ExtractError("unable to resolve link inside archive") - - def chown(self, tarinfo, targetpath): - """Set owner of targetpath according to tarinfo. - """ - if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: - # We have to be root to do so. - try: - g = grp.getgrnam(tarinfo.gname)[2] - except KeyError: - g = tarinfo.gid - try: - u = pwd.getpwnam(tarinfo.uname)[2] - except KeyError: - u = tarinfo.uid - try: - if tarinfo.issym() and hasattr(os, "lchown"): - os.lchown(targetpath, u, g) - else: - if sys.platform != "os2emx": - os.chown(targetpath, u, g) - except EnvironmentError as e: - raise ExtractError("could not change owner") - - def chmod(self, tarinfo, targetpath): - """Set file permissions of targetpath according to tarinfo. - """ - if hasattr(os, 'chmod'): - try: - os.chmod(targetpath, tarinfo.mode) - except EnvironmentError as e: - raise ExtractError("could not change mode") - - def utime(self, tarinfo, targetpath): - """Set modification time of targetpath according to tarinfo. - """ - if not hasattr(os, 'utime'): - return - try: - os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) - except EnvironmentError as e: - raise ExtractError("could not change modification time") - - #-------------------------------------------------------------------------- - def next(self): - """Return the next member of the archive as a TarInfo object, when - TarFile is opened for reading. Return None if there is no more - available. - """ - self._check("ra") - if self.firstmember is not None: - m = self.firstmember - self.firstmember = None - return m - - # Read the next block. - self.fileobj.seek(self.offset) - tarinfo = None - while True: - try: - tarinfo = self.tarinfo.fromtarfile(self) - except EOFHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - except InvalidHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - elif self.offset == 0: - raise ReadError(str(e)) - except EmptyHeaderError: - if self.offset == 0: - raise ReadError("empty file") - except TruncatedHeaderError as e: - if self.offset == 0: - raise ReadError(str(e)) - except SubsequentHeaderError as e: - raise ReadError(str(e)) - break - - if tarinfo is not None: - self.members.append(tarinfo) - else: - self._loaded = True - - return tarinfo - - #-------------------------------------------------------------------------- - # Little helper methods: - - def _getmember(self, name, tarinfo=None, normalize=False): - """Find an archive member by name from bottom to top. - If tarinfo is given, it is used as the starting point. - """ - # Ensure that all members have been loaded. - members = self.getmembers() - - # Limit the member search list up to tarinfo. - if tarinfo is not None: - members = members[:members.index(tarinfo)] - - if normalize: - name = os.path.normpath(name) - - for member in reversed(members): - if normalize: - member_name = os.path.normpath(member.name) - else: - member_name = member.name - - if name == member_name: - return member - - def _load(self): - """Read through the entire archive file and look for readable - members. - """ - while True: - tarinfo = self.next() - if tarinfo is None: - break - self._loaded = True - - def _check(self, mode=None): - """Check if TarFile is still open, and if the operation's mode - corresponds to TarFile's mode. - """ - if self.closed: - raise IOError("%s is closed" % self.__class__.__name__) - if mode is not None and self.mode not in mode: - raise IOError("bad operation for mode %r" % self.mode) - - def _find_link_target(self, tarinfo): - """Find the target member of a symlink or hardlink member in the - archive. - """ - if tarinfo.issym(): - # Always search the entire archive. - linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname - limit = None - else: - # Search the archive before the link, because a hard link is - # just a reference to an already archived file. - linkname = tarinfo.linkname - limit = tarinfo - - member = self._getmember(linkname, tarinfo=limit, normalize=True) - if member is None: - raise KeyError("linkname %r not found" % linkname) - return member - - def __iter__(self): - """Provide an iterator object. - """ - if self._loaded: - return iter(self.members) - else: - return TarIter(self) - - def _dbg(self, level, msg): - """Write debugging output to sys.stderr. - """ - if level <= self.debug: - print(msg, file=sys.stderr) - - def __enter__(self): - self._check() - return self - - def __exit__(self, type, value, traceback): - if type is None: - self.close() - else: - # An exception occurred. We must not call close() because - # it would try to write end-of-archive blocks and padding. - if not self._extfileobj: - self.fileobj.close() - self.closed = True -# class TarFile - -class TarIter(object): - """Iterator Class. - - for tarinfo in TarFile(...): - suite... - """ - - def __init__(self, tarfile): - """Construct a TarIter object. - """ - self.tarfile = tarfile - self.index = 0 - def __iter__(self): - """Return iterator object. - """ - return self - - def __next__(self): - """Return the next item using TarFile's next() method. - When all members have been read, set TarFile as _loaded. - """ - # Fix for SF #1100429: Under rare circumstances it can - # happen that getmembers() is called during iteration, - # which will cause TarIter to stop prematurely. - if not self.tarfile._loaded: - tarinfo = self.tarfile.next() - if not tarinfo: - self.tarfile._loaded = True - raise StopIteration - else: - try: - tarinfo = self.tarfile.members[self.index] - except IndexError: - raise StopIteration - self.index += 1 - return tarinfo - - next = __next__ # for Python 2.x - -#-------------------- -# exported functions -#-------------------- -def is_tarfile(name): - """Return True if name points to a tar archive that we - are able to handle, else return False. - """ - try: - t = open(name) - t.close() - return True - except TarError: - return False - -bltn_open = open -open = TarFile.open diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/compat.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/compat.py index e594106..1fe3d22 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/compat.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/compat.py @@ -22,7 +22,6 @@ if sys.version_info[0] < 3: # pragma: no cover from types import FileType as file_type import __builtin__ as builtins import ConfigParser as configparser - from ._backport import shutil from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, pathname2url, ContentTooShortError, splittype) @@ -313,10 +312,8 @@ except ImportError: # pragma: no cover return 'IronPython' return 'CPython' -try: - import sysconfig -except ImportError: # pragma: no cover - from ._backport import sysconfig +import shutil +import sysconfig try: callable = callable @@ -618,18 +615,15 @@ except ImportError: # pragma: no cover try: from importlib.util import cache_from_source # Python >= 3.4 except ImportError: # pragma: no cover - try: - from imp import cache_from_source - except ImportError: # pragma: no cover - def cache_from_source(path, debug_override=None): - assert path.endswith('.py') - if debug_override is None: - debug_override = __debug__ - if debug_override: - suffix = 'c' - else: - suffix = 'o' - return path + suffix + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix try: from collections import OrderedDict diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/database.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/database.py index 0a90c30..5db5d7f 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/database.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/database.py @@ -132,29 +132,35 @@ class DistributionPath(object): r = finder.find(entry) if not r or r.path in seen: continue - if self._include_dist and entry.endswith(DISTINFO_EXT): - possible_filenames = [METADATA_FILENAME, - WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME] - for metadata_filename in possible_filenames: - metadata_path = posixpath.join(entry, metadata_filename) - pydist = finder.find(metadata_path) - if pydist: - break - else: - continue + try: + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, + WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue - with contextlib.closing(pydist.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') - logger.debug('Found %s', r.path) - seen.add(r.path) - yield new_dist_class(r.path, metadata=metadata, - env=self) - elif self._include_egg and entry.endswith(('.egg-info', - '.egg')): - logger.debug('Found %s', r.path) - seen.add(r.path) - yield old_dist_class(r.path, self) + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + except Exception as e: + msg = 'Unable to read distribution at %s, perhaps due to bad metadata: %s' + logger.warning(msg, r.path, e) + import warnings + warnings.warn(msg % (r.path, e), stacklevel=2) def _generate_cache(self): """ @@ -379,8 +385,9 @@ class Distribution(object): def _get_requirements(self, req_attr): md = self.metadata - logger.debug('Getting requirements from metadata %r', md.todict()) reqts = getattr(md, req_attr) + logger.debug('%s: got requirements %r from metadata: %r', self.name, req_attr, + reqts) return set(md.get_requirements(reqts, extras=self.extras, env=self.context)) @@ -1308,22 +1315,26 @@ def get_required_dists(dists, dist): :param dists: a list of distributions :param dist: a distribution, member of *dists* for which we are interested + in finding the dependencies. """ if dist not in dists: raise DistlibException('given distribution %r is not a member ' 'of the list' % dist.name) graph = make_graph(dists) - req = [] # required distributions + req = set() # required distributions todo = graph.adjacency_list[dist] # list of nodes we should inspect + seen = set(t[0] for t in todo) # already added to todo while todo: d = todo.pop()[0] - req.append(d) - for pred in graph.adjacency_list[d]: - if pred not in req: + req.add(d) + pred_list = graph.adjacency_list[d] + for pred in pred_list: + d = pred[0] + if d not in req and d not in seen: + seen.add(d) todo.append(pred) - return req diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/index.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/index.py index b1fbbf8..9b6d129 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/index.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/index.py @@ -12,7 +12,7 @@ import subprocess import tempfile try: from threading import Thread -except ImportError: +except ImportError: # pragma: no cover from dummy_threading import Thread from . import DistlibException @@ -104,7 +104,7 @@ class PackageIndex(object): pm.add_password(self.realm, netloc, self.username, self.password) self.password_handler = HTTPBasicAuthHandler(pm) - def register(self, metadata): + def register(self, metadata): # pragma: no cover """ Register a distribution on PyPI, using the provided metadata. @@ -142,8 +142,7 @@ class PackageIndex(object): logger.debug('%s: %s' % (name, s)) stream.close() - def get_sign_command(self, filename, signer, sign_password, - keystore=None): + def get_sign_command(self, filename, signer, sign_password, keystore=None): # pragma: no cover """ Return a suitable command for signing a file. @@ -206,7 +205,7 @@ class PackageIndex(object): t2.join() return p.returncode, stdout, stderr - def sign_file(self, filename, signer, sign_password, keystore=None): + def sign_file(self, filename, signer, sign_password, keystore=None): # pragma: no cover """ Sign a file. @@ -286,7 +285,7 @@ class PackageIndex(object): request = self.encode_request(d.items(), files) return self.send_request(request) - def upload_documentation(self, metadata, doc_dir): + def upload_documentation(self, metadata, doc_dir): # pragma: no cover """ Upload documentation to the index. @@ -499,7 +498,7 @@ class PackageIndex(object): } return Request(self.url, body, headers) - def search(self, terms, operator=None): + def search(self, terms, operator=None): # pragma: no cover if isinstance(terms, string_types): terms = {'name': terms} rpc_proxy = ServerProxy(self.url, timeout=3.0) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/locators.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/locators.py index 0c7d639..966ebc0 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/locators.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/locators.py @@ -633,7 +633,7 @@ class SimpleScrapingLocator(Locator): self._threads = [] for i in range(self.num_workers): t = threading.Thread(target=self._fetch) - t.setDaemon(True) + t.daemon = True t.start() self._threads.append(t) @@ -1053,9 +1053,9 @@ class AggregatingLocator(Locator): # We use a legacy scheme simply because most of the dists on PyPI use legacy -# versions which don't conform to PEP 426 / PEP 440. +# versions which don't conform to PEP 440. default_locator = AggregatingLocator( - JSONLocator(), + # JSONLocator(), # don't use as PEP 426 is withdrawn SimpleScrapingLocator('https://pypi.org/simple/', timeout=3.0), scheme='legacy') diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/markers.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/markers.py index b43136f..9dc6841 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/markers.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/markers.py @@ -90,6 +90,8 @@ class Evaluator(object): result = self.operations[op](lhs, rhs) return result +_DIGITS = re.compile(r'\d+\.\d+') + def default_context(): def format_full_version(info): version = '%s.%s.%s' % (info.major, info.minor, info.micro) @@ -105,6 +107,9 @@ def default_context(): implementation_version = '0' implementation_name = '' + ppv = platform.python_version() + m = _DIGITS.match(ppv) + pv = m.group(0) result = { 'implementation_name': implementation_name, 'implementation_version': implementation_version, @@ -115,8 +120,8 @@ def default_context(): 'platform_system': platform.system(), 'platform_version': platform.version(), 'platform_in_venv': str(in_venv()), - 'python_full_version': platform.python_version(), - 'python_version': platform.python_version()[:3], + 'python_full_version': ppv, + 'python_version': pv, 'sys_platform': sys.platform, } return result diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/metadata.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/metadata.py index 6a26b0a..c329e19 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/metadata.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/metadata.py @@ -5,7 +5,7 @@ # """Implementation of the Metadata for Python packages PEPs. -Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and withdrawn 2.0). +Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and 2.2). """ from __future__ import unicode_literals @@ -100,12 +100,17 @@ _566_FIELDS = _426_FIELDS + ('Description-Content-Type', _566_MARKERS = ('Description-Content-Type',) +_643_MARKERS = ('Dynamic', 'License-File') + +_643_FIELDS = _566_FIELDS + _643_MARKERS + _ALL_FIELDS = set() _ALL_FIELDS.update(_241_FIELDS) _ALL_FIELDS.update(_314_FIELDS) _ALL_FIELDS.update(_345_FIELDS) _ALL_FIELDS.update(_426_FIELDS) _ALL_FIELDS.update(_566_FIELDS) +_ALL_FIELDS.update(_643_FIELDS) EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') @@ -121,7 +126,10 @@ def _version2fieldlist(version): # avoid adding field names if already there return _345_FIELDS + tuple(f for f in _566_FIELDS if f not in _345_FIELDS) elif version == '2.0': - return _426_FIELDS + raise ValueError('Metadata 2.0 is withdrawn and not supported') + # return _426_FIELDS + elif version == '2.2': + return _643_FIELDS raise MetadataUnrecognizedVersionError(version) @@ -139,7 +147,7 @@ def _best_version(fields): continue keys.append(key) - possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.1', '2.2'] # 2.0 removed # first let's try to see if a field is not part of one of the version for key in keys: @@ -159,9 +167,12 @@ def _best_version(fields): if key != 'Description': # In 2.1, description allowed after headers possible_versions.remove('2.1') logger.debug('Removed 2.1 due to %s', key) - if key not in _426_FIELDS and '2.0' in possible_versions: - possible_versions.remove('2.0') - logger.debug('Removed 2.0 due to %s', key) + if key not in _643_FIELDS and '2.2' in possible_versions: + possible_versions.remove('2.2') + logger.debug('Removed 2.2 due to %s', key) + # if key not in _426_FIELDS and '2.0' in possible_versions: + # possible_versions.remove('2.0') + # logger.debug('Removed 2.0 due to %s', key) # possible_version contains qualified versions if len(possible_versions) == 1: @@ -174,16 +185,18 @@ def _best_version(fields): is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) - is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) - if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: - raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + # is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + is_2_2 = '2.2' in possible_versions and _has_marker(keys, _643_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_2) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.1/2.2 fields') - # we have the choice, 1.0, or 1.2, or 2.0 + # we have the choice, 1.0, or 1.2, 2.1 or 2.2 # - 1.0 has a broken Summary field but works with all tools # - 1.1 is to avoid # - 1.2 fixes Summary but has little adoption - # - 2.0 adds more features and is very new - if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # - 2.1 adds more features + # - 2.2 is the latest + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_2: # we couldn't find any specific marker if PKG_INFO_PREFERRED_VERSION in possible_versions: return PKG_INFO_PREFERRED_VERSION @@ -193,8 +206,10 @@ def _best_version(fields): return '1.2' if is_2_1: return '2.1' + # if is_2_2: + # return '2.2' - return '2.0' + return '2.2' # This follows the rules about transforming keys as described in # https://www.python.org/dev/peps/pep-0566/#id17 @@ -210,7 +225,7 @@ _LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', 'Requires', 'Provides', 'Obsoletes-Dist', 'Provides-Dist', 'Requires-Dist', 'Requires-External', 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', - 'Provides-Extra', 'Extension') + 'Provides-Extra', 'Extension', 'License-File') _LISTTUPLEFIELDS = ('Project-URL',) _ELEMENTSFIELD = ('Keywords',) @@ -602,7 +617,7 @@ LEGACY_METADATA_FILENAME = 'METADATA' class Metadata(object): """ - The metadata of a release. This implementation uses 2.0 (JSON) + The metadata of a release. This implementation uses 2.1 metadata where possible. If not possible, it wraps a LegacyMetadata instance which handles the key-value metadata format. """ @@ -611,6 +626,8 @@ class Metadata(object): NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + FIELDNAME_MATCHER = re.compile('^[A-Z]([0-9A-Z-]*[0-9A-Z])?$', re.I) + VERSION_MATCHER = PEP440_VERSION_RE SUMMARY_MATCHER = re.compile('.{1,2047}') @@ -638,6 +655,7 @@ class Metadata(object): 'name': (NAME_MATCHER, ('legacy',)), 'version': (VERSION_MATCHER, ('legacy',)), 'summary': (SUMMARY_MATCHER, ('legacy',)), + 'dynamic': (FIELDNAME_MATCHER, ('legacy',)), } __slots__ = ('_legacy', '_data', 'scheme') diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/scripts.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/scripts.py index 913912c..d270624 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/scripts.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/scripts.py @@ -10,6 +10,8 @@ import os import re import struct import sys +import time +from zipfile import ZipInfo from .compat import sysconfig, detect_encoding, ZipFile from .resources import finder @@ -249,7 +251,13 @@ class ScriptMaker(object): launcher = self._get_launcher('w') stream = BytesIO() with ZipFile(stream, 'w') as zf: - zf.writestr('__main__.py', script_bytes) + source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH') + if source_date_epoch: + date_time = time.gmtime(int(source_date_epoch))[:6] + zinfo = ZipInfo(filename='__main__.py', date_time=date_time) + zf.writestr(zinfo, script_bytes) + else: + zf.writestr('__main__.py', script_bytes) zip_data = stream.getvalue() script_bytes = launcher + shebang + zip_data for name in names: diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/t32.exe b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/t32.exe index 8932a18e4596952373a38c60b81b7116d4ef9ee8..0aaa386d75662d2f874aab78460dcd39b2ee43b0 100644 GIT binary patch delta 24811 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 delta 23612 zcmd_SeO#2q_cwm+t<@YYg!W8in*?s zI+|9N5>{4LCZ=X-7$!cZnWd#Aeez?&XZ;qXDJ6N`@40rt>ifNazuzDC>;C6Q&CZ!K zXJ*dKoO5R8%v>&O4_J09VBPYm@10(B{M;)k9bwYTnJFib{-UsJN{bk0r8J4LEag4K zM|LVx&LBR1t}f*{5ij@C>-}+#7>}Dh(}p_NUybftHQ>+5od2(x<0aiC-8k+mAh!FE zT~s7SlHNtvE+G#}QhF%DC0rKEDU)zJEbIG($r~ixs;(gah2!GZ_lb?Lgh)8EudMI4 zmE%e_4@;LsMIfE-s95Yk9CHCbp$K1*KO_kmJ<z`46m_=8<{1|NPNZGL3)>wE@q@$2k9pfB59Xy z`jR#&c(qH4=-F_xK47S7axlla^KNAr$iyF_r_qI1K^uK}i^Hni+In&v6I)}^r7&J8T2f)oF@yT0S-ofxsV zaKu|}HWC~(a8R%v~Em}RTLPU70nRE5$?7UrK=d2dAZxJH$f%LRi-*(D{2s0yS z3v^0GpxhLZ(@GiV>{V;a8^(dZu67P3;y|TtF#GbawJpCs~c=l z=%Iy%wF|=XHOZ@(L@L+_i6tGrl5&)^=|wtk6=ceuJJpJMHN_UHnj(&u+mW2=(Pn|p zep~p;g3NMy>z*JqNs~*&a(ht>mHy_-w9$*cOoy1c*_V0CmpO+X^kuFSGoSEfN^D<- znYpIis^rNWWI%|>MPq0uiZzyIDK3Tx6c-B)a3w^9BG1_5%=V3P@duog8%x1ZaeVzSL#AWJR6tc0w z#s#yHcnrC|dXCCbm8+2lhxQO#K5~obBSGXuaO_ZDiq(0GHJ zs#!dPoam7h`7I#NC3QpfWpv4QKx8MrjR-x4%Fc<2>vu>-NSdr&OzgQs>>gF$K_Je5E2tv(vhnZbA4F_q%}lQx&~Pmdh0eDA4Byea9}&Y zsM(l)2dq70Qc&7jvVK>pg)bXqLg~Ork3~i`ehgpQ2m?!}ld-+RYBYS!?pz(Pug9;nSVp1@dF_rcdI@EqEZykYSaLWl ziC?TI&0+od0U1OVp1`k6C#m5hg5yEt?_@&^c`|%KuOXQn7qY*VjW4W)g~n$RA>1Uf z5K}}hG4eD`o9YcOqVpI5RRPz;$x*AiVbYYw z16pclumvoJ_OQkcxF15O~ERQz*EhE4lQ!=$t zef|Shk2j!p#|UyVvOm8pkNg^$9y4<|$1TfV%DUwUphFP}T2>QxDJHm(%)jg&Xn&Xq_K7d-%B;eC2 zv(nf+k{mrwvxT*M9IJ!7u+4bN*_$#=YvKlB4C!yM3LdWI9l(Y{*}|Tp37}Ua$eYnA zs+U;7qsB%@ToZTtG}N!Bg|@K87O1XG+_&FCyc=Ym!Zy#P>dR2nRS`rI6PE zThAhqkA2-mt@N~d<H52F+(hUu6WB-BXyo zs+1Y;GIP)f0oUKJ<8n_jIX<>mBMfD!drJH5k#e(hUNOxbP2BPEOpbQO52#v(?SVJo zz~aHfxZCFBWsY$A8WvoC??wT164a4dq31vY7GUw+ROXDBdhXp3Es#H;^$2gC+CH6A7`y#(MHXp%3A-1xu!%fi(ct z4JR6{9w$tOBiK_Yt3Kh3_psmIwBbJCOn~H2(k^wtecVoVY&b5oR6yvg*a74-?n|+c zHcXRZLqAQ5t+zN(c$-YhbA{eWUrv31oI(HUIs1@^arXigj$< z&*ON5)hFf=6Lez_yCMI=2necbl|e08;Wm}-5FwBU>roKb=^+<14t34m;hsj<$E`qmTyu0-=^hpApFA@1CX_q z<8g*Uh`PD%NgM&Ld%W`-Hcyh9vhI3M&CLVLr+1=PsedIfoGh` zv1w6^CvcW4YjL-1XHTrr*f4%d>INmN&#_J&!;{*#WTKr|b8at{;PP<59d3XOH4y z+8udlsZfiSd}<0=l%cPVAWx+n3t|La!$`!&6s)n22dgXv4Ar;PE%W^1{YYH!#Zs=b z0tP9Z4nekm3eMqh(7nlf0R}SdYs6?N|Y_sSZX%W=F7C1-3PVQLxcUvs=mg zX~~7FTmLe{H!yiTR#4Lrab=><4DQ$&Y)-{sVA->W+d_My^`}v{`nEy49WvqUZpHB* zYwBXMGQF@W6+1x8xy&9%r(io(O3$SD5uvm|L`=LSE>=}nd0ie)U_&O{Q^UqL;2 zSKN8cuF7j1qko^#e~BOeZV^_8E)2qm($nC$Wz)SX96i`haruqZF6crVb|dcKTkJQY zmHo!wV82?nOL1pk!|$v$5upke1xv*!zF9;DToI#`OJX$S0-~+Y2FO6-$>ZwUk@VzA z>o}xq@?>>#hOchMxvo!BKt3`h_^+1b*0p00n*v(#+f~XnGzHuuk0}z1R<>{>rB${5y8?no7w(+Csio#q(oYNE@P|Eu^Lr4CSlSST9YSd z+Y$@CFq@RAwL=w5?n*$SzATnL&kOR$bD_!>=$Ym*rFlf@pg8a`*>&C^)!+RlP8!_x~1=7 zKQ+d-9V=-^QQt0b4F;mRLBu)3&;b4O->4ty-Y6Bf+Z&5Ue3We02|QV*(ZsoUNR6lR z8v5aazWGfJ_M&y+Dsm(tB_<12wAA$~n^ewTfI}VtxRR(db3@{LRcr$7*r5Ant)}`C zaxp1v-k^PkOnwyP=o-d#J}4xo3o|%UQKtPurWx9qnVi+|53;RYYgfCC%iCjJ|!hVAwfF zl8wdm3s?=;Q7N{oA)W~k$#Fu&mJ#G|hPl_xtA8*3!&MTh%j0(&NwKaZaxU=vu(JB} z2SOy$U*QZO!-l6zvdH}5gQXi;a@+7+K41#Dy0SNEAKqP>%5dFtwUS53u-u`^AKyY3 z4^i+Tlscr(} zdGduJ^kFh1FQw=GBPwK1<;vbmw&Xe3kzm9^$#$}Q#2CqUQEe*l5TKE6Ua6QMe}}w);^!pllL`A0B75P)Ra*XH=f#Ah|W_dJ3yK zq>OGa|_xV#|-@F15Pxqwt&jeS)PL7p|jlbyj1e92Zu-bYYYSLWK3dlFJL??Pb2f=W%wD~WTCc?7GVosWa45b+T(;$1_mpv@&cE#Z+340CL1 zW9=LeuoF-ub~y#aXh}>yiY!;KSg>U`Rw}#9wwpEa)-`w-3w~ou`*HG=#VpxDKDIm{ znNIkzeIfiQW3`feGHGmV^f^|+7^&b6^met}lz73H)O`aW_Qgw;dRSxrq9WgeY zE85U+&j`3O+1Bg8F%Wx3r1?^B`cfKSYO61mwF;IUJE1)rD~)BeXu#W-uwXP=@BttFp~ORYN2 z29No*x>C)b%v(DRCu;2lU~Q`~KE=XUwxuktGeZNAm@g)BeF>YG$QKjX9wFvDS~eYZ z1%Mrqu53mKN0}>|5pgh`4bJ3RHidO8r}k(Sz@`AP?jkcbf{aWoEJU!WuVYik4s|Pz zU}!Pn$hHVyu|13^%CAZomKFDC*MVO6%17hpR`Av5;}$Z(D)(_Kwn49V4`<7@W2PsY zt?0If38+GAChbM((IVYN;T*DKannW9u*N`zBF>TF4p)QK2*^S zYoQRqP^EO-Xqdaj*nir}@I!0a;=_E6U$=|1unJo?YXrYy1lerW$ycFP;VaK2K?}q;*5rXp!O`-{YpW0~>^9`XyVy%&oDyxP1v3Xf z&diQ-4!OF)!v5&E%WQ5gC~!NC_OccYveG6bYNUBgSUkrEe`fFU`R}%)s9^BdMG6b8 zhl#~y1FAh_`v};>;n;h_b<|(PgD2;!!uwJfaNv4PCW_LCsAng#B69E4BKFs^1oLOV zB}8PADWyj3r)+X?Wg$Zm3l`8zV7znL3O*z*TV3c;X4o+vjtGp!{>kJ_siMbjxSst^ zbV0kDbe}j>a*Y@#rpTDT&aHLi5!=L6=BC;(ad?6QxXMR9UV+GNwkOfk7*=uHHr5pY z%9|7OL5Ah z0IWf1MDo!82l6#jq5_k8K`k8Q%_*^uFt>Z7dc`a|T!X$g`y$iZpxk_K{VT3^iE-D$}ZN|MTA`7sAb zc3EEh9CS(ax7Zj1H5V8IBiW_cWkY-t*;Z!ay4W&Mn6KnQi{T}&(YqgA@^3%2!v zYmb9V+S}c2@&*;t87%9c1JR#kPd5bGP=4wZ5;q`8lO`5r4ncaB=`j4E>yWtb4~>RD zG=c`)C);_RoSR-G*+-IR3=MXojDIs8b)J;XQ1sMyVp^VIwWgBV8Ie_YkHVN9f+G5z znotq-zMjzp^T$6yM>7FwhPD%kzv{U{vDf9>{6XlJATPF5c zphy%-cLC{lcs|4^j|J&Qw>O9$Qn8EE{~>^?gW}Be5sCA1Q5_ zIGf$^`>{bC*j!+J_h`&Bj8 hBpr%-{n{n>;gt&8iq+%299^WI)6Vm0g+ry;!o<_$Lt4EQu54-tWtz@EYZ}(e1MeK$v zSQ0%uhyQsdnK*kj|HDageRcsKF_UQQgJaDgvd~pH0F=54ZwNSx;b6(Ouc7adC+r9R zR!PnyXGpl^xf;)IO> z2=1Vp=Flmm$D`3xo&d(@;7$PKIp)oW&SQUTaLO0-v|=*Z%yi4~E%!~(6yIFI4a+tF zBJGEuUD$&vSWSMv_#S&?32Zu9{b>JgbI^a>*0$U(CkG$3kl7#i<=6a1YChJHjdP8C z9(WTT1|BBDGeM(yArtksxNbh-l*`jQmm&~H+^H%W_o~rlG zi{PdGvAZD;HAYLLu#Y8u79>b-!);MNe8FG|zjivAzi=J@NE+cC3;6E_lSPiJl9YO@ zGo9z}460xGc)Ucif!sI|MLt>_C2bgqnvzaNlAjj$l4!}OlY>dxl0^Q!Nu+Q|x-^>Q zRxKGM^U>oeViA-!6&gUwWCeFBx0q+A2Ckes-FH& zGy$BFIZyVJKXjk4n7sI8Oh_XTKH;0idPBO-?L)$s_Kq2amD!ai<6S19)EVN+8H5hy zcp9nl5XoD*q|a&$79EXyQJ*hNoOvUX{+a)7Ke@W}UH(%~{kqB+o?};br4@8oj>NY;Ro)}h6=CAG{ zn^%tDEirI{^_4E%gIVjIJBSQ@#>jWuL*_h_#6Pf}tbL|@K*Y0b0&7NblU-(R@^Uk` z7NG?}`?Q%GhVTr+Q!Wy{Drx40U7fr>4iKCRRV~+{7i`%=Z(``4`xFy8DH=gh{4pao zUR@MH*WRa50&IB}*|?r$x9{()BU@L^>@l{0sTywYopF@kMS|Vh2Q4b7lr^M!J&4&o z8`?VXRwp-;0Q$IDfqYM)y!wRWDt4zrmBAUhD4f>ZCsn*fYTRojCJD%MO!mtN0v8zBfZXCQ?yt6?Qctw_7 zTC-T<=!@s4^cHplD9{C>I?RfvhZD9#BG@U%Im*>2ttLrTyCbwlZ-X;TL`3gU$%T`ZC@9>hy8JO%Kbd+zQOgwxEM62Xxro*}00Xxz6U z4+gHCsZi6jNmCo)_@!JQHl}j#_51gCR_e_4ugaEMs8Cy4Le*$s>=NAA4P#ljxOBu> zsg}V|$^z7gp0G7YR8Qz6&Ry$=W60SeD=H!mm)8@q!j>M(RY*CUAn<cABZ&i~k@Ba7(~Y#7*?$emrzq)u?0^3_n}Ra>bA1(q>^ zD`5hMC&mQSpbdh+kcw+Z7Cl%ikw{g1D~Ex-hH+Y-#wq4e|FSh)?;S?edt5~W52_pnd~IL zDn1;K0EGxCoCLM(@)Ji|GGbjGf9xcwS(n_8U0k}wOHACkcfsIb8{K*DCNB~t`@*^b z5*cY4Td0B%6zt%liUqv{?bUYa>E0W ztx#!ql&gn8zX0UhNj$!te7E6rWRK3QU$%8*ZQ4c}$Uw<>@*h&5`PPUrJp~6O-thFH z4iG_<-3hc9P!osSWsVjA#B-=J0a2dJlO0Fw8|~ur9iL*=K$w>$-RpRY_ub1F47vxu zINay8wak(-Yub!cyH8njJsJO9IsaCNr`1Zguv)}oqK@BozD=hA)x_bE3FqDJB1M~` z!yeN^(E~l_T+N9`{s{1dZ-ULJ+LXXHC)+j+(Jo}JQ+7Hx-gQRP?_R=NZM_S{9Tp*j zF2cT{MYxClR$PLCsmZ&&{xHHb6;Xl+5d9JHu$j=&<6WaX~ z$7wuYK#A{w==TXw#>S8pYf+!QOHJN2R@db-Waj3vk&kth2w5>2L+C3tnVj4_KsNVR zHdODtNPgcO7dHsEbz++#D?Y(4>{#AC-fI$@2>qTYw!l?iFNV0EjkvR z-I5|HAir%%%#VYxU>Y?YGx7Qh=zkzyxnX#I5Aeuq*m>qib6`!bM4Ye;8pWPnwA5m& zhDrIXgNRIiK3civd6;rI1ZXcP;9}I&@kZ4d)$s&0jCKd!CvWdQPhNYzj5oYMWH0pX z#TvTb%3icWvR;@$w!g3?NESAXV;7V;FCOZquZ6|J-uB7^Byekg-noRNZ&mZ=S~7F% z(=7UN>lnj==Q@lp^DS04U^@@j61MZbXmMv2{bLgh?stFdDw+F|dgy2z!Ad`5Z_JqI zKHW+U41sgCqpy_?0gP3m^Q0I589Db-;-GeB!2IN`K3F8b2KcY!7tVk@k_>&h>!A9- z6nXtGMPB?z5ziSifjj_<@7m*2d4`$0CCQ!^`YF>hlvM)(=0N{)(t*N*MYXwf!XXxd}*fvaDn_cWN zqKs{af*j=Ay4s8$hyObR6P>6G3iFpYkaz&;I9MaivDook{hKDTcSm2%d>8>VUPQYs z?r8HyXPfWL{~y}?W&!E;YHn4`0w@pGycf;Nh=hJGl3lIRp*As|Ov}W$jFyOTIkkwfjpmE-9BLNh`BX2)4yq92#WYon zm(nD}Rg8&!%a}dx#nAiMHiQO=;3@{TW9)=|YZ&;82r^d|y)J?q8F*O)w=nRW2ySKI zry{tWfd@r!2Ls;~!JQ1;A%Y)OG5C2AZeZYA5j@I3mk1tb;9?Pk#BuadfFjT5SZbP> z!QAR}ya--m;3yHi!a$PJKJj+>XmzWXCz}k6LtZsZ7$I<6RbQA+U zA{fWOWg?iwK&J>MGte%AsSKPZf@usKFM;CKb z`Y_?ffC4`z*oTQS23Y)3s%(FgBt}$S#A5-bWV2& z@UDM#as4h^F!1K9Lh>eV4>|l+WJ36RSP+wILid=tb%-}2xh@$$76iw8|!t{_}MIE`==;Uk2-?~$i><%cs$kHBhTLZon51+V_yB-cIDV){|{-r?Tk8+lmxMfz~aEN)XBr zYzXra79%V}AoV2So&0cLBfEgui*OX-QayR%o#*AL*bdNZE8vEhP)icuP12mk^DO!& z5REqTUhomYE?(fu%5ws zGIMuo@U>U*cqs20Q<7)jC0llv^T%Ey_jafAN$-&K_tH#1KFtnt>~$i0W@bh~|Fs%R z=H5@@+cuAu-47QFTHj@-c-6V(y*_;PVDjO6eXE2wpb*S49$7OS+sp+f3;TMq#gBCi zJtFXy8qER!P>FTmxR@>8SYKpcp-HX6#kv(Z?4W7pw!(tTmUgRMiaWarVm;V%|E0W0 zjMHI&J*s4C??!x)iTfe;h{wi;b=`7I*Unn9a8F;^F2IfSnOgGFo~*Q%7h#GjZs09r zKKh4so;oXSd%LoEN%{p+h7Cc;3T99}*%wGaeZLuuOt^?EciRe371b4Vrfp){(vhw! z0fZA}sLjGM#4>f`fvaUdoyH{yhA0c>oa3nwZ=T^7${!u;|cpY zcis)u7F}y0SL>tk7~}W)WPZhTlDIcUJ{P9mr_{ZwNZ#HNd|VZ&*=vx0|5OLQ`YCdL zuZth|6e)f`rHZ}dozhs#B6qMaL3@MNFHi?7F(#tBx8sv0XLoklVJOF>PVs+V!0tcr zNP9X^ICd5mdleXb$q4v<|MKlqG8;nnmZIYWA+weK`;|hJL095k_nH@-veGYKL7Hws zqa7avG5-dA28jD#OX-j*#ha6V(RqKvCsvaDeJOlqC7HJ`p5N1-tlgI!{XSb>@HgA z3G)1c8+i;0zPmmWvZ9Q~1@A8oxxOZc5v{NwEkvY}U-$ov)B3*-q)IN4?jMxkxBP?Y z{H}ha>4U+1RX=j;gKvR5fADMk?)va7XqSGZ=*=$7F|6_~@28?R<9Ai3yzJ{^()f`% z$)6YDsb+buS99^pxvTYvd_?^Y4Tzhvh>ZxlBBK=m-3o7x@IIrYvlo$BhmwQiMFKcS zIGVDEY(A8j;w@&|Uwf!+m1w+>-|35L!S0$3+h-}nmDrK$jWUZG2?{7Vf@}0%l#MXl4zc|2p(H|V0 z&94OL{pK&%DOV3ijVK94&En%BIKBem_)-?p%j`iBoEi$uA1qsU-faQ0vx?hwzZ-8pm|u%vXZ zksSTl*k>k3Wy$@h3vxCNnn|;R%EWgkO<& znw&e8S5*srzy}iWpgMcf2@iKnnWxEf(K}jncejtlzcYY2VOJeEqk%BYH!ViS;dIA);<=xnFR zF<)yO2|E)XJo0``56vRkXA=7E14jJ%W+E%$Td#$HW*Bqv!7SZgLn_Z?q;#y~)?#=d zN_`%Pg=0lNL!n z`U&#TAbq`)9CUy4p~TRa{WPvl8rmPA_e)>jd_JRT%!AY%cso~ykv!v(%EXr%ludCh zi18Vqr-?Cr$2S#SG~&&9Q{FW!_4tCoFjeN%+Pl%0*Rf@1N;^wO|LwI;_mnizp;(iv zXLoJvjRyNDcm^tOR9{B@C|&j}N_TFk{^siG@M^KL{)Z${Hd#2>yF3#^z&_l;YnCha z?o`DpfxVG2LpB}k0oTlM?iBX#cwBM`=8zgA+o5O3J$}61n`Z18fPdk`Z zP9E!@6k}hFOk4moL&c`o$i+6@67liWTm8jv16%s{4}NI|#sQpeuK_jLbLQhfJ*2E| z4te~uVX>`n%=-2#8v)_=7`uij=B(+JN51$hHDUuCd04>dtH||#;QB%t2|b%2e}a|l z%Rc!|C?lC?3$gUAIvbA%s;`|*;+wXR<7W-(DUAD4Ppc;n?@gZSj-6)|9VO!MiB=4_ z#%ox7jxAnNvk$G=12oOK{yo^;kTgHRUA`B2 z?AD9ESdZnQVF^A=>n=i$F|^B6^7`jV>DAR3i8^)(fg<0y6$an8d0}=bwToH4x*Z?8 z6`uGx{M zsUC&=-|!8YL@F<+dHHu_&xQ0vKW!Ok)t6gVvgtZL5gh3QoZabL6Nzvkr9gU95JVrj z_|`TT%`>rh`#1Cm&6J?%olCI|cP`~W@6K!O_lbMLEf6{f(gIZE^Z3*80L2X~ng3-X z|NO6H{g-LX`~C5k@0s+aosx37gegM_1T1(mHvMk=I~;yfJJ$D-$+8~yvhyWVG;J>- z?|c=@Uo9c0zRFEqkOR&e@U00RC(RP!&c{iA909i&3Or7l@hj0?9Lg8{i`XuzVwjoe z{Eiv>*N7sveH}~hwvxRU2l1D`C(RcJ@Gm`4-}RDA63iZ%LThC9Ncz%wlJIq8_Uq%t z`NIoL72L46J@x;~2Y5A7YVGV;`vg!i>y44alLY@ihhQO(eI0>^bkBU<4{H0?*U34D z@Rq~>8RiKC6E}9HaMzKDVz_gSC=lC1H>92>uUvdNN_kW*o(b8P^ugaOiD&l+b-SSr zjkWBTxx(@3>ph%w*}src_s#GwTUyQg$99waD5*LcA>qy=TtoO3K^`gL5)f1f`3U6* z%Mdmo>_j+>@C`yMg0#1U3r9#s$U+!{@N2AuYeqPSun%D;aC;FN5H2CKBJgm&g(D1# zl2maf022`wBdkH#i*OX-0zxywPY8b?^om9S1Py{2VI0C#ggFRLAgn;xg0K_eFv2;6 zD+oU!v?KJ0k#PMH(h*DuqY);@R7to+0M;SAhVT)>R|wY;+7TkrgJc8^!UG875Xuo2 zBdkK$fp8Cj{VhY!>O<<3!53P5MfIQdi6X0IVsFze*KYeCq)y*ovg779p$sAVpiP3-7G5VnFZDvM`1|zzAx1)9he>$)X&aLvj@1e^7rvZI3=>HJ{eTeR; zs-l28{yG}L2jE;A@Uj^aj-n^md>LG8xr9pvz9Stq3(J=5e!5|va2&ReeLvYZ5gXnnKNdjZ?E( zvrBVAb6xYBri(UFJ5W19TdbX{b!eZ`uGT)UeObF(dsy43?VT|wqco#2AL`#FbmF6I1~a|=(Axg?Go&jeNxs_3og zuTUv+6f+f0g-fwT@rvTO;;y2bGEAvc&Qj*7E^437xSjE5Mxw62?mgWJ-7v%Zh6$PR zStGJWXP?YIpZ!Dj&)Gqy=_dA1C|0q{W0_)^;#I{S#m9tHQlv?w4=1Uv}d)yXxp`_j0ZC2WK>pVtj<`UQJYbp zaUesci_!g|lj?iwAJSX(Gxf9eujxP0|6AXtR~p6`UNJ1qT!DexpV`BxH4ZZtVB8wA zDzj&qoF?|~c5!CBG(z;YvQ?F-S+03ob5^q>Biaye=wnDR3^WWeC=FUeuEAn>&al<+ zn!%X4IP=-eD!~|6l65NUTGmfllI)c1$=U0(cVvf~l%^+4 zEhbq`WsW;%YtB14CvrZ|`8uaHhqH+GitDOKQKTz0ifqLLim{5tidu~3F-0%sbmbe$ zKa~xtpH#Ed%hc=DC)IzbC7NJO7-TI)ldjQJX|gq=G!JQtHB&URHS;t}H7hl1G|y=c zXwGPEYSdbTcBXc=cAmCc`w|2$JEJVap7Bb?n;ADVe$NQeh3n#UeRTtMLvvHDO$q#@DJ-;i%OWcbu@$?yXt^$&wIvukEb=FrT%OiQLc)0tVBS(8aJcVvDG z=?yl98`CivWkx$2X;s?Yi$t10VlmMl9ydrbBt+55Bqoh>&-n-Wc< zO!F{Z+f3I?UK5uyGG}a6&eEKXIeT)x%Hhg5jyDV~R9zoYoK;wQx) z3bisznXjx?u2sIEtXE!8eyfzKda5E-$tpqBS3N{+QEyXUSO1s#j=HNRi4819bgJfY zjYqRy^8#eyb4^ce1xE20RMn$v)!)$vWX5Ig$*lSz)0UNxotk|m+nYTD+~wws$@wXV zt!?>WCQUI_u~N~jT%w9oXR6Ea?2rrD-P zO^=ygGu4~EF#VS)5&h$q;lnS~qg2ExHPEK%npd^W8U1t*=^oQfG<<42QDr=1{M`7Z z@oVF^#_x@C4AdP+be(CB={F2ex189V{y7iiJe9L6rzPhmvjgimZUv(55Vl#0wTjuw zdCE^zpR2m6!_?!|)6}!oPpGTad0MM>spNU}kitK67;Dl+1aV?`EFO+>w1OTgdKj8ey`S9yYBp zy=$7xnAk2Z{+vzmsG>^olHxtZenpycz49exglectuUewos@kWzsQO*?fZC(Z(mbHa z*OX{xYBp)RWF+Vw)^YlC`q73*(b_Ln*%l2b`l zGL>AlKvk*QqS~g~q1vh1r8=X!qZ+7Is5NT6I!kR<=c@D7RR!wj)LYft)jQNX)x$MU zXqIWJHAJ&T^OEKj%^uD7njbYkYcjM(tyBAicDZ(?wnn=_yIm{E=#~+hu_fbm4CdjC zV;LDbBh;@*w@CM-ZW+|ARTrjD&?oCP(5%t=arzSd482XiK)+c3wBDnCPXD5Q2iAoT z^tYr%!fIQ>KZSxCV~PMeikw%Zj&@SCqdh z)v9r-pH+R-qtuO%`C!d(EL%a^H?_yLKWWFoLafW!Y1o#j$Xb}S4K}ilS;uoYoFWRr z*!5P%Dif9clmnE5l~vm?WS=U3P$sHILX7&UGt?v1bJVY6RXnf$Rh_4K6b9)Pn9_DM zpw$l77HHRC{rg5MXyqB2j9D3TGj?Tc*S)ISr@x?|VQ|BCoH0C`xhb)|A RkhJ|TEt1R(+Hg7Te*r5FG7|s* diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe index c5df4869da5ee0970ef4f652d967caa80d5ec63d..a759e270d0bf784d1cbd03acc9492cc25f7e4669 100644 GIT binary patch delta 42378 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/t64.exe b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/t64.exe index 325b8057c08cf7113d4fd889991fa5638d443793..82fe2d99e115fe361782ac4e84f8a4e67a243768 100644 GIT binary patch delta 30687 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
2J@eT_;Prc$CoDN`w_Dh1CN++I{E9aTyq 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 delta 29432 zcmc(|30PHC+c&=VhQo{pki$G2CPhF+K}8V-h1}>tamJi5z!4So;D{dVKuWvwL@o<6 zGtK6*OfAs{aY#{d&Z4YDE8B)CYAL39zTds~hI*d&{jTr&U;pp=Uao8TyVt$$HBa}t z*V@POdZ+SFovK$``sFYFWnzbzHfJ`x5OWp&heuwIIilceG0!Pj9diSCBkJXtE5KhS z>SOjQ{4JXNdJUO^qh=M%q%=A0FE@+h3ZHV~R(AetQX8*@i{yOV1vien4%YiByS_K` z;k!AMRtjt|->b`(ZamkYLbmYSYq`K`o(pkTMb&==u9)YzM7EVr5^9C#B7#^8@6!9m zuL$*mqof^G$+mxu9GBm1Vc|6MG>((|5Elug09sf#A*gpnI>>aee1WmRfBdC$TwS*k zHL6k!6o>PGK!3IhQI!&+q}(X5#QzdCz1zZ~;`s#}H`IaB6x5P!+;vJ=#)rIaL}^ld zIL>6tj7}77V!miIG}$vVLS;v0(B(hY87xFC z8AXtjl9lw6sj4VN&POpbq=w2mgn2+jzy5%H=8@elN{~U8Lee?e3uPd`JU@heq6-PT z7LMGM@Um$Bb4OGtL;5;fI+-aQk#zy=4_##b*tZd-z@8odm+0`|+8R{r6EwV|bV7bf zuO^mZ`y5UCpb|N?Wa!0*SxI%$*YW}_=}hTRw)C|qosw((N&b{5ospNKTqr9_I-D(W z3LpB_TS_Jr8vh9S$T_HtQXVO*MX5kiokP}jF}@Wk{}rYd+9Vx8$|$WIg_PCgJXw>I zAMeBNIfeCq_rJ)U^=p&+#0`yyrji=<&mWL`{AITfw@r$-=cInWFi5{gSIb5^2MbFh z*gWTS*L4`cqOI$YQEZQMpU5zZX&VzgQ?!|)^W+D}M3l%Y!7DY&Klm^&m%h&DUD0n( z__JIWUrRM5AWe$Sy?03rt`noa5Uqz3r%suCsG*@jteO<*=EOttj2M z8*I&pVvXXCVyIvkai7yzGf60Ly-7MDN?#*JthF%O$k`3YAS*Ri)|GnL4ckFmTb=Zo zKZueUDkdEkt13%eh;cvZT+%VSAr>i^Y*|eid#foKsZqpu z%iV`K@SL!SRhiL7yWtL|Y-OF(FlU zdYTM2L#Y~jIb!eq1JZWGA|=_e^&~W36)I7M#*)zQiqLRX=nM%BRfXoLLWvL(ZJt}f z+(#8Un)MznICeukqL^%G|2z{KRis8K$wFn(9O)uDF9j`L7@f%BpI8pF2Hl!;423sR zDt1HVHEOTYEW6<%C{+{_z9eHWEqIwyUDCPCDpPcIpn_GE@jdf9TT009;wo~jpreqN$FzT=GzU=X=I-DI9epQ%||0W7d0Wj&F~OO zqWT$>oQe2{WR7cKaUG2AHxQ(Z+^)@RY==&ky&aXp2O`!^3bGAzu^U>b4KX@Us|K<1 zqS-y$0ps-EwbQ6C1Yd+;MlG$jqI6m=aBZ8cTfwiaLtSV|TiZ&ly(B=tr^9rNVDAj+ zE7^q1l(B?_9h8NjkKrRkLKJxd$y<*In!E?ehpL5>Md^p>nSDE%1ND2{iLdL(dg%Qv z*Re=rpt?-Ytcnt?hXh)@j1SsYtS6~DN^!8>(dzLtrpR>bz{t`r)2*qI>N;eD5K2o0 zI6}c~DOrySR2Wot7bG%jv4kp>Ey8p{md5E;OBg$<_YB!h2|TYPuo4NNfK=NUDrFXH z(fjg=Oy@PpG9s>RLRLFb|68td-2O-;I=yd-S!WyZsM%S+=d@_8bJXuSOG9@fhECGm zOxtu9>IGMmt?NuI`^`}%+f1RkV}|sleowu;5}Oc8(;?gXg^;1&lf_Mk?2jn4%TOvb z?GrTZpSU`lGD^FXjbU-djKq4$Ae-GmTm~Upe??7gCD;t7XH+GRJEB|Lm*;ZjC{ze5 zz0I)CNoh)L6;8a%x_KwLJqso^>zzN?9PcgxpZ<*1?Ub^sttRn;Rtntt2Yb&u=!tn4 z^eCvSh<2Ucw@;~zeuz?%E}>K~T+Eo_&3dg~166Sk64&o>rds`s7!gX0d0LD?|BT_u zVtwK)(@+QjrAr=IaR2H2soyx(cXEQ9Jm^GkfVa-+M-f?35KFFawpXd}Rh@|VEKZ3#g!yS~ksyI5ugl!|y zWb-_$W6yQ;bL;D-j=ter+ll8&y~P6uyr$nfV7HeF zcMgdMj(J@>8OVO?*voTy6c#-Wdn+e9N3rg{F=MN-`O`$lN|#IH%v0{I$e^}d^M1^^ zZl#fORC_d(S)KK$u>2m_)zwLL&EY1gK8tFqXb+P^*xSDSJM6*W{)Dos3Xlg!vOB)f zLS-ZiG>rA^h7he3pG2?~hR7%fq$D+(q*Kb;ItD8+mX$w=37z6=>4f}o6st4DMosF+ zbF>k@cUkEue|cMkQhdANad0qchD9)Uzp(Jr-PBs4Lcx8phMNs?K1pH(y36AtnCRD8 zn9!ds@C%Fh3mc``Pb#lRNh@{xF-uEb&gyz<&emjh1 z1~ALqJ~RZ5l^W$=24QW4lETR=(?QvZI)rpZ$y0<7?GUK?%RdmOh59O?ukM#Ll)eKt z3i%JjMn0a+@5&32$WcWXmS?n+qI9I$M?MWHc~m!lJ2L; zYk)(o3j~?1yc&g7xqF5IpHiKI3aE#GDL9`MSIL7 z$WdHR{l0|(dL(dd00r8HQsBVv*plGE!mnZM)8OEMFM|Ib=_5g3n~ws^NjdChaQC2B zP1xrPn$TSX<%J{|hgQOrm>$ehLehlJ!E8xLmaxUdJ`d?DydK2vhs1|&8m9E654v2G zzM|fJ!;>aRvxhu6h-HNCaFMVJK?zJ@84bS7GpxI3eqj5+`YnKEhYc3$OzdA_PYOSc zV?N;ve6z=KT$Xgi1YL7xw)7RIO7K`#6CNs5nApeRL!3t-OL?O|b2OIvoF58044S$& zQs4DslJOPKg_z75$8KPKBDxQnK8AEyyE)F<`p6t37C_}XE*`kA!}_^mFwa@9go|^| zq3D)>lm3Kcy(suBEy9t7ub@>h_I}ri#gI6lXM&tuhd`u1E)u=+)sjJ zJ!1~{iu{}R0aOfYz5Uwb)M@>2T(qump&nc5Xf1HTY6CR^N-HnVn8M;aMGEm5Y(%FV zp{yg@+-an+buzovsi!b^GK=XPCv-_?BRh|aTL7&@%kUBQXC&SnBqw9Ds-~`VhW077 z61DdacDA!0dp4m*;0~HgmG;sA`7UB;k*y%vHwlaR)hxGb2w%wNc74%fA9hBQ?J*t= z*`4`xi;JuP!z5X*ij^kIVW2XrjLmVCb<4Uy z-|3FtD-D&M!9EH*0Oqi}{3kX?trTlOvJ2e`gtdCsuX~7R81yUYF9$5lC*;knpnGzM z2|1+X9#uxw^Ap(X-A($_9opkh0=X{HH>lzk8UPzD4d~PI4Qho(q8x9tZi$^|98W|0 zi&AJoXBr*1^c7Z=1gd9glGrzN0GQ@d`N1r(s&u&#Sbg@)q&c$8RlYidh|=+h+nM4* zTOB4=-Zei)%HVbcVs{lKcdW7IB>83bX<{IMlYNyqD*CllY+p$iaq_CXtAD-@X>^n; zFwfdHEicf_)T3+srRmh<`8;jfSfd)`_nV=qRyolc>??PHn6}!6d9v4fbP5%)dq{_x z4Rk;=;uwL!OQ$dSoI5gPb;c0p&@;ko6E@PetYSg440rJNCH{8mfm9+IBqGF7Ot2ZWH|j8wrUDB#IHr$s5{5e~5+m*nBjqT!3JV2DiOf zVL3ShB6h=xiuF?$zh?2nwkUahHubg(3T8<9T7_=0jkP=>kf13TJR%@9hIvuJ7 z_!GctkmuvyYFgjvyh&CD_0TWRL4D|We{C^l2sOD0R)^Ks*P>i#+viYz9P+4UlCBKR zNQzsYvY(EL&Q~lO@`XC8H|cX$oZmTfhKQ4D3di2*9c1Z`_!MR|(Xr5kqb8PA#Kh>d zB3g5#C{;u&c~$9LD0!RawbsG*p?jX9OS&6MD!Qq(1w+1?%2uVz2luG1H<+%DT-{M! zA}Gvhir`6xFl0L!2V0%1<|(lodLP4TrP~5QwYfW>@^oJD10S`WdV>0qhsT<>970^F zn<{s89t8x{Lpi6sa9pw*&egLmefIWQ3{{CUhaom;R`Lc&q60f9=Y3H+X*Y}mTN>t= zp%_xKr3={(r{yPISanLQbIVcmnAK(1{uFm!26O2mpCN_vKCJ*mfhZ)4eAj^S#OLcazlTXMW}Hyz812P}RF zx^$I=r}-60aa7EDm=uxTW{O$m(MqezSW=PpZP8O7j5|abl!ie`U7;lIabI@3tRy{$ zlD0-a;F_b6z+^SFmEzhB`w!A&3Ke^@jcGlF^6uScNT0F5=N6}k*4GERwhLpexP#|vArhxLIS6aR!D*amp5S|qoL|B zScykXiutXB8tHz3t%wfy9vXlJAoIaa)>gNE&m7~@5r7s6?oB- zXPkJ5eQ?3R5~L0e=Qy6FN%5>OBRDGUJG)&j!^qEq4Y4Y#mXv}7c@7xbj@J5+y_&IH zh(6821{nq6^se+l&b-?!Pa5kd|tAmgu0AYJfH1hzdRQq9G}DFA;l5>2hrdutup_6!F$Z6K~g;3^V3h23X7m87(TkVcE!E)He zZkPg2f2T!3n7DJmRjxWR_F{}H2kewxY?P^|PVi{^uuw)ZWyss9gAJ9 zX)k%RBc`dm#5&~|g`szum@`e7`a63!Cs6qALv|!5m*2?zhxZqb&1PeVcNJcp$ts2? z33F$%y~AG>E}USKNAwc9-Dm4Z^yvHG9v1CEq`L*T*xgJ0Fwkr7P|KNc0h3yfc|Ypxk48K;aVf&AF-0)Man=WqN@I@d#({vYjA%xXIUToRqAt8m(VU52Fd0xtq&fS`ij^XjYoA}&OCc1H$~`ii+z(DC!D;? zbR#qU=fAJ6saL5Cbl{gx+YN)>XZa)j`MzxF$h}=HSiba?wV3yGu(+Ve4G+OlqLxRY zi$Nv=e6ao*N|iotbO^ z@+ip4hF{rlV|p3JVgchyefQGtB)g*8M|A@OS)Z{JgycJH-PldS3%6O~xFX@DKUvMV zIC04l>Pjh=+F}tDFVF#?X>0Mb_J#dQ9{Uf8pJyo&UL>9N4}Om$%yoRE#ZzU$T*vJ% zM{|hrr{()!C>i8ZqVWEzdJ`#yA5=Pzf^52(w*VMkLDs!w>7%S?6@ev5Bp`oC!nPH8 zpF;;A@vbD^cSwubN0ju6erf(-P;?9CwjXW}Ta+#5TjE(^&aZN4 zc9x?L;S%N|jn#dxGvni9EQb$LD-9E=B0BkF)t9IG-co%tRo_O{SEBl!QGH8Q-zvo? zDNU~=G*@M8QJd`R&rt?t0*?iMzcOG?%b_?SvpbImd0S;Fwl>L~9 z5E?wKg^isUCDa{Y%O}RW41SHY#hhDg`$S`SJoSZyn%~|=)6pD;%>l#GgT|oY?lyLP zVwNBsU`dmP2tFrS*`!6GJ>I7Ezyad41k!zn9vnq?y!tBhm>eVMx3Z+keLDBPL=AI7 z9;b}W6Y^skeyb<~CzP$~+V&ajxyj|0c{DDiZ_EKuI150_n};aHagk2g4Wo$RIU1SZ zlIK+d&!Yf&70QV1{Bij2WWj%&GO&fdq==+#0yM*>=Rn02>}Q}sx`?Tl7XBt$)0`8;RM3KRRM(9>=#b2{F;O5ZFX}75 zr2dgS3z3Z7Fb};&Mn$MkiO5x7fkvXx0ZM4@7S?m>fCMi^s8Pm4Zi z-B(Du5&ka~|J7I6rl~zbtXsjhc@_fXJ?Iy-Lb=LXu$5h#8YYCcGS~c2A!sv;&9?{> z-e+&;X9+=^;Ne4>$xbM#EpXd{TYn?W28a*LJ(IeH%L&q9+_U%>sl*mau@7|4ljdi zD~tZ6vaVxk9FpjSB-D%RO-Nzg6TVR?P(~W)Ci^@c#O-yWwYC4^A;dTc2BKVipIw?3 zDm2VukEZ!qnl3^d+-mF@+0vINjvR>f4E4w`(RI7RaaK7P@P-h`Wz>2ZNp(3XU!4wP zA|^4kfi@$8syI|pvj536|C6c8b(lsx?Orr+6WjVkde_srR8E?5q#DBlLzmU0j@S*3 zsJ|#Z6P+#qq3TB0vJM3a!BbE^bcNY}FB+DUN2tXOwWhuI0~=cq8F=|muFZTbO5b1< zoB;z9^CebYFj&ai#4Z$c_AZ1rF6uaUH0a4H&jBtx^DOM<5Ca@g=;!b|cG~fU{kndQ z-FROfa-r%!LB+rvm?;@v0bjJOrRW%X4i~BnxVK}U7Y^R4 zTNLMgZlf{}v&4d%qRrD6+z~}xh2LLftBRr=_B-+HwW23{)A`1}qY%6t4 z98E{e!WU7?w2k*z!}QXiD8yJCN$W1nR7+SqeU?*dC9}r4>SE@-=i=v)iYWcl0s+JsLWe(r`^i2ZjFv-A+z$l zKJ7@sqrJ%TS1nhWFIN6$4uFo751vwl;JJjQd_WL^4sW?)Y+RTO)#|ZpowxBpd zn0Jn?FYeND*E(e;`_o=Ae+N{bp6A$^VqdQ@pkeCuj7Ca!L#K7@_u>R0w~0m0?dDkb z9Cp672`T>3I%I=mra_*4w*4e??+n{E_X*yeIn8^)vk*&;X6db*#onIR#n=rT#niio z=AjY3s(|KIvOfrn@&2>e?RhB!zdEf5l_tpzpvchM1(vbcBhHw^Was@D+;%(f+lt4J zlIug|l*7|bf>TZFFfGF?fru>V=MsAMqPSyJZnh$io_0I{Iu?tv#^SpWPaOJ5Kq zyn2#NT9A>@`2%WZ<)motAP1^G<&@}-X%d06C8mg?I&NRcjxFdRyimX%E{N{hABzQU zeCXmwoO3KsbnrOX?2PJs`7OuY&2TZA{gci~r(l8?slHZ z^#~JCZ`}Yr5!W=Hmb)KLy4;I1`cm`FJy9+1!-#OY#MyFERSv`K0lCRN-w&LeZ=q{MW^ z!?G7A@kX|Cu@V1nUhHS0;0%XvMf<@lTYhWi+RVhh8RdWRrQO=%K5a_um(j1@9Ezh? z;99pfwi@9+qEeiGN(I&}F$m#R%zsI=2fqd*%i#*7Ta9eUl6A=K+a=+tscV%^cC#Dy zKBZ98`>y=XJPrF_m#6G@MH=O~o0;e$nuE$$=DC@}GuK8Taio&GG_J=+=t0Crg!7d! zEbFPsb@d=2CfW~~Qs>J0Cq1A&HKR=_?`M}T;qNl%Wl<#sxJiBX7=c7{nMe; z`)LO?^(o6Dgk`hX>SdjJ{8d3c+l0Yrup3+|mGx>h6n*On`?cdd$E6;UCO1L%oLgbH z4^=X0T=p`OU%cEHzZv3)*uicHK`NwAyns$ZCG{0H5GZVgRjVjFu-q6z#X(tIpU(P5 zDTnIqtCsz*;g5BV4r9rJL4VH&Mxj)KbuygVxg~YJou4O>!vbN4Gb(AhOe}rXu8iKARfC)oR zkemb`#-hjHQC~dB{#ucd_5(Eaq>C^WeFQ>H^%~T8F6m^wj`yPq|+g}!L32RSRPEsV%_6Q$_ z?nlLfWC}-gdcmMossbbyC$g5qU~Pt}8}_1%sTor;Cd2Ti+TF00V>LafL{e6?5o)An z2Pq>&F_vkM_*k!%k%Lwuu0zk^D4XaN6}B1q=Pt9(PI+2 zSNcLseXz(wPCLL}Tp7+LUFh!EcLM75?1jO?`-j-4s|H7fzJk4AQeB(DYKv;H8U}`D zuxi}TZhhs)a=&t9{Vn?8V=Z_#RQWoZiFT4cIJ-d;^g0DiF!iW8mhM)gOa*nA_X!Zh zZFz>Z3CrbuUCx}kyc~y$V>HT|-B3!1xLVkYme>Gd-5r!tZcdQb?{CjHg7OVuw=7fn zCN{D>i04>wd9&Nz(`wEi_GHsmX9){Wv$Kss?BME9Vec$7l;KS6*PXPlXG|mauQ0N)V*=Ed7T_ z)@9Ad!gKNL@)|$Kk47MY2WvVzJ`G}5r?pOeK=Q}!ZFJxxyFERnbi=jHc%aBkRY7Co zCZif;1M!mYAy6HWbg4TkQ#y@<7hPyVX$)S1(c4OLE_TDeN-=PRq&k$z6-BZmUULK5 zLBzO1-~PyMHu1OtUzc9gi zRbOHAE@S9C?dZ5;66%rnbXf1(P|UP>;;bg8&ZjUG9K$+Tz6AlwRm*M|Ggq|?6=zM`_-E)?}Z%Cn{T#r%HCuw;CrBGFrduaLYNw#G}gwF~D zf!~j8%jsCA_KafZH}n<`S(*EbF@m|4^?Y$aK(t~!ZG{Cmi0m(Mzu~Ceqvz1tIM6`tr#%r*s(%p#o#U8cyetr^qNL9?o@S3VR zAJyGI&q6i_ux0bzS;$5&FR+7IQa z#{JyycQaFPuyIG4N6~mvYjX$r$@a8x=Z}DoA&ZOsV7Uqbl-aa)0r|#OR+sD>qP~iv zGanA>=134O<`7ZJ_L8TRvzCn`!6a`1$q z&X+uCwi4dlO)R+4c0Vg;QdD&`F8X^kE{{~YV_4g0bZA6ErF)QQ2oj}jGjk>4Sz|ol zM-1iVJiPorii`1hvjd!2-8Ne%bPC>6~o!*uSk6cVOOFW zUBv1o+R`Rrsx=R5L$UA>@0~#h6(YEKF|8iBmOVNVVbHNa?gohiPjR`ET=&ys-%j^u6<@s?h78DB*O{+n}#mV?2+d zF%L0u+d5%k9{XB<*hU`cQE5)$&*>^DaHeLWtzS7kLRyLdmbfSx_SbchAL z8JzILSWKFFc|4-ZKKMsUx%Lt+!IU+?2hq?u!_)|4ln7xpN(3w$9Uv`AIZbxMCa`cP z`L_JY^KA5+F&_D;NI=Qt*MqF$&1qAeFQJH8^;F(Kx!?2nav}wqJ7><3+~py+pp)OE zIqeQz=}YzUczV^!FXhX4M}zGBr(0Kk8C2>e7L2WjeDGuHLH4lZPDbBz@;g85%6!X> z_u1D6xng)Vv<1A)^4|^;o;=3N-tOznZlZ#t82j{Xqu}*D`{C^n;r4gz;oF`4e(tTr z(^uS43ZW)?hV^~tvT%GP3wbxeV8WKAG+i&dVJWmPwAZcY*yML39NkjT(@(zJOUSNf zd*6-j&>h-9TaSHG&6?kx8|;f&M8|tN+DncH%L`px9!YxnGR0i<-WsD%b=!*AJP2A( zw^UE@Gc1Rl!~*)(WXxwQXnVNl`DfdN}DlS_CMqF|MxguDNby> zgC^gDlD&(qlk&g=htu*k+DEZ5XcmNT8(87{-GrU}*!uU=1+k8O_5N7>-V8LQa^C^- zs^e_d?}I2W%PY9La>IDQD>b_za5$U$L72X(nx?#HJ;sZDJ)?K9jUUVszL>*wJC+K4 zOw6()O~`$QeZC`G*glN8ei$QcoXrwH6op)Z6t?rjM&W52duHcSVMjJ|+GPq^{s{^f zk8>?v!;_iuy`#(C1Pbil}MC56~bNCsf={_;Z!BIDBn?uT=`d($dfOt zM84dp5;Nt~Dv=@|QHc`yv#Ay({!)3j!jj5qy?RTfVL##IO)8B6z{%Ary@BWomEJ=1 zQk8y-=wg-LL3F-K*AhKOrR#_mRl1&NOMle^t%H*jRl1SrXq9dvIzXjmqCHf)g=kKt zTZ#UC3e`lSnVb+tF#5T8=PFLdX!7x_f$HO_*+yuh3NGv zolf*xm8N@MxlE;Vi7rv;5~2%LdMVL)DqT*rNu}2koj%2)l)9Qc$!fp`qGMHhCea}( z{T9()D!qefN0qK6x^=RWP94$LRl1(&CY3%z^p`5Vh3I;fZsaZSe5!hyC}4+5%S6AX z(k(=9Q0Z2ppHXT0P*pBhX&0i+D(yw|OqC8GdXh>TiOyB&SfVpQThM3psiK^s2BZ+3 zpwe{nBO6s(B-&S{bBT6Q={%wzPEu;0Pjrh)&m{UMl`bK=QKgp>-JsItpvTK~s%I?) z>{jV&qTf>K4McBJ=`BQ8tMpq$SE%$3qL-?4Ez!l3*tegDj?BWe!EN?qO2{zWn|h|I zoMe^b1x^o@6RC3Yz?q?Pyi^X1)}E79&ZCJ;+;6m8$C(_dUYJOg9%e-N6_s;H<-~&1 zsB%73Ie4|=c}nHHqH#$`QfYp>k%aoSEQ!Zc$m|RaOaDyH!q> z%2^7|J1Qqh;Yj6}pJ2YMGQ(6RtuA0zt4vpwiFy*#sxp6n95qy)Vl}jVLV+6+HoZ>Y zp{DHby*;XoS?l73DP_BM)U6aO?oeq&Y3&(G3gV9Tv(215pgVlZIYK){oVDZ65Z@2% zDqS%tgl(scD$gSFR(VcWVTKAb0m>;v@*GPXd(7Rw^m;=3@YNh0Fg{~U#@Gz@-l2h( z2x!lmdF}nBu(qT_ANc+y#F9L}0$h6rg#+tbm31D_jPJZ+4yyi7$X_g1Fsg`RkawY{ zI}0)QM5%fURZKc=D$w;A19R^LM{`G9k$EYft28-^4hO|lHv4d=fJ`;9G{Anu68Hn1n&pA(nf~Z7%f6+EMsGSZ zqs0tKHc7Wl(lt2`njOv!eM8v>1mjb=$_v!kHqS*+H0=gYs)^De`U*y!VKWRxfKrZ; zZHnu1rI&DMKiW%?2v8(Wp^O8NC_Z{7K?|Mg-&6&faw!QC=%fg^kN}0RQNy>ihj&oI zWnxqK3=p_@K|~!D7fln15=~IW?S{HGxq(Df=^AU$nO?9+oUY+|DsMV;N5I0v*P{SB zggs$Oy=2DGA8Gq4kv+Flh}441_+ISk`fSe(Me?*c*=~40nKjk>c8=9J9r5vbvRVqd zR>MOPeRWaKVRglA^a;5K&QxgB zc+vWxY4K;o2?s}hbpb0r5gcE+fQC56cmE#BA*3t(c-nM9E^Z5mQUiP!u$?D*1;v1^ z-l*ZeBQ0D10dCpxCB1y06XP4=gy&vkT^o9N%!ZYOlut?b)*?2qp=+1tO6>NC6nQp4 ztLnY^Q1h`I9B`t}dtj3Ag{|(Lm)YTl9Lv3qD9Z`?%S%*peZ_I?MF`Bofn=!U*pzWM z)7hn5U$Kj}sE1E0V;#>fCSkR#Q^vV27?OP__zsmknzAJiy?*^6ys<EYP1l-1Ae|K(*`3o*33py(lg~y9^SiQF&U`9(t3F!-TYdJF5SqY7o{JY+ zYS^lCf&QhiH=s}59dJs@OnqdjZFaF6jB)J!bG?GP%%(ObbC^5;BtBfKy-%CO*)Hs_ zb0H(|#HsDD>mjuHvS<jj;*~k$ctC0GbhCR#`ARNGU(pjH z@&~ghixA4<@GLg_e6X-5i>*1I(X$W%RwF*_RRk219QHuX@;)Dv=szs)<`>#6@9VvA zcn$b6toK(l+soe!63MBScflKtMwa&rDp%hAw_v}StoX~G!n~Pm%a{I!m!C&QD`Dct z*Y%q1@73p7!m&w>LH0&IxH@G&Z4Z#A%pj8>ZUBPVxt0FHvoEsdm8XS|XWh>2Zf zZm=>#>7wcil)`4bebFwe?ySW{RZh=BaFwY7)U4O*)Ty#KHEllB%0=`3?UKs87E>k2 zaXnTH_RQt*)C zFO=THf$q@#l(ZUBrU3ShF0F__Vl= zQFk-FFuR>#8}mXlY|-K_ZI3JK^4RNLdN^#X#J8YbLNYo(1vSoEmgK>e;=!OP$xHhX zXHfvh-D?a!7xkw-Gs$Bw*^}f4c)|b;Qa?=cxC+@oFT3HoKkFSA>)?abro{yd@AVLQ0iA! zEEAQ#l@?MEKE3n9+nvFvmxt;<1b?$A;>%tV8h8XjVpS5JOWd|{Y;}B^!%pCV`0$9t zRp@i=6{>lWSU?Zg%U~;oE_}wSn*b?3VY=f-Pok;kBt){YR|bcrkNsPNX&8g~bf~#d zl*Xpxqo5}F68rc{lFut^v6B6Yu%jGy6nwcphCR5F=&>Cf+tf&`m#Je|pC1zI#pu0aCGuCd-CJi)G{$M*bn$EEZna_ET zdUDw^dE>i8m`mjEN3y?u?v>VQnIiNoVp1#|BVZWqRjqjMmKyicIYQ=Dq2-#;W>sj; zY&QRDPa*Xkw(V-7pqtGuTvPXUT!6UlrTu~CH=u`oh?z{V=2I`q=&dcjEDAlaaC~h zMfrXXxGB0)clk7^qZ~bo7jcJ&m&(YN!H1uD08_aIt*0M-coV+nvCAgII4?>UAhhll zS_UcWD=>!f6D{)g->Io^j3|cay+$$EF5bJ;SG407W$-f~G4k~Goa7ZC6*bxiqWF;u z21%cn2O z=&j&{Pn6Y&4mI-6Eo|=fp2Eq?Z0q&tu8WqcmkIy*R?r$a7ax}3@Q5jeB2di%1^z;WsLbWf1&L-4Co*rPc4 z#W{3|NY|mbsSm_Q*X?a`BAe=hw@GBpFi8iXP}DyG;K_ zKtP^EJ%0aDsfWCmIv+NQN$mP>odugaGu()eOWcNEs8T0_hl@958F-v|*N6WQ7uiI(aZ<)!#Oq?n$GMbv0FJnx3ot8_OeQhtX;?V*(9`Mtux zrzaj%3^QK8eu7D?RKXq-ixS&o;*@`r@h=MB{+EuAKXK_U{R-Q9x*V23HU-#=@abc^ zo`Mq9pnTa8XMtNCv9IO8K+eK%`iCdVXX5`M-X^`*nc8<`DT(8{6V*K{xyVc2V1L~V z6aq@w@Rq>Pzs&y;kxH=FgCbrrlZ0^8%x1NO32&NNRZFB`H8bN)U*Ccp$e}|Ft&6FV zeUHoT@$5oNgpfkvh7`}}aWvODp#<%nsQYkJ9W!nFyCPFQMrgk3OFrdPu~plxQe57TZ~LD2HfeZULnnMK;K&9Z=Z(mXjrXbnI^YZ!}S`zr{Q4@ztT|F@S%dRlLsWL8T8h0sD@KCT&m$S z8gA6^poZr(yrN;NhEBcIbbU26Y8a^hJ_l=({PoB>owe>;Z6;YXn0P; zpESI!p(Fja4gNwjjMgw2NcnT=8e^1(#Tq`P;U*1tYS^IRcN*T-&_nBzAPwU*Owo{j zVTk@7*Kl4RzPrL$r7;>cRG9c@jMi5JG|W$`$;jseSc}jhq&iah)lRN)oQl=QRBYYM zrIVDeN8LS@Qxc_eD4thL+fS0x%9jJTC6ed1_^1VI8qKE@RlaN1AM-se`Ch7*R1f7( z^JBSE{}&bWp=_P*?t{HNTJMPuKjg?kImvo~k^wZ2GfsB^o18 zWpGB#k28Yux5Gn?fa8bqm#+EA5CT?YJM0Mlm@kH{#NHbagMx?N6i>7zJLBAbK$Ic#=_E) z;#mdL%(LdtGftm2tGK986Xp;;ztsG{7eIK?!iE3)@S0XHK7Y?rZ@$dITXOtu=cU56 znJ@o&$8qWtPd>@l=nVX#F|jGi53_RXLOJduxa3wf^L?OC{lo7a%O2UVFaG_>*F0{~%3mxOig(kajp*;he{LdKby!DQpKG~Vm_jE65 zi(k}@yoZwoZ^_pLcWQ+>)KBt|k9n3A*=!wGpl@6IVsvm2(^A)Lu%*-W<0L&Wbz;c@LqcAb`&q z&{opOG>#iIfaA7mg$V41suvzc^$&5O{O4SUI*$_fT#h@ufaB=<1s%ujOetbZC?>CO+xC$r& zZBf0c;d=`0V`=c?95(^(Yb|Ltd$o-zd+HZA=u^IMw>6nApmX7T?jsO?-W?seju;Ic zd+L>TMx0(8J>dNwt}W6{(48j#9f|jG8!g!he8vP^cTteW&^JnP&`-16H}*e-G0B{(&Onm0oD&I1G8xIj$UKup*`OxQrQ zO5i9=R&OWHJK2r%?)mRYL~Z7{A#nTJ+P5KukMUO$@kAmXNCb%?V&FnUT}=y0clMpZ-by{O;GjzN0oh2 zHUB4-eaioTQrTDX{~uKLE$T@5A5->wXv+Qn2W9`)D1K&5dS~93cd1z&&HILMbNL}f z^NJQuGZzh>KX1|e;-bOkg~eHmi{_cRnwn_dR`Xa4pWG$YadeUS9|GdEd4YL<86*LlV` zjxraIowsDxyuz%dHKRN8U1~f!^Ts`!I`aY_{wJmL7&O>1%Swv4*#dl{&C?c|OG~on zO`ku0&&#p=9KOSPD%@yup;iK?IKINCyhPQLX^7HadC4B11b&rU&5quDKz4s;H8e%T zWDOHFjMdPnVSt7%8n!yA@vql-_u)r$`Bd}PYPeg&9U8u+;f9*keRzLMgXS&M(5zvx zhWQ%iX((!#qG6(j2^tzTbkVR?rVjVo2R_#kKQslI^}vD91FV& z@V7*qB*AY1cIcsI-~~JgR|c8GzyUatmO~~T_yCT&^&#*PPMtfzw{XcEHwTWIu^4z2 zt_1-ya5#>d4?*VwkK!n4L=EbJ-@;LAeFy9W#Vr$jQs83xAswQDx-=9Hv zOyI789QPjR-N2s*B7aIqhG%>_#sT^)54aePnyU`j1V=K2T!u;$J_bjH&IeY&HA21` z_!e9f=pDch;eMiYfCu1Y(1(G~4}z8ndczvOx76SYj zj#{M_m^ngiUc%&&=qAV$-hdN9w*bpWAv08l@Q*PZR}6kD@T+kgw-z)^Yp5~Ox1eT; zc^vol1hsG813Eme*31#O46YUt)&jS~QA_Lq7U6W-2>wjqbvP;#2RICAT#Lop<;l_Zj0DcBXnbiU3=c{xH z&^`_S84zSrp5VACa1{3$;I%@i)u68fyBDbyNCDE%pg_jL6@wTsljC+nC>{7Y+!@ey zz`?UrIum$IqZ@!@aP*ZSL-+_z`QL@+ptay=gqH#9;iwRVyKw}L#f+!}X3oXH1WkBi zu0`$3pWrz@52Zsu1JG-}S~J4Ca5Uvwf$0lSAY?!|1&#)3KJXA6Wk!dH%W%|9KLIlq za@==_TMj%0*8=(saIzV;Ezl(v5RaE4LnJy0`2J$G20MV~S7J2;|4ZP_RakmKw*dW6 zXv!b}_zE1=cnk0rTrue1fm@!2O8_6(TT*3Gfd0>5a6%>kI0DW>rOpMh6^QV}af3P|HUSU6h`9?H!n}=YAlKwIY}%qGMCkP@9HtiGrETge*#!LRHLR-OHv$`8 zSJ!_+$2ZiB3Hxg_;Y~PG9M=ExH?cUt1%9y`Edl-+py4BRJqQ3!)#wsnfaPOEfKUMNN-f9z4*DnH z^1ZlKh({9vzukwv2mKxJ@lP=NL6-nu`y3+~G~v2~C^+c#K<<#brx3awR{0*lxp36d z<-o)*P)W#J(m^;M!JvT02)qEd7IY)<0o*g79|8l9sx>wNR~^GR03R0v+<7=k^h@9m z$1&Q$Zvx(fQ@Rq!oy0Xg$&+^q!sO7TgmX@-BeocLTcdvmj)7$& z76}n1H6kI<$w2pSP#e%5z)^6N<{02LI9eyJ13&pmoe`e`NB*pK)0m$zRr*}T$VTK8 zpae&ep8@v$MIChgfmh*LAR_}O$!b9f`D>^hw4elFaxWp#J$_Ti4dG5W zT0eFJ=ifrBTOd>dq8X0VDeg8BzXJ!FaQg2UT%czHYv7a?0(QO&>ks(JKrb7f`2G7ncB&KUJW5aGLpZAkxV#T;}eqUnq&yc z#7r`TWKAYMA(>){CM2^f(S&3vC7RIlzCv3R8!H(=DS(hnmqZgT)9BT}O&U!|20fA? zJg?DYsUwRV@d<~)QQ-*5Mn-%>vL_NvxZ%%O)kEefGC5HI;VF$i54@q!ilGNbjjuu- z(dF2r>G2zf=;a-NCBOjS+M2E=-hbK_cm;TCfh2YYNYOB2%5^}T#>$-l0YGP9A`qbb zsmb$P5q#o*!$((f`8A&*8^@)fYwAqAujATwYC}8qRy$SOPSv+ljct@g2G#c0mN}gm zTfujE6=NPX`AH4nT3&;82Y#DB;0>O8%jIu>-TN3Bs9{@p>~4g|{Ov#U4g6kz`!x71Yu2MKwqW9h zsiS3OrCC1KV`X{C=kW$&qGfr>l+p^zYz!+(QcPmMuX*o++V}Z>e!u^||9sK2bLPyM z`&jq`?3W14=M5|UU7%O^`1kn2-9k8S-YhFCb6rzZ;vti5Cg=NW;&@SaQ4q(~g7CVRIKW6^ zL__(LUy{+H zaIUJ>5nXl5o@TWo#o`G!BWasA!5(AX-<{)ZoHY~;u-1~{;`j#(XurRJrS}!!P54^@ zYf(UKw-q1xjdNTPS#Iw-$1IkGc}S7^_TIf7Lw)Po9`D) zru)b8q6o6gUukGWT{SuFDvz}(b~tCQUe;c{tcAK!it41kLAIgJ+60cVRN?V>Yj_`}X{$pAfZ*F+Mg?A$=r<^a&U?>g%2ySDn-9&Y}Js*K)VGI;TzF zu*|P|SsMyzWBJ|Qj24^7<7lP7M6+UA-7WM&hsWb?QPt{i%Qn_p+sTUo{YPKN47iRB zb{AarD`>KD0}80ef&cBUZ#de=Th0;IfFjm{6(|a=KM`AdSl(>nZZ}%YGysLpad+RJ zNrD3VhMY+f+AMHuqKQ6G{!k`3=jeOb1M~Fti+*YLtIla*jU3gVtd#nYw=qw2aL zwb+Jw91_*7YDXIllyY2gaaFB7-ePSduLQ=Wn@~(mPOBMXYNlg^mbJQt?nXzjE`;ej z9HVM-+RR7H;AG?3EN6LJ0u!A7j$s^9{c*?nW=CXukG+Sht-~&LH`KN9W?Bt#EOyn4T@7OW z6iNA)Y}9BJXj3Om6XwiP#7gJr=OChS?l$^Zq<7kubT`wac;N1qW!!3i0#%oU0^B+6`ZkbqS{*?) z&i04rf~%w*Lfv*hwbgUM=_+YsvaYXp@TyDtoOXwpG3s;L7=k2&mCg7idx-0<$KI{b za}lMXfvQWoDed-9*RpnxJqV-kxmd_5(M@S%M05|tHbz7plY9cS;>K)j6VP45In_t# znL9^P=!D>Uii)bM=pPuz@N85j=%9^t)(QybHY*g=So+l+kEgh}rs@Wm%(jJx7lLZB zb@OOgvL{^4nple_9%2j&9sZEPW?ofm-GCy@bTe|V2(ADtr(iN*TX-+8GhB+y);$8F z9gMc@nySqxrN~SNK8l$-7Uqp(F=c}DcGU?aaseDCtE%dnvj?WEstFvP3x(BHSAozI z?H*5qIO)7lLr>J;-pd#)^gSe4ovi}>ZX2@f75HCdW1*hCpCQRzbq1d_8Eq`47x0N3e<6p} zAMNsln@~oc!4LQo!M+qv_-qhuBI^(=M^E^4M64Tx-m!u$PMUjHSU*0!=9|$Zuz55$ z1Wm^Tu;`u=lOyVrgic*Jm=(H5D0I(lCMll1Ob|Tb91>13Ra9sxavLT?mmO#XTOm_d z7u_w`xyj6+D88j9SsFBG^i`Hb>mZ}5lU23Y1`Dm+&ukw|MxizTh?0F6=sFfP2a?vy zCNa|uJ((~e)+ug<)@-nw>FrzOx1g}t5?{LG$2qPn&VAb+E&DKlWz6qM*4D}l#sbOgb|na zAT8Yo@GvrBrK%p|A)(DlH4FLX9xO4q2bm_7_h6QT#fBMGV2tOu3{7OMG)(jzc~dHn zILIWWQB_-YiEZXqq3+;6$R+78Nre!(&`Np+50>l{BCofS+~6b?lR{xQC20N}U4r9B zp^ts7jo?B*&GgY$Hn%o@nzxmwW#pCM=t#-0zU2NwvN!ED8TmALSaBxO%=GF_HZ;1b zMhKkM%GlX(eg>*dHmR`4+J*t7BLmrDPl7?WSg?v9Vh~Khz%kR6aV$~lr9l%+Clf;Y zO1uMay-6xUb{4)NRJG@KwvNxEBG2B-!Y8Y=$l8chi=~jRg+=H(rYNM3gM5m~VymVL@^t z4UHPG6U_Bk9rO@}qqyGf!Q!#F9g?bBj$TxRL|eqvY6X2*MhZfc__KYrIyEI#N~j69Pf$9Px( zkz+yW4Tk-dNISfWZ0!-No5)I>Hq{<$WfRaHBs-X^y;v3Ync5xths z@%_mkJ%&Z+Bh{_hfWCSzxErgdoWa&;^=R_aiJ@oAfQA7arwg?ItiM}s^rSNmx(B4{ zK+oqM4a>?%0(V8vB*_jmYQ?gvd&th7(USc_r0F2}w5O)`eAtl1!Zbj+x|W4Aef-LWq9J5Inen*srZjiI_^=f-F&6bnHy%G{Gg4^AK8OKaU z>2liby=Wo$*kIDpa`I;{IlpHBi3>|kd_j)}2e@;^djBQehI94^cdo=8yf6rdoxFvp z@0Nxn+RIQZR!F2>v4$ky=cZpvX8 z(FD452vJ2OSvI5L?zSqABiSaMs`F2ZL7l;cbQS9?=JBoOKzah^8lCy`WrDSM+u;7ffi1x%wp43a z8h!qO1by`~`nvMohUsKiN<>Hz=Dc`Hy$iOiC;Sa^KBZ5ulm|#cZt`}-DdVg^ z(NbSYW5?dJ+6pc1-&B{1^fw)0^bQU$UX3sU7SZ*=B0(fARG&rmM2=JMH$v!6V9%^B zXw!ehXPq?5haR!4<+K=o)lZ3+-b_1K}aHN>4wb*$2Do*Q|EC_k+ z8B-M7LJop^s&}rs$|BQ-s-wobb3)OIFuFRdtN))v^OMxL7}<<_w6_`U(YT$e?Y+AA zer461@LVs!c;TGa4I0+nQjCMWZkiabifLka6D;(LhlnmdlgHA2B0in(=t*|P>sYKg zKAM+2L;@02{O7}oK4FYf&SrXUPd1;r90@jJVPb+o@J)<`>F^Vt<`kx_2f{QW2NL?^ zOa+6m)0Tna(+HSVOHozrl48BTBzZWuXsny*0;uh4y=yXSFBMrsW z)SC^jw+VGk0X5komiGSdR0-RVA72&P!VWM~GO2ij~% zTygbu=0J_@wh2Ra%2UQ#;i8OvmkE%Y|kb==hKaxZIiJDO0ycRg7jUCS)gpIuZo*?W^?-Qv1^kmKxQZP*wY6yz1nf>JXMal=cO=frDko z(fK&sk&|-WkV~-5z3oFEo9DWkeud>Fs?L=k|_Sw~pqxZE~ntdSDbY=br3F2MLJd zVYj9YdkD%M4nG`c*RwKP^B@84w&oNwz0Od5!{Qisz#LcR5`&`$9FsWTMUux8lTrPeGI*?0?`avi;c zV=PeR!FeQ-ehQuBHPz_RZX~|1Ix`0O>*1~_Dxxk7C92vEDZ0-*Dnjc6-OHrdZNlkP zzdKPs-(o;-vGJ4KNdQNIVhO_&%70@(zYPMsRzX-LK~GV2~%Q^vj{GS zVkjfQ`&R1+@|yFQIbMY$)YA|g_wi2ab2tZ;j(wr{c(y{!Re9{vBKk2qzp)0w4JPy~ z)Jj>;z5v}lMdG^K;fST{5pm_nIr;<;uf9i?>y=m*RhOW{y5?d_o z_X9XR;U`e+wj^e-uXq>>ERHR(gIH<;mxOw*vhp-}K0-J83nSP>^rP<(>W|xT{Bd3q zm_8T@C7*LlWDk&iSa71*&lXfX)@-q|`!4#gCOGhNnsknA0e-p)AI(GEIXB!A zcem<-%Vv0=U|AMpkV>dK=Q7w`%dT>aeKU zzxLXF+Z3TV&IAu;pW!L&Gd_uZYUJ$G5Qon>&xYp-L2#xJ#77B%f0z*T3l)MPQUsfy z^EV-I=WyH9LMYy*MF=BxTQ-YVHMKj@F#ifRrTDj%rEXIr*5IFl&u*~!8vF+fsXmu* zwP0dyU4>&1oSLvUJ>kp--L?cw7}?P(i~>8KGjr4`K4${Tj8T_?F>sh>5lv=1R#rA_ z$Ot4tK$s1A&)(mvB|QhIWjA04`xJ)eSC41+gaJ>A0;MREW{o9Z3>=gj2HZj?LhPWy zAT!-v$AeaU!ohXgJlrO+%7tXz{mG#$ndh1lZGl#`kR0B+W=d@S6ArInA|vP z1t{#`kt1cN6f-R`V|g75!=@~T^(A-bgn9hKWMtc*KEqOeN1HwXzv>b*K(3;b(;@rJ z24V`iNiUpZWi=mTmEgQeZVpOzPKFG?LXlN&@DgEyt9M!G5=csMv2dt$i+9~JK|e~( z7J6DB=Qgi%x1s#zSvD>G6i54Fcd&5$6~B)o*BHSH>CEaqJRZZiR@DkLM=w-B>9;5! z@kq>H+^*(WRO01i77OU)y}{~G9Ne(-g?=m)qZU##G&?*5iXCGdu)oa@hj$$8>ginx zxi(ZKw}xh$xY-^Ja&hkLq|oa5Nuf1>K}~SzvP)3YuyM>yxnWqJp2n{r?qj6zR`{J( zNwsw7SEOOs<2?_2=_OkPat8eu?xYooiE^xM&MvpIkbck1g=1n&fXqDsf;7$(F7Hp) zD56=}Zz=lq?Dw}q!oMUjZfO5vtq0f+PWuE95sZk~+oX5~v4s&AW zY%oHx_i`Na@kYrWxB-jrtFkQI}vByBnGp z*rI3&j@;P%^>-aII-4w1CH41Cq9d}1{sW^|OozcT_ioYEQ?535uQoOZ7SZWnkprsi z@OF$ru_vv|1%YK?{hfrV2lo5{ijgKDYrXZgJhm?P6SF#1)JmRKtAjS63(S|c>UUDB zE)U)c6VkUDe!5DsGz!rMvQQJl8yd;8n(R~T`dNfJ??0DG(3iIVVVm+D@y*dw^@Gy2VTxAT$r`B(kgP(1^5oV9(jF*!H zr$-N^U~mNsrCnc)exPeR*uwh;yOT8=i`nbl#Gp3hPM%1{r>BW-5O;csD4+b6E+5^F zQwffc#V}SfP${d$qdC>p63-b3R+J6;q>b%`*j-v#ePhI)>VW2M7JBjvP*t~ZQ`15w zX``LbusCZknsJ6T;{~?c3wB6l85Yx^#!TK= zwl|jTjiq^GdEQvc7e-cl?qtJ6%mAw;lBL^%>1XgvcsKXuR)}H@+S`VHVByMEc+BXt z9kTM%d6KHL@axZ$YF+>0`-YA=__|Rwj>51<>Md@K8F{T07~3Mx1*@Hf+m5jzyI{2n z5n(1TSf>jSVK6Va42%Qr*Q=ykMxSIh@7oyLRyKbP{wy*7VaSg#_S?J@e3_Ut`UZ!d z#de}$3~tSSQjw9_pNXY4xByctkUbYYXSQ{UN47PLhp8!|gL{$hGX_DBW%@)l%Td(n z#brKR6b1({?q}UC`kS(+SFow+7<9L0q}bIaE_W2tM@NzpePZ6Zo>+G5$QV&GB2-^r zZiLIdogVa2?ZfIkytzib-{%|=yu@&p7?`|!F0y+evBh(78$8UX^%2?>AsZ8JuP=qM zBaPYl4u4w|{Fkm|=obi&)Y|qtgeL%oDz%&@@tG;S<}?|ZnGmq61~ncDJHKoY{3l;?uP&3_JRVUV=~rnOtoV<-af|xm)~E7)V_X zrgkVjrUcE#0l5cZ`M}Z@$tnXuwfWJ1F#^URn7J-s7sx7qK@BT9+VLr?OaqfO|1xS1 z!|r^f5tCI!U%f_-7>7CIK!#Ih&NbhDY?rEP&FqhU3cY2a1BSw$LS31Q2U=(xA~oWi z4Q#eg4EoIGclM4o3K zyknA&nRg6BF&xccV`C3TM9m_oxwqib2{HBOxw9nQG*DDdW|{_xHj_1`<-8(}gbbe) z-F10hSX5I*u_Vo&#bQsm_$+yPcmcm4mYf|vh<|n@=@_2CXXTQFhx+m{xn#scZ*-S7 z2z5)X+MDF}hf??}ACtHdg9mr5;STQ_w$LMJWbsz!`>!5pb!!B~aTQ&;LF^-j#Q%=u z>Uc5S^sbH$M?!-?Los(ylG3x}@Q6OVZ-D-S3#t-Z1OLo8)dzI{$niQRimJeeLbx&b1o6 zEjH5^(6!>~sn$Zb;Racg`$CkDsh7};F1Bxu6T?XL$Q{SQO()~@=iP{!@z9|Orfd_v z09w7vV8(Ld96fD+Q43Sp4gQRPR$^Uwk1BA1Yi^MJBVQ7;ipY_XPmjf+Xx? z&JpT{h+r39xd#y#P?5SQM=vwIhA#OSL;{0n-!8`e**$vwF*0#f@1oa1aj!gu#3L2> z7}Q{<&k3Y6zSs&OOD$q_F;HC4yH}n^%&-I(HTGEDCRQ`6Gth*Y*~gM-!7=jLsJynZqn;x%iT-)kH5 ziB)Uhahf|Zg*jB$O&pQHj+x6IJCcNe6+lm6u!XDOv4U^v_lY@D#G%>8T*#aZ(8-TCcS}Oge@EIzAc#Yy0~5T zoX+Ec%$!DlzQCjcHj|$x=c>ySwlqcH>oV@oV^jqSI|96W7|e)~pBG1kT=*7?3H8lq zXZLy%VpVi|<^)hPwdawM*6E`Y5Hr&z9HNVFHx|d%GFJuj!Gu}&vo?S74cg4kJk0MZ zqDxpYc&YfnvBw3mX7&AM4U_%54h+Sra}QNdXlJyrc?I3s5k@%t9IYes=Ou*aqfFMO z@2;>m0qKneNv%^wzg z_HtMDm=na7uNb$Xi*o%Lw)iR$|1X}+nD@}tLr^ogw_>izk#rImnP;<@js*tKrdjZ8 z#=J*veJpgJYJoc*oQ5 z>J7TYYQzZ+7Ohmy#%&l@?+*CHXsD2sh@|H43sskPh)B{HWy+vK=wGc|-(r{2-U4pY zw>W}vpG23Bhb&+t47AXJJD`Z!VSSq37U0>rHFGQ5{7WburR|^~j6C8Ut>@lULMvEdzxX2xs2ve1-T{ zod{l5vo~{ESLSBx3T*ry(qSIwymnD2`4j?Q-@{RIbDI0;Sz28XimP8dYGv1)^i_6> zXvE5I!IfzOeM!iHgD*#47f>i?c7J%iRLpE&yoL~baL+t~_Q|TVLsGECRF4lC?3Vd` zc5Ape&s}eSYV{~`dTcc>KT94Rx2L-tiV>5?T$LocFpK}TfIM1Q9>WDg<=N@#Ub1~3 z%MMqwXw^yF*=Bt~t`+9<{slxmeo$;a^ax(+oM&@Va09-q7Cp2hwx!>8lc&c2=Yhhr zCXDCbc$jRQFe;j5v-wYjH#(B)KJT0cI{b5TdqTg-O-zqG404ypQ-TPavY*d&^0F@P zL)Ra0cwRv=V>{l(MrF`#4>&xRSdwC1^6@zZKDaBn<_`;L90Z0;n-oD#S%QN{-z#F= zIr7}3Xy*r@c)g#qnb>(v3M{TLnDER2G=sV8@!X~zhZe8DI~U8ueY`nOcnK1rb4bg3 zSTLn*kD89<#ca_AtRL@;!TMzsf%gD-7lqIdSV@V+)e`q_%^yf@5fhWjtG;{H@M?;XTxd088#6qbCA_L5mBsv-VVbtX0ivkmf*%D1_w0>JwJ+^ znY5Z&vy&%J==0pWI8J^185UjDW_SuPWrOGeM16}-{2x*`H=O)9d1~~T>n6_CBx7UX z-g^wZkJWaQ?WZxTmgUpRwIpUotH3dJhX$at*@Xf`=Lji*RNr4nRZ8SVyN;S$3NaBzs!q_ z54lGvLZ0i-fgRU#?BT@j*GZynR!AD;MR<7Oh@(#*CB&8&tc7g*Dq8Ulp|*sG;CmFy zJAyz@gI9yRA3lLR{@A19r(vUz(~tG$e=w1j$C86bY{8r~H^b56*2qcU`O28KZ;`7J z7nt$F#nvT@UA8q*v$w*`m#)n&q%+&8g2$JBv9fgVV2x$4@r#$RbK$2{1#m+R(yo0X_Clz>VG(HmfYO1Q{xfhT@uuB6}kH z_CyJ|!5fIN%d+5@oPlRm-mx2rC-#0fD==~=JVF69XEPf)Ru<>#&qi+8--nLXNP7!x z3}xF&^VQB1d;LGjp2v&%J4PZa|DF#slGgG*{BH&lxoA|fZvZ}mmKI)K9#+8WwiK?4 zR}1gF6&UEPN&U&nMWe-=u-lXKi?T(7NwmGcNKJ;@6CUXXBKraXZeRxDyAX~xtl-u{ zU>C75NtxS4`y%6TwBzzzn6{kuW;|*aaCT8P>AtH1toV2BebU&4L~{wwI4CSUn@u(D zLGiXd+yq?J;`QdSFjI)L=Wm{HE%A4xgtEi>?F-c!R>ah4lTMPJPnh_gMl$}1hax`0 z(!;xo5D(n}%&X^r-$r&maVp|_2(CBjI52Ng=r*!u$zt{1e`4%Ef#VSG_509KOv2?{ zbpjm>tbvQd!lZqG;$hWvtZcj|aU1f8_DP%YHo|*LSc99n3VBE8`@r4%Fd+09eBuz5 z({_ChwttVKsq>p2j%;_@J(b;g)A&Fc>@DX4R*I0#3cU}peTS++YT$66%QbItkv>mF z_ZsyEDhY6(Vec;f^mm7C#L2ASsRVXFTkzBn&5Ku&%+5M+P)F0`}pPNuwE8ci(-gn`p?y!7L@T`%(KT z+%hA_ND%rS1xa5ot6YQfY<|M`UDD|IOC)va*vPL2`EtlAM`H-Rxjq_1UR;`NngBIW zOkKNulY%!x*Qbea=Js^ptQ}iq<57Y6JG2pfK=DWa@_3Htbnwkaq3X2nh-Ya6zd4Td zUe+gxnY3&mgl8v7t0l^Uj*2Tzg#-g6Jo;g;QpoIO>1=dfS=P_V#+7Zfcwc$S<_EdH z;m&F8hZZ`4OW}Qj^g$@po%6c%17WcL+aniY`qO9&Q?S>!VrRk>e|GOBj8{ym#UVIY zU!MR=lXDIsC6LRdd|!2At?QM_Ao;-u0cI>yD&+z|A*3NgJncB*qmH3HA+W z93H`MG;wPYwj#Q=5+Az&=Qoh@75#Z|zPuud1$8Up`b`HXHsvA&*?>%d8Za1;1c(EK zZ6y5Dd0~vx?O`P^0aOAuZ6s5lo*mr&JWII!CFSBen2hY1mFyy5zqv<`8;{ml^5o%MEU}n14sgBUm$%-7o)%(yAcGnXS{ZT%iNkT7r(!pGvhrnTmunJgrx5ql?i{J52si(f z$AWQ{+`v_BCi@Ofbq;kbvrdM2J)!#^=6aM^>) zjGF-yOW4K=@myr_!9v{RjXw-Rs6fc>WZ0Gu3?dS0ZNp^-ibSSud7y1&AMOI`eaWq_ zvyapTGhTZZIN;+a-&AF2Sh@NfY99a^3Q6>wsm{3pBzh~WfThU1DH1G3Ae<>t3IVKt?25R@OoCljKF>? zNlUeXS;)gy&y08&{^7q@yyO}3&(#V1?axWW>O}PpOed-;r2SWS)^MY%h6NS>rG~aj z67SA-YAd1d7E7o?2&FVd2t%n{2*YTU5Ju5Z7N*f|LR3ygLYPGFxLEcS`kN3Arq_i~ zL9Ym*ntmySarCSZYUxQK%%pV)UB^rw=VBAxC(yF#yF!>pw+mrDeN_m}^m!p1PuB?H zM7mN4C)4FZIGrvQ!r8P`2(5IE5YDGlg>WIY2%(*h5yB-jR|uCO!N)}*t3s=vZ22S zsF8dSr!@WesEa9)TRi(6 zx=cU^GqhYl6%3s#plXIr7Emoi#|mgBLvsbxB$^IfFW}jXtPs#VhV}z0G&-NfB83Dq zL!|;bo}nTEoygEzSYw`jlNs79pwk)JR6!1`=`;EeD7XN|*FQ3`oiZ29zq}N@={5N% zFM25oy}#8*c}ActR_itM1&W0_DoFBkNzO;Stf6}UJRhsUO9|8a=ldvwyp$-tzu8BL z_EO^X{^Na=KrcnE_n+va{DJvELzDFWlYNx$y%eq9f1!_Zc9NHrsrR@0NJqRB6TaT! zqrBs#Wb6Hx`Y11ZDS3MT3Lm9fpe)YUYbphbg+AdVNo%drhSxgvc@H<)w00oB?lp33 z?TsX_K4zYr?##70l{J3~F203RHoTn@+OUj#vp0U$vuq1w*W;aEelg+lWjnaB)x^6x znihXzp})V0IMw2$-}zk^_NI^a2jSi~eJ;X2E5?(8@2Knn`jJ=2)P4Q>e1+uB+|9#f z?-k%%&hFoIQzUjYP(t7Qjl8k1uiWzqlO%l2`rdQz{a5jBgwBCU#rBrLThxOlpr~ps z)e9v?uw_-b3fbUEa|d9*79J*c6xPJCcY*FLs&)fqBo z>jFL`njG4i!mp1aKWdUso&m|A3PrYH_lI*VO-~vgzYBqP1~M;Hy_Kl_mBJQ zdDa!?_NM-@j;a;SS)RSw$U?ilK&Am`q)Nxvi0QXS}gbnJeJHI zcBBfHH}g&I_-AnN&l|fs@yABy5}P&w`MoZ&z?G0D)~4yKO>N-xwW$|3z8^7-q|A?g#uSSLBTKDpmAWd0AkU0^p|vA9aXx886y(%aoq*Wq7xCBRR*7or?S zlGtf1gUl42A+L}~Q485i`td^#?7mE*c)mJ#_pOcdMZ7GM%zj}VfAl+Y`-M{eTsJaz zQxl)LlZ<*X6`s6*ym&{%&ywt3{PJ-TujxUIue`%wpG$szW!8YHvzQpbY~S~RiQB!) z#Qgvm{yr>uz>9!y0X=rZlehfUkPXf_tugtl$9= z{IamOz}U+>t`P8U_-zB^DQ-Ufe>&a&#qL!n;Nb!!Gt64Sq~HzYVBUu*m#e2ZVc+BH zXC3hPO=M&_M-BHHQSbiTD;W2G6-43V3-98iQ_CSBXN41Q=Qmu~w_R}m;g-n`=ckHY zS48&XW?HitZN2|xaU7|CEk1ZRgw(eR53D3Vzm|{~fwG0S@+VmiuMN&#Qx4~ZuesAH zZ<3CGW;+wRGO|}J_kCfdCuM@~E7Od1+5FA_{zVblVVq=LO(x&77q8Xr`%weD4RA== zqwpeG6?@WRp{g>pr;O6_-*WSlo`8RfZDJgp^iQgk78{bOf$Gk;8eQQ{vRSH!re1l7P zr1Io6CWg@USPmyds*^hZi6r4|BY$ERnfmriqWR>`+Y9)^Gl}(IdE~u+Jx{`R9ab;J zy4}VO*IhnM;XY$I+@rWN*!(6sgWub5=is(-d3QK0qUfqO$+z#v@k`E-zur&fpE*nv zAI$3e0X9?ik`4|!_>d&FZgdSAQ|xAb$?!oPX8K7tvhRaoDap_)z7<^d7=#aMr~+!J z5I3c`+17t!FR>X4sd_RA-kqJW`H08k{fflC!^~swWD!jk5c?SVs*{xMmh+FlO4jX; z<}I(1ox6wgv!{|@clS>zK7^|M>diEnZKrUh>O1U@vY)zu8`0oPE22dXV%#%efZeOO zWUhi%4}D=dYu-S#sED4Of>LyjHaotv)lTcDkhObMeB7(#qdgDtjjxbydxr#Fw0dwg z+)jHFa34@1n>mZ*{=C#7@ubcYP%E#LfGw`Vxt% zTC#F~4AZ)=?|(n?^QXF|J#G#&yCz}<2G8DY`*#mf@K~2&7fiDbIM6@#BYz%93^AV- z_VVxMKvSKpCyW21k5xU{X{{}rjW!)`hI~e`GwfFr$*KROgctu4y+0Ita7SMM1SvU~opPxd_4+QwPYZb0rTEa_Fw)*j@vmCQ*@MIQ7n%rv zNEyRiYWH7?hZiyvYAjv!D;aZWAm6)*JatHK{9+G&yTbd0oNE)995d(SU3+hgH!dqK z%@_KM;>CC*EM=a)LTW+>1ZVh^`t^qw_Rar^d1{z{aT^=p`mOAfNglrM)PeH>zNA9% z?#u7Y8Po0=zuXo%7vAEy<$$$-R{{G0#{rFi7C^vlj!OV!0P+Dd0ZRZI0B-{h0!{&% z04)Fxhq#`AM1T@t0!#!f1epIq9FPnM1GKesPVOp>dglN~0eb)$cQ|egU@E`{SPWPL z*bdkaI1l(85CC^m1YjV*2$%y{0$2lh3Ge~nDBv@|Wx!8>R)F*_e#Z=;1dP6mW3mOv zY`{XmQ-GC#O@Oxn9{`R5J_9rX{se@fkplrHz@q>gpaSp`UpuXyT#~Zb2A>P=PQOVeJJtNf9nYn84@=@x27j`UQG{kVDu9qsE1P z4#z3tH_n;3ClQ`O_!PoD2r+crPJ~!;+_Sr1`Q&Ap+6<17W4e`7$=_jpRm%l{h>IeBSP!mP4VdwJP>xphYA?D-|-@HZ$MEb=LHFzKOhdC0dp=<{nKkMyQcLZ)ODq{$repTQkmEX81(% z=ywTzKTh&SADbq$K|Y&NWp9_ce zEV1VaOKDW;oU-x-!m{SLJK~}l^X$20<%L*V^GhC?X)Bp!=l=X})SM+`!nGQrq&;O- z{Kyjf_>u(+%`@!QB92_SHgd`{tcF7SY;PqTm+6;ZHe+`FyqV=Q%AXw0aW_TClM5v= z{>g=JX?yi$8fIaezlUsAqcUMbpZE-#yfCX$eA5#$0*Awe`{cgXc1 zQFPh8Nf}Y*D79m26c^4fDOpG&e~KsLe>&CwIbWCAxD|2d`Mi=D3k&Bxg>Ib_@Np%> z=i|3J$?)dBWNmX;tk`eVB42f7<+&IvM>(o5S%lFf+nR@vZ<=d^On6qo{!IOM$NaLG zU;j(!?zJtO`2LkI;O_1J8}MtT({{gm^JB5|)VH`(0~`a?0uBQ91NH!R0^R^@2CM~C z0+s?60_Fp(fZ2fQfXRS~fbjq`ARmwi$Of1ITEJjH5+Dx1_`|-%4<|~2hyiWin79_e zRX`))Jm3uA7+@FR4FJ9q$%%X#Yct{-0M7y{0ZRdPzl_g_FqODEwC{eieV%BpSlCe&Fu_8Q0NaB7b_KT< zVHCn02oVT>7*+fQ3I)}I&P=67gltD{LCDf^t5AVQo}3&Z{GA-U`xSu*&16AGWU3W0 zM1((YX(Db8Vio^|&YHW4ywVXV-UXCw=?D|ob|Pmwk)}?hr4!-MDuFq)6OsE6Ucr;8 zo(QK2aq~kWjv~D3Z3U;z5pgLfqBA}{SH$grq1PFgJc94TpkJNwg}7wc(eGY7>M6uA zZk_41tHF=5JL4(OA&w3q9x3#GEeH|}Tqnb(^}GM{j45zR{M1Odz(AXZ&m3+XuuDnJ z5Szo5;nInFNMKTMTKsyX4xr{{vfq*9MswlFJOWG$xP`DNOJP}#LAU_f*u+F)BzZy|2AUS_d3n=2Zv0{T8Fv!7S3jmHLi31 zSj;;Se{Uo^mWVhr@|AJ3F;274tp8!!oG9qQvqG9Mln)m0_W}KH!Nf1!>tJLM-D8>BGM`-6l?#+ES@hnO9r_)!Z*Q9@tej@$X z^Z;#~HeYMimTT8&w`k94f7Je>ZPnh;}SvO3l(LJQg(-r7u=*o0<-3i?# zT~LNS!Jw9Gd$FJ{IY6owIo@dk(C zMZ*z8f$=e8wedw`MAnI{&$2FNeZv-}9ES)5oWh}4rdX?ZS+Pa&f#RT|PVu$kN5x+X zNor#1kW@`-PU^#{lT$aQzLxq?>Z#OgsXwPiDV;}@A1N;?$Eu1|rK%@YFR4dp$~8+g z&uEToPHC=b{?PDgA!!L|{nFHFrnG{z$J1PC>(aKT?Ml0l)-63My-#{hx;=e@_DB8R z%uh3W8TuLgjWT1LakSBFoMfDCTwz>g+-Q8+$QtMUiSfZ`oGJAKG~q((-PAOva+Gq0 za)t7|vRxUjN>xo&xmC}rj^SI~msGLpA?kUUl9$!>>Oa(f;a2ow8ka8CR%)NszM_3g zTc?fH9nBc6e@4F!BX>?O&K#WiQs$A&&oVD$exLbk=G{z@p_d`nkZf3BC^sxMd}_!t z<`^F~jx`n;rx<5rB+HG?Cyf=xXN+r%&l_JgZa02lJYcLf9ygvberddFY%%^}^v?>) z3eAeh8l0uddMJxC;fMnL=TW4lnp4YC&!zs68mUZFPE=Zz>y_J-yObX)89y%s)04DIw41cAYroWftG%lIU3**Gt`+He=uEm?-5A|Q-AlUjx-WH2x*v2mbie65 zy6GA7GRiV;X9VcO^@;iv{Yd>7{iFKn`uX~D{Xg_8^sDvH>o@D)(7&zUr$4AassCL6 zrT%+dO~+(9O_>#$D>HXx?#n!wc`oy(%uvH>!#jo#4Zj+08%)Mr<7DFu<2+-Taj|i! z(FM_4XWV3b#rUT2UE_a@M~uge9~(b2p2ui?i}AW??3N|Vip+}3O3E6Lm70~7Wys3U z8k<#=H9e~$Yh~7}S#=QGGg;6Z+$o5JNs;4Jj8RNcR4A$xs})-ne<=P`#HPvxNgbQo zmikw!OgTh3TscztZ{;ZrYCn}hHBvQGWm7FwEmwV@I-)wS@>eISOVyjzAF0o(BQ^1w z{+ffDJDSk6iu85qpQJaYf0y2peka{eo34Eb%d|vWrhQtwUHi4Rr>-AH()oezuFjTG zozamIq>tAR(~s7V!_YmBA=|EhPrp}xSYHp(x}#6bRAr9LB$?l34m2z`49AH4XcT4j z%z8MBn+`(*y-8N!3rmWnSav6{@RCx8rWU6@p88zs?$qxgC4H5-%6#QwrBmrv9#wvV zH5aOiR>3hmQ}vkY3DsH%%70W>RKKWhszmC`YL7ZdGeomgb1SWP`hj%0uD?!`k)QEh zMlb!Q%rSxoRoL^^M$@(Gdde+ZOk)Rt(5k#f_mg=W0SH7n_ ztQ4uFst8qo6_e-Hs&I9z+OAolS*`h0b6FDx%`h#^mS#_@N?V&|*3Qt*!|>X*Pie1d zZ)hbtg>I>Cm2R`{i0+iG5#ma9t-AP(ei`TV<1!Crp1~3oISpZ0pK}Z=4a_t=gUTmC zhwZ}v{-p>^O-LP)Iw!T4@>%6?%DU{NV^<(Nq>Lu!>>I(H+>eK3< z)vf9_EHh3c)<`r`O{nHk&2;qHs+q4jr}X+MNZXlqE3KU=mvl+`lJw*{R*9J)-?sds^G5 z{Z9L{HU)ZpvaTuP$BdsddO&V&>gzKNhUtbo2J~bLTp9?jrrt`GC}Wg^mE)ANApxtD zFDZ9oWX~wSQ?@#l0jem~K-FEfNE58d)=btkYeuL2oEDt^S9-G6sr^~kknw{4g#H_S z?@VLnrOaT1#_*ouOH?q-s52&Koy__%i`xam6BPw39#>Q=-cvNF4yzwYTc36~?c21Y z+M#--K24vYH|ihK=R&-X=uhc?(EDX(WzNm~Ez>!{u*9(5u-ov3A;CD;*aK^~HjAs} zxXCDRsKQSvQ5GtnQof7!R;X60)~jAty{r0Jbw?#phpCUKBQ%3B&`!;=v`UO#VEWAT z=hDAU->yA?J?=-HCnH|}c;=GKEr#uee;M9495nRsm`b_tJ+jiYOQ)AUvFLcf{{oQsqvrqs delta 23856 zcmd_Sdt8*&_CNm2!*Ef-K?DTkCZeLE&Ycn@-}j#%wPvrq z_S*Ng*Is+={aAS>xUw#IW96KOpOBQPuFh3=!OMGoS1S=8`Hzp((L(4`XA9xS>ahs* z&;O#9B2-N(}2F=J4Bqc2e?1yxWr8Z`p1<2j6{D{|8FD5 z&3SrstSBx9@sW)c^0tF*C5>N;D%byA5jhr{vF&DIEHA@ir zv)&++_yqNCGbm^cHw9rQOTPPOVp*4zEnIv*#~tnsIvOj~YToxe|A0uZ|Ix(xVhS5g zoTqiCW6)@>y3QG2-R4l+3Xo#)#S|cEmp{RgU^~={^`+?$68mkd?u5!y(jFlh>i}*=+qsb7uF-4)@AdYDX!G4|NTaEyrzj;FwIM zKA+Fdm-w6=^r`+F$HJ{~q$PM@l+7Qti7`HQQ8BHEAp=52jXxscICtJHPaX~CxYj#X zcV4@$VP%keWjhLKXZeHu87+2^&v}a`V~P=aTIsn?pU=~(sMFn+JXL4AM4ky5GU0SM z$GJ{sdWxEZikj@)&?4${;{OiUHyquTAhhQgYd{HW!CTQn>reNuJIZ-Y-0kxgGYvtZ z^F6%|C6b<@1A9;KXA!u|qKPgvbxa~S=j-}7LJM^DOK*6C+imA!FWyYAA>1m;wTOOgiDE$Z}^eO7-%JI-3SPG}H7BpKta0^tEhhN!f4-IUW9-;mB#5 zF7S0!+<}PY&a$9fWr>+?o+ONy+mW8(QJKJJZ}XiqBXJ(Rg~@CXr!N=seSmBz^f!N^ zjeg}%+#)3I@h9H$CoZIi{fV_gqQ{>ovXw=fxQ5({^qEXO_+rec4E4mZ$}-I*B@mO6 z5}yOD^2J0WP1oQw_(!?qT@H(Ea?O@>ir!6`Y%Z}e9pQ_~U`14=H-TzK&Ny2mYAm70 z|M2--CnFiflbfDiyo=3U&?T=<6YD;fnWBMh^v06cn z^u=%>pTQhY#!Pt(=Fd&sdj-T9F_<6ShddWCykaVH6w~9vimtB1iY~U5gEX0rLm@T) zh?5))b)AfxkNN9s4>Qvr(0)OryQZ<&_Kr|zoY3}gR|Ah6jJ-EwKM-JdUYqaA;XJn; z@sfifEaAC80vXr4&jVFmg@!5W=DR~&r}z>&3UX0=`@F3MrT6#Qx#_E~l_!nnu;$Hl z$M3>8&3Eb2oP&|YWlSrUY^k%Q{=|C!I8y!PoD4@%u6iDgvP*0>a;$fnbgjTMS|}kL zjbTk4%v$svG?LJ>I3crFX#Xb?(nm6shZ5CG6n&JKC2x97Iq&Vma?E0heUsh$&$jz~ ze*JQksY#0+lP1Nu&vzMY(GC|?jRJULe z2)f%$2S5cw|M+Q4r;ufR28Q{^+}%cY_Sst;{WEL%zkkDSAPkCc|0PuC+s`U3u@xZI zVkxHI_Fx4`i|Js@!WsG+X8MdSLd=ckocyo#*U!gdrwF%6ThX8wQpk>|*odqYj%(mR z=jerGQXe&7{2$mI+<9SGYZ3I%WR@C-RPTq_q2_CK&QwYTBFkd$tjTLN+gSNDYJkuO z?@s8&NHpb-I5MJd+)x9`uZO0j3sH)--s8i9v3Q(eP?&wG2PN5KXStqZ*p48IQ7Ir-`VQ6IOk?HP!>B|+JU$EEKL`r5)k2pcv`~un zTj&e{&li4m0~sZKAQ>AipL|I@n&TYtHWt!5!%-OO=!q8kVi?Ivm7v)wQKij>AG#Bx z%!JoD)ly=6q5zcIVH|g84$_X!!;h8ta$|HZLlY}^_AEz#8^h?PK*`~DwqKw(jH;+B zt+%Jz%xwInN$7hR{b2x!jTsex7O5UpIeP3n=Q-~#ZLGfNu=!MtYBDP(Vd(U9j?;!Z ze$w4pV)SJ(4w?s&JJk23PsOq_lEA$)COxbQty;aZc_aBGCO&M75NX;3^GRBqdf^3sB z(@zt~mDuED8@N5KkX_7YoHnn+(U)Gv-phuRo=qVA`=#=E>BP`)a9V~M4G!_-i*>=v zdyM8Bv7Y=ePegf7*lz{psPBo9q`F^zL>h7j51*wCPESCc5ydnY>K&lsbyrmUrYL7qGr zMj)p319x6WvBh&!aj``At23I)`*q3nIV_XwnQU`&hFR!26{$*`qAW&_Jg1@i-9_!X zkDdMKesDE#5G#(p2Gqk{e*?I-C~RpTL1WS_v7~3xAbAnXcv4sINNnKFoWY{(W2Vnw zDy<;(Xy7hi#uBUx^Axpv&R1W=@-@Vgxk>RUZz|c+jKie#DHhuC8uld2nWxnoPJ?5~ zGfBz){sDFMp}$wImPjn&nxa-3a)*4HG?{-ggbYZQMofg33QWz7Xfi8#FyC$8!72S?17}m z`*xQ*2&kft2E!hM(ukwSF#|-Ksu2Ilkn+^L_>&RXsSb)qdy|-{3sgH>44Znk7-p}9zG@(?1NHolL1bil7N6XQJdmzU z+5rm#dejqi{Ax&Bu2fvoKwbqI@e7_2H7_{|M@9l(4PX)qm|X*DtnTKAnE+I@~RUs3b&P)}ad+Bk2Yn!F}+F-;sv za)*tQT6P7%m8gbro7 z;!?fI)paY96d%ra_hx*NGz#%QR!_S(!%S1glcvmAQ4zVFnXYJLZG9Z=v4_$uNUW6|k~$Q1 zo|R#`P6!kZHqkVSr3;(wfnI3aq!A-B9xvdynsSkyx6l)%{(kfbc>D^G zzSWED8ljAiME-i%twUV##}$N{JPKQ&TG;-o1GzMIvD)4 z2tVGDp1c-Mn5T!k=#qIdO=JRyK`Nu3yh~trt!(BPe>mgM#7{sGL2uB3Jutp>2HJeR z!i{Atn0~8UGBC`$G9sZHBhuM#Oe*_LN@TyPIQDCZ#_#;~F(x61Pzpg(q!0v$3&Ef; zAs8V>uzf?Y27xD!+m$JV;$2dN*cf){S-iTbqXG>JUe2Zz|LtU{yD|}L2u{Us4>4EQ z5S%Wg3Vs_jq53>_`JG|d+uhZdfcj##vRNnx6Gk>2eX=r}ZVQOE=FefY#cTxXGB5@X zvnrw-!zjfE{!Gb?4*)F!Y zRV``^ z=YNpy76;R1r;?0SC?#uxyH(Fnp!?P+R)|7dFjaKgR1%^Zo_`Cth1z};)E<^%FW0G_ zt3T%8R`8CthuOF6F_6@J1m%P2Ch6+I6@Rj=1TKZDEq)>n0Loem&0?mhRgejfxVFs%O&e~u&?g0Q zzIT(S9p!uPw`(Yc;jst`lg^zNmn`qAg^jt4o|RS-40Yuf#4;4j9rr!=g@b;sujEvB)o zZLXJ^&}z-! zUulELuq6!siuU~Cdt}(R<>39 zI}F{8WNoU~7E1VgIPP5tFy|Q?Mx*Z`$=M_MmoJk^+4It7LrW;?AgLcJzEJplS8gc9SGsdU7p>&T^C!Gc{za_Br~xR*6N9h!WqICG@=}GFz9| zYX?|_z1)10yr~ybHrXNeG@!lddD6cv^9G?(b8b z?%O4A@MUx{)G>xrv+8%If}h#tv1Xj}{hZ{vocNI^!QhGzO1r)c-9XQ3nMU~rPAOYD zw3OeEf+20lpQ$0uIcm{q(%)1j$|b8!sS}nNFwL#-Z?rkGQ7Nm%r#jQ!5?>?aDh|$W z+K#mX$7f6P(Q+!3+1;kl<(Tww~8BgO_={L-(+L=V< z!vn@F60g9RpXrZX_Q#a|*k}Hj-XA;ekD2_jeg0UkKlYM8R^X34eZk0T&!1_~UP)(hnLXbUg8K;p*?vHoS~m=mD~ zRpOkjsGE&rq>5cI+2&wuOMK^SQ(3s{Bpb4GwgMp{%;Y(nNr(u8dCp~E9B}c}k!QvX z7|iB<7h~JW=C2``B_0_A`4Pr`mw$o}k)|;NBP!1Md_EOp@Tm5X$g%n%Oe$?Fb1}67 z+4q&NaaWgk#U^g;poZERXWVKx>WbAH9vjE&UQFEPTo*Fn_*s$S_& z9TGfI&M=RG#e82eceB{y`)U`wShI6uH80}ujKvM%zRQj@cF1uC+v8x@;BtkTCa~?f zUm!dozrw2g;4FDPH-q1OmVA|)9Fp1!w_7S1ke3pAD1+e{z=w(UkixvZ@u|q<*Sb5= zAk zB&iAo)gDBLGXlmT!i5C`J5o}012wGf?7*+2N)0Ak<|Wh~jg9=+c}!Lb-P26&88@n; z<05VWEVR5iU}!kP6?JCzM^kaCvCsvXu)k54e%UY!ory?|IByG^?bE|QwFiCvyX_VV z82)v!nbu-I6O0Jw`?eMkkFv_(lo%+`!_m5zeEY>%r=Ur?XoH=bY>}z#?h`pm==wZX zM!0uYG5fo|0^9>0p;5lfyQKO_FGtE{A^nqoU8{3A=m!(kN|H8`NreOW=0@^xp^9yedkXEDEf@f1W?8^flSj?a8%+UH7MpSrqmNC*EhpEP z7>n}wccVyk(VbpPJ`~y;ZJYB8@l49%BS(>wld@9-?d{{qw;B8`#`WkYXt8^it=MBY zO_J|#i%(f%j3 zFooR^%m`>D)|KC`ftylwniQCy6|;)SJ?0f;_T;ho%RYi695@0-+AAMZYW1vn2N76? z{j_n;zGgb@F2icb5VnE?wT#$vs$VKcij4Nyb7sO&9R&sRaNdAH8SJoB4+gAbjC zqqof@PIW}v`QqZqRAnaG(loxkgp`)bB351Lo{a%l$hJ~V+|=nP&l?OA+8yFs7Ux?A zfBU>pC?#*{U_&+#!L2EUj_~81j`R`>9e@bVnU)$oj>xd4`ylRWO0gbq3JD6e&KBB1 zCe3=dV$L_{Nh(M45C%pABe4=kOLScK>tkU$RTTCPWq7uBx zw+oR=;?C`zfi>x#+B?%D3Hr2cw79@i?|5|Gcp{nO=5IBUXXm`r>z1Gfojq|KM67dj z_rSV$KYfb{9H#7_-Mp;J2hjEEi_61wNy2<3&~*W}#ocT)3aIxBPd%ne zm?kn(8cRN%*E?ZsfHyajuC8|F|=05B1~p6%W~QWgTxeBN+y-XmsWt{_pA;C<~ijp5H9Uvwa)M*eJq%0 z<`lLM^>677SXKUc%wV&N8+vxZ_a1nc_NFRUQkvBr=DF#8+a5a|{u%O7+2Ed!L1y9p zxvrT`{wOmW1U=wtDYVq&y@T`cS~lV)d+IC;9h-!vTk$mMxHF6mqlCxSw~>P&?Gi3J zApK?0rwz^O z5M;_>@Z84o@HAlXu{45|!ou|AwR_n0VP3~NZf(9;@K)61hogjlh94-I7+pYV^glg9nEE3_R>XN4#x9pP~AoFFu{(R})x4 za#>l1{=zyJ9B(i-uBM|Z+tT>j>n3PX2^$yB{*&N)u&#&XK$WzSj9xI1zp-@R z`~~_Te#->1d*Nojv4ChEs^(uzBgY<^$A2=83|h2Byf6w)e}B;^QTe`~7De*>=KOuW z@^?gh@mR8d$?JTNy=30fc|%ve!tAV?@m%$TFw_>9xPyQwJKT=|JD?Wu3ew2X>Czsb z+`#1E=GsW^n?C2Ed5D?mhywKd_IYdnI@VZruMll(V)J4-h2tLc$GKNt!f`6-W8}pP zi2rcOxiB$;d#pxWtJOGWd9Y!@=VpP=?Y?8+w<^9E=XcmnM&jKw4l-Yft)ohmcZn{VM8Xdo)HpfqFp>a6EaE z7#;nR8tzi;K(B8AJFec?MecX6k|mD&dygE)6ay}TorzR;l6>zdh`3qbUCfqxqH!ii zoVrU{P*3i69ugnH=1)?VrSP~YGc6k&u>`|z^?KpQ@TlU*(q-}lIXJN2Slvm&rPW1e zFk1v=Ecw{7c#AKLt$ue97RhK!iJ5+K0CJ8u19i^vu6l8eauwbgan28XD&Z>ZiRM>*sqYYA)t4! z|I2mgc__B56F^AosOVu#Wi3gd2Ur5=+Ykn}JtNTnTJc3_2bm!4&yTMo))x~a>%in+ z;xDoG*OQ%(#PP>=llLCEC-o*|1m|Elq-@_kiu1Z~o6&Vlu+Z1{4O>1z)Q_DXa1SP8 z`;Us||^V6)psuyH4WEj*#7t zTKP?5iSNGy`WwOYz#IOuR?)#e_q`cAiv| zWsgk|FA-t%Pd=6_3L`yM4iQBX*~;X5zQ-!W6@3S8;)YqUXSYME-YN$66?ziR+$o_i zKs0dohxeR(F~^Ie|ZmlWW*{H-#VHsUNt6mJT_E!oU1pkPl5T3y~YEi zVbz(~2cRYWNfUtilWy!MuU0HmF2${a>ti@!b@k2x^ppL9c5o-tT44V7dh{irct|t{ zI|nXbJcbNXTxqXhwpzd(5v-BUuJ>G7V7Jm!y^dJyTe8FtK<8I$}zJco<^Lrj{gztiGB)t*S0#D z*>G!DkC^-Um4HaW)gMo@kbSj=?X(WFPfh>%3pO@iC;D4<9!k0wV!`Zox|ev&ZX zweoy|v#+P&nJFygN1dQF;3_yFoO0B3$(4PvkM|Ib*p1oWYX@uxppDQwryyF@?_(?pUu+q@C1M`FjLf2msX{+prR^^1&68ziKdfps!}R4 zu-Y)a%B~sW-om(q;N2L8?e}0$cnzCNoKtIZMKCKnQNbG{p=z%0guR8y`t&Z7f5P43 z-ms#tPs4FiaQ@LB-o(}kd#8Y{lQXpedxt%wh{G2EeerCh0dF+tA;B+uVYOsK^&GyY zmfWmPi(<9kt$M;JsJ=mKW(){iezCxRIW&!pyKSupI}8*{VGjA{n!)^m4dmz=MemKE z25!ihYV)mG#&7hHN1hlxipR7=@rT)CshG)BTW~70Ht*>t@a<4Gyz~*iy z*Pc)){b!lJB^K8;iR-FF*EwspGx+*F8jic&0G-7-qmN(bUEc+{eh*tR^w*bs=}(!T zB$L+0CeN!u>zk$55t{~c9Ne2kx zjc6JmVA?A$%}~dHU;<#O>Ku(e1m1E-A*t z4^LjWr34Sp=;M$|S6K_*K4`E_;K3VpuC(c4|NCOzf#zTj5hYcTSPCA4aBU(*QZd{6 zBvpT4PH?9IE;Fu9Qdz<-R*3H_77rKVdVhQ(2(7r(Dc)u3V%Svx3?dR~JI@k?OuKSH z+sS@BMb!VCR(ISnP8-2^9XTi#*Sh4!`fL>|SC>Z}LqS6!X}(5xUJH=;ovZ?uBJrn$ z`J636qEDqEr8VinH`n6KL2iub7oM}HYh`@@3VF3Apa1Cvyui9pR5q3R^c|#e109D;)pXPRw31U`h1dusOCL&H{gb^?82{ zd2fS;x%z(FVCPFulDQjW_?Op{3Zaco6T*eGNC?Ymo)9{yK?s*ql@LBg zM ztAKVelnN-j+n|>PRLsyX1T>7H4M2r9hqKtbLIP7n^o{BYR$w&4cM0S;hHe$mM26M~ zXevV=7tnNuJ|dtQ3|%OonGBsPpi+if1XRh;i2|x&s7XNe3{?rJNi+xeFaghH8C{N zf(rwb1V1HC7iJxer9XotFf_%Iykr{W_ccrsHvirXOaFNv3H#B3=`@Z{prl zBHois`o8fx|D2PYc;o(&Q4a?^WZ&*Iao@aP;v#pLxP^d2fRlippzB}6hivSROnP%% zg{wCV*C?R&azu{WCMsZ=_-a?O~=Z$Yb?> z_WyKT_>=i^r{Pu^x5?2q8#6wek%Jv)N-w!fD_~pT&0r^7RGSz%m7~kBKNnf3Vl8=mM|#CI>}?Gk?gKdbGf;FNCeiX>?uCsv{a#Fl= zV4r?noc_((e~B}24XA!k+Jj&W2mpJ;Ihqr`Jf-=ckUwj4E7oD(@^_!TG5L#_M$yIH zNi+(m_nZGd%Sn#nFz0GA1sNi}1C1q?ju~yLF(;~%(+Tf`q zX`hjQc>yWi_blGrweNd~-)b4UYEew<0eKXycpcZ7|1_AR#G@`e@LfAa^{YHK?d zIs1Mn6@}L;E~0$oehXVTd2>k2gLfScjCTikaYT%>oo3B>1`QRy!@!-%C3`RGV*5Tk zoWf<{Tr>wXna~XO4;`F$`Am`;9mpQ#`>fdNHc8dHXfqx>d&HoSQ5nf%$||0m5r^wL zdq#Q|Yg}7Cbaa1sM_KKzQzoy=v+}&h*@R}k$u{|<5iv~4{u9W^@4Xgj{Zxa;Z0})h6^uF z@%g84*$j6zyYl>;OgkXsHyk2s58OZS)(KRJ7o>1t<7yzx-h+MspQF{o{Pr=!JI(ZJ zPtyC~sElj>VB;k0iR*x}!K%by72~-JBvbc|qs(q7rVo~qvV*zFyWjQs{NF_#h2s=& zUP|al0dY*Cv;RRF4yGpUJC0g*F<(AB>lfTot#B>m>}wa(t;dP@&}e?!Y%=c9kc_$T zt6GEV&D4e*%mJb?ifDdIGOwIh@QVJhl!5F3A4!7ca!~P>@gg)5vhTXbU#>1)*ej`e+d+O8vA^G{8IAv(IQdg=3_}P zgOZP>@;_}Oreh<*U4~jnXeVya%6Rg@`)T6~g!SwAZa((4fcquz?&{yq!dmKncNI_9 zEMfHth7I0b9m3ZT+;syqrttD=!4mS~vD}Q8?Py!zebuu9-u=F6p;r(TC*D`Zc}efO zQGDMYNlu+SfvMZSzORZYW(MYD+Vm~))D7deT_*?YbQ4cte-C^b$XnRD!4TjrTngp} zH>sPkllvX+?0J5;-=AzMXBUbPny&Aqg);?C71HD712cbQE?i)ZO-~iwVXpMj-KntM#Hdn#*gvTKfAP3|ErUM*+ z&48ByM*-&moq*oIb6f&I4j2QN1egi10~~<$fbD>{0UrU*0h$4=fIk2s@P)iMu=wp66l{_vsNhpQHX^>gK8Z2X^4+QR+Nr`N9SF&vh(VyeM`4+yx8E=7Ebt+G3~U ze@;YN*^(vyLmJUG&Di%&)7qc`%;1e|#YZ71YD#f#amv}>_O80A&#Qj$ck9({*5e{l z+B~*rr4Aj$E9#A&O#@;{U2_~iG?83rPUa;kB;kh?eu#;@*PIme?J$4%(+Gb!XOs{Q zc~NR&P33SJWj*7V2em66EXQ~P@JFs(ix*L{^M{nsFLV5q&#uOVj50w(n^<+BiDSCR z@x8woYw9lW+p*-+s|k`Vd3Q-W@=WAdb39bu+^hXVz2lKGUT6(peGf^X$w4K>LNxTE z#a|{W4;A0vjq|TRz}R|ka0(=j{mpQaZ>}YTzWk^_V$J1yx)>M#^*R=WM(*uS32NHs zuP*;Ex%Y?U-n}5XU4P@=W91Cn`@V@QxYb4ExN;`^jSxAglCHm6(9EA>)c^mkbY}j4 zsdR|_$3=bXMB~aFW1UNulr3_Ymn^=&Z0S<+^N;=dKLGlovL$mJWn&jFTDo{)*;vPt zg?Y=s#gQa$4LRe@m*|5E7tftnxZu7ebC;|bjrV9R@qH+l8(6Vr1#=h8TUbUGw)pA)n9y>a^^amC&%xIP5z2J8TA2W$mE7jo+XRe;9;<$!sBnE*4O z5KsWf1(*POfCiuhNCBCE3_v;{6%Ypq2Z#Y3-}w1&ePgn7Er>J&&I1|&Cjo~5?*M86 zy8#;kRRDZP&4~ib^)bX9fQ5j0fSG`)fI@&CkO@cxgaK|{MjhngKZg{r1y%`I4k!oA z0TcpE03~1#AOnyH2nV!Z!a)yk7ElK`1gHgU2RHz8E}6)Nwo;<$Ebk}%7U@4=7_Omw ze8bSxYc!|)-h{C}PU?K7V3sZ??{`joDpHg=vJe-H|0k#j{3&}sWfUbRX<#d{?vDg? z4FemEdAK8;y8k870#UypVRy;Eo(caXSB{Wvq-&oZ!HfFM-GM0Eu@50+n-KJ0B}Nqg z5(`&}H|eac&oYW9PfD3JR?2ud5O^|LvfMjS+DaJ!$qQaILsM$pF189+xlT z_Q3M!iq}oTmrv+nS3Cn3D0>FojW@19Jo0XQ`8rVwhkwtiJ44fxC;+YLDxhG)!7*ad zq@sgcr;2Q%irn#&#+gUwvS9l30P=q^ULn-{f3d>9)tB$@`v2PoJbi1L=-vvIa)Q#L zT&#Rdxmo$9@|5zjl2Zk%hN$!^t7@65T18ZEs@_$dQ(aSas>JHv>IC&r^+>fzJxN`x zenov)eO+CgH7lzk>$$ADta!~3%_L2QX02v}X1C^;=1Waa?MSUr>(U<3c4#HpY1xYG zsoBf3pU=+JP0-nN%XPn1=w8vku0NoEUw=hE)iBer*zl;K!m!D(&9K98#Bj=R$#Bge zGKL$Yjp@c=MxD`NTxHyC{Fm_q;~C>^(4Bw_PW-cJz4*#ewCrq5Mu0S9Eh@>GU85@{Tq#8kY&B}9qHFnDs7ei zDeWPPk@c62kf~%Q*%Pw$vVY31$*l6(@-q2@@`vS*$XCg$6k+kz%UiUWG&9QfyRgSL{{nQ=CwI%KqU2 zMV|^~ic+aGD(5MmR=$i0_)^KM`lvotb6F`_#;l!LC$p|*-OL)I$FJw zACNATJ}g}=t(6{-9+d{mddhNT<7H;qG}%nqT-jn-qwH(h71;ywWf+mo@~!fN@}u&P z;}yjUr(&I=R?(_xQ>0cX2P-p`W0dzQ zE0upJlOTArRS&3YRR>gORG+K9R$WnDRkf&oRsF6Ksl(I}>KJvhdYF2YTB*)f8`Zh$ z@#=fjQ`PsYSEwu0PpH?cx2T^{?^M66eqDV;eO%q3ZdA9b+tj_YWLcUlQ&w%({;Z=} zpJcUW{g(AdRv%57royiAXf|s0Yu?iw*VwcVX)CnPY2VTw)DF$oXHUw0D*JT|>lYZ< zrtBNpX}VFmT%8lc`;9JKuhNg!KcTPDKdsL+EHG3WT8*L{T~0yHl$<#^3v!m`ypr>F z&XJsd=UmD8B?r39EbI?lEJXBi=~EcXG}(i)3l*~8WsBsG%4_5=$Pdd;VDP@hpv6LX z1}R1=6pAs51&YmzU5bN>AmtS0v&tLFw=gCp>W9^jtKU-}*ZiniqixE*mi-$V^rHSt z{dCM~T+W%Ci#gmJ>=3ATigdPADKpBxktNC}VWJupTIFnInR0{jtn#9=qE(rt8m(HW zs#3kEI;Cn;g{jqQt9rJ22Zrzy^)+>T*66HzHF?@n?P~2h{ilW=IfXgPbDm{AD(8gL zo=bK^@eAhi4@IYfSB5BiDvv9hl|L(^RCDo<^6bpomzAcOty!dbOLIhXO7oTGJ58r1 zTWiz4qJObgOi)^fT!tVd=I@#erozN47xbl6WZ^zE!v>$3@oqq z?8kK9>VDFd=_~YW^@sI64SK^=!wkdy2Ag4_q1^C{;h5pFq1iwUErwRZEknDZ!@wCQ z7|q71#_7hH#uLU*jMVtE@s_dO*kMe{8HesvqC0DI)>q_g#NykUvpwf(PD@T}&aIqw zHnbaIA|S9y7fGXKS+X&*0@-v~sceyKnd~vy8bKv(m%S`|Q+8N(OmzEE-OS(>fbB(sYa;HP|#U3Y|Dw=g|x-fl$ zell7Ym7_sJ-pRR;!|i}u01fy>eqHgX>V4I9RZsO#S=Q{*?77)x*$c8C%6>T8nf-Hi zM|O-(phz7AjAY&yuf{CnyS`1%FXklq-}( z`Hu3OGNnRgQ$?whuvSN9P1D#kD>Tn*zSgv8#M*T2Bia|VhqPz4qU@2`+Uy5V;i~MT z*^SxZIvI4_eBD;v4lKkk^k3<})%P+CH_SCWXt-lYGg^%EjTt#3bFy>B=2&u`%GsGy zi-m~R)WMcQ@BmcVmr`CfME0A^atEz5$}Mt}Vw|F0@sVN>me~&F0##+!^H39iW+iHr zTAj8$ds+5BvR7ws&OVoo5*qylEtHkZ9J1w@lC_wUW*L>;!ib1<;ku_kDix(yfU}7c z{yD?FXad)Ya~?zs9z_&vY({r~T$+dAL1*4}&VY3;T5 zJ{Jqt_!PY9Q#@EGt|7zoPmJ4t>)X9bRr6ah>K%`_fGbA5>(N)In>{vzUYz`{$CEnU z?D2t4-|^U@%QtzHfWF;pllnPm;N%jIjXJ$uCHi)+p*jtmT&DB0XHCnavJ~UfL&+Mc zDAUV4l>@tGPi3akq{J$|s(+-iLMTcszW9`+%7J2LubOVEl0~>cRl+8M&Q+C0Ut;j5 zPF0+qic%h;Did8X5y7FVl4j&!D3kzrxMIQs6Bo`{v=F=zPk|GFhZQnGjp}#7g-23a z4Z5;*N=0$vzr^Xe3v(gL?27+6Q4c@R2>FB>-cPp!_UJ4JXseHtlFnZ+e;RnY-35?O z0!Wbu)Np??S*Zid3c9l5lIkP0k|#yLYRh2t4QoZZAv70$`mp5NUBiEOIHnZpZ8G8tg5oTLMYp;LMav* ztb41|O?r)xm#$LXjf%2e&m-6AuJZ`e^FT{ydn<~~8|h-JE%J+?n~ai*+muvXy853b zA-5*6K`*J;(YmD7*GnpP{Fjn`N4i*HkxOm!#U1jD?RNZsRB*OB{Z9E(a9(CRSBtOW zhB-|!h2343V0ztf#TBX)9D3SMSre@&^Ynr<+PUgNUkm@BrA4drb-IV48Uo)x+AC`a zkMogZL!v?&08aoevlkqSK^Ao$A!WlO`&dI=R>B&=W$}^9ntCeO zBe?8eC_pc;x}Ee2O;t~Kmg%A4eK-D>jJ=TTA}Y6Gs;3Kfo~_ef3!jSQ7r-k#AWs7xLHe}SbhwAn!E|T3SFCPUym~p+pOr>CTOTO6Dn6GT2 zE>knSTzW>cGTb!iVm5fWypWkEzNmDz1z!|Sg=SwbbY6x&olF@OUXQ6_7EaSf&vQnG zTj>C6P!reHrJt0Z_sVFNyMe`~#on02pf(!cK3@V#|ZZA-p`!DxV){qmR^g(EaIuBdf zWnX2Dyz)$>oE7YwPgOhyr4tyA7okXn`~ZBMh9|HS_z3Wiz`H$_t&~{-4BoBUPQMvA z;c|hWGVwL=iT9cseELc7>U^m}1}`7H>46h3JHgW%Akyi!3u7Dr=NDVSXr_X0Fm>MF z;N>un<~kX=4Tjtb>&eKicpi`E-D(&LoqV|-2IvKh(FfWgvyddTC|qo)`LESl?nHDROZDwoR>>Hl!-kQXXV1jowCT^_N;eD#dWXnK79f!sH3XK zv+(}Kb_}c_@Ta1wAA!!osfvrn$!nQb@k>Tt!F&$l_$UKAueNCDvf>~SXryoNbXQFp;Xa9}>k(Lx-GDhABMP$R;PBWHR@X~V z&kJ-`l8Dqyv3EOLvR)-`r+ZeQQb`@D7gud{J&!bvZz!(l$CXWWZ^(p%@O)iW@B)0F zvog9}==?&~Glr(7+21rJsde{V;{_?h+cg`-(wM3;dDY&o89Fa0 zzw9HEnd{@qA^Tv&#lv2k&W~2yRuPumc%M>9HaFg>Y|;z7+v$dTJOuZ6h}>fwzNT-k z_Xwq_sW&wun^awYK&#Q8s;?ypdfI}5?32TVD&OlIk}rH+Cx)x81|xlT9PFqcgf9Qi zxp)YMh*fuL!4%mPJK8zj`Z zbng%ce^jR^sipU1xQX{(MErp2_O4}uVhdZ@6P=VbjWh%^{3!&O*8m=cDZgH6(O$%y zDp8$_s}K|l3^#8d=^q*Do!bGeV=MdqicE|QnfV`YEYK}2sd-R5kKRURx^kU|HQ@qe zIVd|X(YYuOIyumxjLsPRlzdfLyub$m0n+IMQa2<(pUAsa<*aTD=EH|qWLac%FVRtt zpvqyInQ{$MZ^u`!LQJ5mfvYv3le`q!Wk7YHs}AX3K?*9{tVmUx^2zqrcJK6-*-T<{ja{Wr^r-M6*g@F{ zVRO;!KrPOaePgf4+0hw6wIbK1+uI*{rO>nXksn8Q1wSU3^b?>zkMz4;k(Z(q@<(uq zX7lF3B7_aKG4;W&=;xt|ehflZ?O-uAJ9SC_|1Hgi5Lfh5MjFpHX%gC`sUMDb$XAiC z+5PUU6@{VK`-^P52!Gg&@C)^<6&Yc!Xb+=~e}PXtg?p(Uef}7Hv0_nDsh5?JJ z<*qJa$(t~IVlvvhs9lsoKiA{PItNA6MHgfb!+0RRfWIO=dyJp!jtJ=)7bWJ&u5k`g zD96Wzh#7K5Ty*{|s5TbVH9=UQ1ChxIkDvq!!f7pQY-uT1ux+0X$4JdG7kX3|tA~;@ z5%WF`X`z>G$M++&Fj^a9NwJac4AyN#v{^dbIRN!fbwHnVt}fkEdXY8)6ZUk`qwzXq zFcb-h4j~Gq{;b?3QpR_U75n9wuFrP;ih2YVtnx((#4?uJR~3C4Rg(DmTUdCQ_uU+b!NdK!r-5EPwCTKQIBv zf+8s3wj+bgD4FcIQ;lgSUvPx0qMdxl5vA5+kLrk3u~q%cvC0?QK<}%^YwRNWh%D|N zre0~5W!-NIthc$$*qI!MQf-r73By#O$eR+nid}MEf=w-KC!bDu#789Rz2?Zp{;tR4 zYP%@8qKCsf(M3}~wJ=de_ly$DWO~np)jdN@cJ&Q*Z?*f#iidhGQPmCYjhY5&ssnx(M#n7=9$~nCg z)PM`}rQY$@_Q$jzLH^h~|`Dm`BPaHN#WhnKDq_;3>6~Icl}1yrnKgMy3w;FT>EN zQS}j6nPHK0QbWRT!%9L$cfeF=Tij4Nlv z*ex?+lr`F14>4H1y^FTRLu6YX07upahiMTOk>sF;2&wjT)m%GXLu)w2DBEL&i#B1o zdTbq3mPL6iw1|{|U(wkPEJIdBseBysRNHA0b{pl09pItezKS~x^Dq=&?GNN`DWsJ4 zb|TJ#hA-E0JVlt-J1B8huBVpoDMGa;+KIq0l3A-qR_3eL`=?^`<~`w*IEyLQN-1SD zdReP&Cz8DMPRmd=FHaE@u%eYIi}9?bdH&C03iV=Q!Yn5HupCR!En3( zbqr(g$DGnCw0k^7h%8U{)Dpdgf5Z;XV0WtwCJAHo$&$B%<<*CLz0PCC=QZ3Se|tOX z-i8j93ifB;!MQert^DofrdirT&i3!o?oy#_&qHG&?l_bO-5kiigv`{t$a;B*tdK4c z#@iZ^Pf(%aqLV#2y)@42L$oL|lP{FskxxP^2_JJF_VLABj`4Y!JZ4+hF{+EQCL>m# z+vUL+n>4l-!jMZyUvp`+J7;!Y^HAu}^DI1_e1^Ih0 z^7th$Hx7k{lwQ0u1Dm`(*H4Ggk>ytIWTi@Rkw+(Art=Gp&NuneHYmda$Zm#gcLxPKyWj-oi4P8XRvwjGQi^PV-;_Y3>CzOPNo$4<3?Yp&pkDhd9)$UF7;9v0j9g zt6p;V8+}6V>S`Pd2K|)b4#M%E(dg3i&3+w7%^Ta;)1Y}*N6VYu>}oyL+@hgt6j{5% zmhv?UCM91e{Rvunb+mhSuoC!yuzqf}!aoV0o4kA0yyOtRpO;?sau@Xa{3Th?B}~>1 zu?382Rhc@n^uiE(*R$B{A%;cQATULBZbD0&)oFqZ^FE3j z#qwbKJK}_VeCREK&m$y6TV@9}EZ}7Xj%LRsQ>mMsX#vlG znQ1Znsa-e4Srag!mF6iFEx*i2Q#=19R}GH}9?(iw3mMJ3p|W~-kQ_Jc6Lm_YTt6aS zJ#t2_ea9w%C!$pQ9tM;&pmiR9o!)I%-OH{G{}_??Gf+Eo9Fh3 zdK0eCisQ-XXOwvxuxOV6+pzY=qL5eH%VYDRDnDcKD=D3>n#RH{Tm+23fW;!^JA+t z^Uq1OD%Sfv@h&N?x!RJd z^IGi>XroE`Ye*kMN6YCYZ1T&h082iKmvvS4d(AC}k)7A|>>6RY(ou06St9PxH*NX> zYPk}uxa}~j^<|N+AER8~#pyUhk;mtE53_dE@7cC5M4@K;`%?Sc7i6`M`m04N!7^Nh z;eLmFd_m{%_aVx`wsZp4(?=j7ABscOY)eP^{(=N`?Sy_dpk-tW!Thj>*dD_Lt-!Dq}#OMxw9=A#RCtZSB#a*R+d;VFD;xo z;x~j1IIvFm8~(HwNiy3R%gk4JRxtEOBS|CLbGK?ejXf%ESd_*4NspJKyOFglc{oii ztJmhV7a^8o@RnLpdl89y?d@+tvxqkWugjQ6y2Wfpc`!bOPOeQ;&La<6L@Bx`ma`t| z=HCEsLcNJ2CD)94EK}*?UitGQH>tZi$b?68Ba3MX$V01vIhm0?xS)Jso%9YQ{7u9 zH!gnNzUNqr<^|IlJi_TLBztWgOK0i7 zG`rnIsNX7QEUmD`ULI`N6FI-T^y-93txKF&(>904N`Shu`9OYW56W(3{%ZBF=!&R< zbfLZ$E$=D(+`kq>k!CQh^KL)cZ&~_;=dCv?8i#5fM(bjj+h$IfLZKVc;=Z_0hBe#r)GGbNNUB19x-2#De&lNoDJpKSpY&heH^W=eHzn3~ z%B`o6I@4RJj6!LAfQcX#$JiKp@3PcB>DBL=AmQG5Duj%%Ss zJkpeY^1$+5mg1n8cCux8M(`h~O9-6kBOc1O4A??f_#@?QPj(r63=$_!PiVZ*et8Ra zmSpWzvf!zJ zC_SThkx|)=j3POs&VF*sQ}?Lf`AYv4>FTGxa{P+;VZUQ`T~KY$BKQc+!)kH?v$+&T z;@r8cf#y7_SlZIEofhz8z+~A^pzv>p==pnJdF|;$%lTh0?yH^(m+I4_)FNLw_UW++ z4?|54DRB-(r^R%=Q}QR=BwiW#7A}&KAHnWT^OYYz9UfoYrnKj{w3V$&ds;6oWCKb& zKLP%ekDjR3)~)iTqFCF5ZE~3fthbz}uJkS`1>W99X@ajjP!w+`4GaieZ3LBliKQ-{OaXzXh&YCbz5{A9xkchQ=*sGeyId(dfiy&#CW>MoeyoN%qukRQ*k)$>B1{YnCV9L$c~or zVo~4T^$e&zx4r8*G@QjdR#&AqYa>$uRs*k&itc_BIwmxQp7bgPYUgLot} z#?8n2jREB4VnZkWT_CdCvB68e_k6^(av{Q9iK!qgKkqRYQFB{`eBOs8T+%Dq2*^wX5Qzm$tj%Zv#&o z>pgiFN@(>SD}P+o$EiQZI9v*MH0F}NWy@`qw)vEi){J*1|N5d*` zN3?smGJrC(6?VhLi>(aDA+>UFu_L(`{2ZM$(D{mf%z;t&2@>GG{C^y)=+>N-Ym2kR z6#08`-+&W112xyiB``zwbafH6GRqaFPeTPK(5~?4npRr(LJO4$v~op#gr|Jl72`!& zD;+)M*RHN1Ls2}<&Ccjra{mP|DaTv-tWFN;#iGTnMB{NIxOxbREnc0Myb)&{v^b;+XDxcDNsD?b7e(r>qlQ1JMH9?kJEU`Y5N0IR zsj<;GRp|#C2(OEld)6kayHChVYhx_6v#*ViFP!ZZm2+)`8%scW(XashT)qG^a+?=M zI&j`KnXPplQk!#Xg!^sq@=saZhha|6nGxyeh?3fy^ZK8Iw?@xwhrRGW78k_?)?&Id4@w9UO63n2 z1T=sfTkCDL$f0k=boi+iPr?1uLvMBJaHus8dfHplL#`j72mahocZH(?xYpph1<_VlmHsA!a9&=xJop8%}v`ed& zv2S-3`VqbjCtnts^LCOf-qa0)ednf+aAAXch)2tw7aL@|cU}jx^c`m2w|T1?(IUg& z{S4fb?+(I|nSD#9I_jF7y=9enQ@XcAclrY-Bz4zIx^XvjPWE|kdFt=D+@*u@v!Lb{ zH3dyrfeSBv2=LWGY`Zo!kC5%kJ477hu_g*|>vDr@V+L&?j zWIS834f_a&#$p;GDy3L8;h60B{%>ksCwck(Nc2s;m+V~Ou+%z)RgSKR^GA2yXyiJ% zxFU*VUKKA_#0z^XQM65&mw|=%9h_{MEx%sYZ|gSvG2^T=@O-G@uP$L0P>cD%5Ez_I zE%z*RsNZC()CmoSU&q^v@~@;$a{Bfdx*&aed#Yvmar8&k_O5D-hx~1OnNPjqnuU>< z2Ke#^-_qqzllR5Z^3fe*0+yjP+EG(UE!f1#+8s9aHAViqBPO`mCcN|;gPhq5o5@=o zB87;Z6Q&lI_>V-0qnzz4ieAbi-w|Wgmt@+q(#sVz;IYQx(nBe?LDqOl-^8bo16~k{ zo+4q3p5CgN2|5@R%Y9K63W|_5lXeqM(9@@(he6j@~z_?!nb0qAor9~ zHM4Sor_wQhpfb<9oziiWDi0h_=t2ptNJ!^IK1f6tF|%Rdm|Rbn1BWDvh?X}+bn1-N zzxXh+IE<{!!pLA;%1B(2dP9U?z4h!gyP#SvXeIW)uWst;1! zmzSxoPPh}gRWKi(v_RnhgVuG}QxLq)!9+R@TQHH}w-k#HdhRA6M4o6Yvtgo?gTZ z(w+?w-90(u520v0$7r6RV*FS=QSKn4kitQRVRprpgMzN$M1wNJ(!&M)BXTXH$d!gO z=e<5u#NVXnSIzm=>&7GuM}7s!uMYW9#clt{&v@yS9Bl#eqkvVr> zz?i{QJ3Ye^WcbPdpA0uxwfr#A-DsvJFWro4tM;ET zF(BEfm!9fI8mfP9n<4FjrgINsQ%^hy1gH3WsQ?JKgA@ z@Nlz(GPIfDBHKt*Z6vyA_GCWONtszDPc6krW!~!(zcIbY9Zw0QuYZ`9RFWeQx3#FGv zYoW0sb`&m5mG2icrybKzar?l1PAr1^D8;oobll#M(M2oyip=U8m*XU(bhI2%Uiq;i z*!NukS`x6?kzcQjls#8>@NmEUvs_WVR$cnDjM|eNG>Y_LPY|NXO`wkY7v!`(Z&}j8 zmwtP9`j7deMa#twk#6QrhRQ>GH+n{ZH7!^^@kzq!>J;_CE3#j8UwL+CsHGUojP$Ea zvTULUXJuvwWL-;vDzdKaj;yuHRJHIYd7v`h{`gP0RlpgCplfJMaeB3_WLb2xg6A+w zZ~M@0`Gw3#`_Qi5^OKzN;V4fs)%sM$#t#G4fq{SDShzPKv--}?O4{zVdhbcUX3j%X ziTZTcRNV*RWz7J2ZdbRjP0+dkb6FH$g!zD@{g4PmPoqun*3RuWdJ<{tnQiQg@-)yiP)s%jKzDc zm=sAk7pG^vZO)Fs`_I`__*vU9C^j3kJgJg{){p9n(dJJGK>?Xawh_jS?XN1V!UqoO-H|~o( z^_I)>gD-B*#~K^r8Y--((Vi3QJiN>LBW)dm6eZ2+PQh~{J@<0D`zkv3-w2aET^a z08dY`g+|yp)b7Zmo@o^fkW<8*tu0wSOn-w3OZvpesW)=Ivga4$A*ZD!MJzUk@Mc^s zk{c%FZxAO^Eci5ZXh)N!un<4RbjM|9_c&*jCor2H{?Xqu?|t1Pmsni$atNK zTscK8$QxGMWXo3_#T?o3KuE{h0=ADjel)U^X$K<4-HC@1yhUi*_bBqCWrvgxvwhjn zp|W0qj7B|9Y|7}amFy!uvTqD!SaQHN@dYSVaFgj_5ucz8#a)XY8sRY4++Y8HX~`hU zm|8L(53O5r7z%3Jk~AC0()%DYTQUs1)-7oRZrzf22Sraa1!?|UOOh^akl+3~$~Pm{ zRfeHdO4FwH>(Sk7bGS`uAioER6{jJ2tJO+7{CMl2P&R(jZD=utvgF+9=h<+1&v zx&+~XpyYB(>QLN-npaS0$H0RaZK!NhbiGB6{`BG4&XAiMq4&QxPO5t7Bf?Tvw;V4k z|0Iun8XwXNFEUKP7(kd_86AL^9X*wamJ2exrk`i?XIQGw%Sko!)h~VI=QUBDndGml z<(Zm(&3a`WpFJ?R`-XV0|b`R64foahz^MCXcl;Bf5_J zl*jhz;u0Q3FHt{q|4U9fvPVtYFV8#@zWRHMO#3cOT~aHvzZf-yGt!Ly9Kg6mpd@Zm2Fif4(Sq}TL!GACA&dk1?a-<^pr%6H`8zNW!oUHz7 zlOO;5;BdU~hHDx$V)tK0xN!>o{!pAe)4T4i&&c#frZ+q`b*3lvr-A)%7liMQK85+577y= zSsuz}~tC71IL|HlpW+dOI=)pG4G+3J;Z^3*Sh{!JKElp!3-p=#2g3~e&&*P;K+ z^j2g#|BQV7*I0jg;ee9R#nxI%k|3}A+E>pw`M2@@1EFa)(ZR!V)o;Vpe&O=aZ(G#N zU*xjJnd;6?@>FAj+UJ}M`8__m8*=;G6H^<%<16G>O=H1>TSU-koDVGg-KGxwQm*`c znfmEj>3=FbJP&U`)!}|ac-X!;;SpNafUCI@+*nQRB!``f_1}ssXEe5coAkq3Isa6@ z*fJcbIB~uUw{z$-h{^g->2{m8@8ErMR(^geO5Jrl!P z$t9FRW^9b*Z#O${q$RT?T>zzR1&8B`HHVV-kIbe zs=ej$KNC9^2DqH8AH3ZApq^Wdajr02PWluTWk?utI@Kd&yR=p}FDPdr7W zyJ%ObKVu_BZ{z6Cg+pB0;2|PxI0X+gziH7hpNipMDsjNwryA~;u9+ObW6&0k7$5vR zSFz!+yH5<}NA5lsrGgwkcdIoEl_^5OGVS~WU3>vrmPZ_VbR&C9u@*Msci41P5j+x??0D7< z{p3=nWhGf0@OPZWF#T^ky&X8^@5B(o)arQY`g9Ijh01#YuLAxZYi&TrhtaLF_L^;4 zD$c=MU#{ZtqqrzAZvY%#YAK$BFcwV9@^FPf&)qX3U3&ha6TQ;5X(twUIuLWBUeoa6 zUJR_h8(}6{Uliz&Lz_GK&Vdf)C+fS&Y0WVahj-JjO6m8nqU;glKp?>usH9N7vZQ&C zrQBMN`PH0>2Q+pMcUQG$x6F2Lz}=x3EB|&!S~X;$t4Cb^QXRHip1M3x9df85{y**b zwTmm;kvP{!{&vNVhYc3#d-W;x*Yk4q)ls1euBPdr9({4>TQo){^=cu00CIJ(q1*df zZr_dYvNQx1AfBb>r(=`X;c?B7Xx%O&0<6KTH8a?IZH#(*qx5fy&41ui<8)y+enj>r zejl7;Qzm|hHkkO1)4kKvxwsO~j`wgqgFeDMLm%17-o@D`1*a3=QQT`R%67d!Hagw- zp;Af_=HqCbUE2edZIp+ZHUqDpQQGyb(grKaO}3o@I1Phqq*uJ{uzw2dq?ZoJEiT71 zy`$g=Ffzj{57+gwAalY1(p!w@iSNkEEeYbg7rTnl>YabQI7jsJ?}2+AGL&@2{_*1b zVpx1=D^@=w+vcfkEAkJ1mYR-U#R$PKStq`ug$t3Ox=(APgop}_Ie=ggKQME6DXvYP z)@RX-*u7e`r9wnb*oMJLQRR8;yshvk#>5FO^Fii5=nHc7UU()sWcUTXVtX5D+D^1< z@JPn8vqwhH3to%&G%TU};S38_+O(c3emzlsTAQtkf&Df>vubu<{h;7;{TW9hI3Jt} zcenwI*=JuNCqx>v@S?;sS6lQ&r|Pu!gNj3=V~DdJJgHq%@za2pVU?ETA?%%LhGu$? zt@KukXgSKp3H3aOC<@Q?_R*Gli-`PMTSiw`4sPX&@TJY96GPzzl${d@9=;}TCGqeQ zcM-lO?-%@o5a zg(rCUn!I%4`GAM7$s0htMDXx6c`3w81`l78*ZZ`V=qrY)QKz-}zG6ArSKI|q6ApYYl_lQP_=iB7?vd?1RS>Hc;~8}BC`QAh96_WOwhFaF8!T4^}(~+iuNM0M_>4fUvO`8lAOLr7=E1>T1HNi#^jYN$P$y=82H}W@%Cbf zy5N)+7D=&SAbT3imb$}6xa|J3{zdcsEmGc z0oj|7RlsVpto0#8vsND{CZVLXAdw)GPX=l~bruoohbOhmoke(LNBk0qvY-`(yxsOE zLS811Oz#^+X?-F@w7T&_EjvPV>7HS^{+#+C9-?t@^?l?NYSp<56twuHj%QA?*$9e@w?b@Us@}Hyjc4 zNA75^Y~to#UP+rQ(vs3UG61C+|w zVwHK-i0m@4Zg}?^?k+_tpN`(o-UK|WkLDjE64jVSEj>nr2Y!ik)JuP1PvJlt_VRSmUETVfwtu=9<~0_L zkXfCsb(kSyqIUtD-eQjJtyVgN4O;`Xx&1|)I&Y_TPm;Jr6&CHiBoVC6`eMia zB!S;0G_=#glf`)TKs#-AvY4XYds^F{j4s&yr*M5#Oe)I$1-#Gr%txexv}OG1dB zlA@cL;icW)7YQ=Fc2x8g7U9ukt=2wF5&hJOI}9HfkSc5uLwB@jy&VOI?f|79P0|%- zi-$r3rB-vMiscqWy=gSQ2y!uVwU>+-`b=!akp;A2Whb5 z&JT>5Tu2jXsdwO|V!A%h1vNXOCpxXda$^7?c)vfk)e9fb$c`JkSf1ZY9<$u$Ke|=Y zfpuCL-dTvPhLDyOE3!)DBKoz``)VJ(+mNna-L54L6yYI(tP>7u&d#m-w0j1MDY47I zqt^{~VTmfSB9vUZr1|&Qu$L3+s|F-koBK^YrTs8a^j7P=G~YpDjQV(cZPFkSt1fJ> zEg1y=RIP0sB;G@pYPSy-QGkyO7Q>+o5OH;LIo5lrG|7ywFnH1;e#s zk9MhxNCoT}Cq|0zwfS-4vKomu-@A%Yu|tut%A#yjktuB|>pVge22!E;p+h02`1WJk zk*=uL=40CBt|C4*j%D}*C==JI$^hD6woV&yTpJcIrdWco@MAT7PaNZ2d$m}HxKA9_RyqW|J3dBx-yt@tlXhuS zx(j+wr=Yt?nKBgWwBXTSQ4;WheDLOC@^(auCmGe=6AL>AYFs&p}jL|ZNh#>X$ecGfU;vTU; z+df28h*8?Cbn&!m`AIvMF6IcUmOE6OR^R<`$9Sjk7yh$;ym7jsRBN*{M10g;;7!2U zHvLtD3)q-WZl&{Am9`~Ae6EgrZ^x2hBG#gwe@|OKO2mpiTJ)e8wN#Fn%Y}xopP~?aXK~MXcX3CR2D=)c3Y%_A9&}Vim$)hqP_Or4aI){#$jgXVU^9%!z$_3>)*YUlty1C z9WvEwo3rp19tKPw?QoW8467y6TV5j5wf|}QNaW0>BZB>(rq6gs3(1D*ecM>%g>;ry z7QMV{$F*#+Uc~M#`={v|>bwR$W!ACBF74xq_<@gZ>d}cJ!YfmsQ+;;)XQDW$`ag^J za>*mKEbr;s{0^;9$zrJ1ezF+q|L(UphTn*fv?-HC!o<%uwP z!+)_Z?ZIDDgHA7lcU%J=4OI#_dVEBSNl*fXeP$39g7=q$@YUu{7ZKWp$)aa?C29ko zrvD)woP|ux#fdrnJfosa8+eCER!{t(&ACI2iPx{bDVW1P>JVLjE6TD%xB{huzl8@C&mG4c^NZnMKgbJf`Kp|0n;T4t=%+op)S z5pu7*ON47Z?-Y07dBvUL7LX%%ikm=U?}C%o6?%hwc$eramTPD368Q+t=iDuN1FgSX zT=oygF{N3^)=F*TJz`nxrNcM6==n`1PvU8 zk%-fmgnMy>hhscfO{q3}8qz0!r(_ed`QxCcTGHYUvfI5tv z*ACsNPQRUcNW9t`qlk_a^DtED{W@U$B2}9?Lk#Tr0o;5X8+SA0eB9= z;!QQ2g)(B0XFYw^A0*iE*Ao6d zcq4D4HE*n7m`4e}Ku+`YPn|j|DWa*zf=hLneMtM^K4I@_y!*KGZA=sNJN1n{9++-$Gv%?P=q~#eCX_s>Vj}>HI0%9NGXfg+BCn}BFX<=XqdzJ(g!=n z&K3^{q3+mmzZfJsCc7T?nI9Fn_`xfgSfZ_k19x~lDBkplD5iJfvH9A{o4#^|e(?cI z99Ww_nkQnklXFG1tysbJZM2`VwG=)CCeU)Oh0YU>_O;er5B+_)N3lcH#?2GGv1hH; zox(``8B}hY%;`_qY>InsjkdB7(<`N%(u8}~p_3A7wK>Z~XYJ2I;p_hx zTtl?oe;WgdzOpN z?Sh<@JGN-+=@G-S{%bu$Z{!VS_YdzGFj|L|U+Zb2)K9-0#pbaP_0yeGxc?qNL;)8muCbQsgSm@ZPbtC)Vnw85bH$^~Yqy^I0_n4auo;BT1jXZj)2%}m!a zUB+}S(@9JRGmT~1!1-U%DW+RsqEV28=`f~~nLfgFCDV0GOPOwCx`$~k(;t|gW9oxH zpGF@CQzucBuVgdh9;S1dKE|||>6=VHWO{&U9n&VJSD0Fpi~^IG4rV%*>10qUUzy5` zg-lm4UCXqT={BY{Oph`>#q#I1m+$+Ks7l0>{)G%FltAT4D7CJwti!d~8i#8jQszO6jn{DI~ zp=CWI0`eO({#itMnV|-EsDG*$WB;muYTC$;GKP26KaGri7&o`U)_08jar8u=fl3%N z%naff;~Y%?B(;${O{^_mDWY#R%gJLl&S~|}B2$g=GR6#*CmCadq<@MTduew(E229Z zBTP|Bn5}BhfIYxuZ#LPSy1WhE$=GbgPqdg~I)ZpkScR$$cuqv;oBeu}RZaX;8(ha2 z>w^9{*+$;j2LI6pH!(I%zhGch5!&~y?NBxw9b@WQ7@Kxk+hD&oIG{~>TN@nK21gh; zUoi``w^4{|gB@*fPsV1$B(=dQZS>RH;K4eEqc9C{vVu7hv)bSs#^zMWV{CTvBE~p) z(m%y*lmG2 zT2#vlW(zbi?#c-+y)O7hxZ=Z}WGfa%cz z1~zHtApqc|Ek`lqDQu(gh<{X+xiFfC^q@DcNwmN2bjYTw0jrX@_9 zm}dRkke3*=i_*jl>&J$`&NPYXqK|iseGh^Aj-Bhp7;Aowp;f^2$u_izu}Pm}Y|`R3 z@{%_4@;36SHgc`tZIPS*g<-^-OiP(=W?Ig48`GUkcQO5hX)V*EOdFYAV5)p+l;g)V zfN8#sAHtYMFtsy{W9neqlW7vu6sBoRolG;CPGou)Q#1eR2F_O=V8KGB1x$;Xu47ut zbQ{y1OskmIGHqmPuGP(qm9LBzurdwM>2Ul@G0dSUV5G>7RTro~#!d$h@7 zSi`iI=~1S2OdFXtF>Pk59ANvH1~3g{>R{?*n#Gj!pQhw6V=mJIro~K4neJp-%k(7E zKbST%4fxtHD2-{>*E?P+!?CE=GD5ZHH~nl#O-I?x*jy}?V}{&}DXomn#WRetxj5Px zn*oJ`u^CV#G3LcHUrA$z8T2|Cn`=uZV{YKyZT+Q6+~Wo)ix<&5>!o1E=VW|)g( z6=QQTtYK^hRJDw8*rtDuGLB|k$Joxek#P*;CdL#U=+6EX9vNo9)65EHJfa*o#()`* zSQ%fBz!-Pq0>T(~XKZI|h8qsXh-dWjl_X~LM>8&EJjSR$4&0bA zmKAm~zKL-ae<* zIL5V%yE3k09M8CkaW}?FgUHuw+?^Q#4MqzjFt#)9!8nO=PsUEhy%#JHJpI%8}83B!P)%m`!b zWb9y^!8ncaaK@R8M=;J|Jd*KT#-kV)Fdoe~znB?gm{G!bEaP&lgWBg%4qx^Nu5FBHbGRD7-rhj%a_F`Pa*qiZD z#y*T28T&DAW*pAg`m0glL4Lgc+L>`bDv(-H!~J? zW6W3^jT(D14rA=Y*kRy&We_vcSV6=Y8DyFnFrI8?z&MZbAjXT#^bR9^k(r+HIx{`v zQXQlJMNcEaPBQ`H8Z!aoql`t8q2FlgGj2BZ8C!ohT0o>2`eBT{89NBm`14^#nwcQY zNRY|chw)@nKG=}wnR3R9Ou5sL7nyR#>r6btke33Fr+~vJ(_rj06~-C3#>80$KFZkg zn1LG^hcj;eeaA~*i4ebhGgusE=qXtoOma&q&Ss-&=CRz|gfdjJSbmflIgEc`JeToS z#s!Q^42*xuk{K_sLJ8xq8J9EumT?v1LyT(~Z(>}>xRP-b<4+hXZlgj!=@^|FzzlPP zU}yX#CrDzvo3WE|4dXO!F>?!*#qyU~p2zrp#^#ny-{aAsDqw|arULKlslVw{%yJ$J zN(tk~4Y5+rcn4#J_k`v-K@H1CvOJ9C7GNr0Im!y=mZy>N)11K03Cx3pW|s3!{sY!%&1_6OvdjpHg`A~j3=}FS;k3hfEVLDmYZ9&G?rUg zzKG>-@S>&^G2<&%SjTuX<5I?-G2Y2|HRBq_A2L45cpu|N#@iS-Gd`lXKbY447)@5o z3So?IV(egC#W;=eVa86bp*Q19mLFt1neoqz^BCuU$BaeH_?&SO_` zI~l*pxP~#_kJCR#86RidXyANBGNYLl>KI$E7%lP<<1oet7&{o(GfrdtBjZfQ#~4p$ z{5|759i#pCGsDXB*gRTU#0ku8wv*-N(MS=?AK>(MmYYW{>sX%0@=Wd`AI7C5r~V(u zj2zA&k?~H>U;*PS&cK&(4a?UsKFatl#*K`(Fm7giGh^#j-c)|Tj4&|B>Fi=`o&m+#J-C*#xvSs|P8WVW~$<7Sr6H#1;)AI8>eMuiqJu44H>#$ha9#yG!# z4d}=W^R#IwV+SXAhH)C>35*N4fMmv*EMLqxjOAS!PiFaj2F9k672;SSj}>MzUc`76 z<4o4?!MKR!4>DfIcsb*vtUrWtDa%*r7(=y&6$Y`wPF8r5@m!WCF|J|xtBj8_ew1+| z!1oN*rGoqGF&xriBGutE{zPZ`&+f#HnTvHUK^%^csKU|h=b zJ&dau|C{kq#`znW(Zq~@F|OqTJ2S?ML;BkA65}w&cQY>H7V68`!SW@Hn^^8-oMy=L zm6gmWXN5GznVdlZliO(>|lesF>Yr0EXG#V z=%R-hhcWgr(=%>hoCd6KDvOzs$qE}7PiFi+<2=S?j2AH;#kfe_(eRsi$Y;mA?cy)* z9a-muv)!O9WicY0T;*Y9jxtTjQ)Vc}+BE_H9%lx=W0c`~^05z1wNINrBX{AfhvwL4 z=FWOx#&qr3zs1P>2XpVAHRnG2f`!v(&9Tp#lQ(1jtcAH#ADF>P$_@EL4=?<03T)jC zy&3c8|6lZOgQ2;~ROJDfYF8F&Lz~5zsA&()Svdcp2kd#dbEZEqW4?XCjD-uyD#Oqn zE1Ja<9=9CWHG3)*rs6vV--0l_pso^96jMgA5INqTAp5C}jKY>Tq22^pld5VHu87Ai z${WU8Baw6ooT8OHDel*b5e2NhCM*H3zg5`7FJWfJrnSG^+wSkHmo?ipu`u7hKq!d| zXDnJ6_nfZFn>i(!dJ?P1Fk>qYsX(f9g>o%H)6W zvh*@?zza~c6)nO)f9^l!lSyIGKY4mS1^?hp)blC&Cr{Ta2Cr!$?3z!FW^`^CHKLB= zmMmE^eJa{bS=U*mhV+ME;k39h8G42#FUF`r`K5-)kW4fr<=|29r)y7~q8C*~dKf5) zi;SXbx~U2+b=+TisAX}e`Z!{q?smh#Yt^s1U!nKbfAZARzF46~I`Pj(Dv47UEI@XO zGFMgbvo$4gu2BvKtCEE*66Y_NKP@gvk14a3sY(sPRpupYt|vv3<`k-9SULWY>76Yt zEg?#Ir}`5oPCR|G$|;^cdBWrmP?7@bYo4r8pE7tg(8U56)}Rindgh>|W?4M``D%51 z_R(}>$~a(f76u~?SE5Duu4{#T6sOe-Ru`T;aUw;TYpq{?@&u(7;3f4}lt1vzLfSw2 zYsspb9%9M{4+9_H$0*-n+6q@9XJmm&Ku~rdjZnO4vlqu1~l?WNxL+B(+E6f2l{&ZTO=R_?q?Tp*RD=$e=>Q zAk;m;UpMfd1r;IAdj(%J-BcwjEF0z2f98qa)ch@~XTI6T(;%C0U8bVd8? z?y*kdz9SF5I_s4^+VX*qd-~-spaVFaN}+B#Azt!$#N`;iS~;r`=V=X3%Dga&6gaE> z`U;Kn;E7W3yv5|hIa0}R)k#t)5f*=2WJ1IB;rnV$p^e@yN6X+0SfZbm0c zVt0u@)ZnaU^a_1{-?YA-Zkc5lf84;~_sEvBD%<%d6)SL5B*a+_UwBe@g0O?r!Y@22 z+#&7BY3X-TnzihMxO$dd`h>@(&aSGX>s^&;QEWPl(u7^KtUArQad`B^saKbouD^Q^@}pUM9$ShKi(@&9=*u?Gp4KdG)lHy4|5|AFdAHUhY31 zm2!@o-|P3NH#JD}Akg@vmrJZDcO^5)C9 zk+bSP>m*4o4jKt@R$F4lN#P@x8>zp7VfuKvZ~Rw1fBm&ay07&!2~>LG%cqn?`p(ns zd9JckiQJ_6;}uncRsB((0N0;lqWk!;bJ>5j_f)j)eWg=~Z*={CVo7nRH0d9sAmii0XC= zo$=09i9K+-M0tf45n#vP0{4o8|sLY?iB^Yf4f<3)P6SBwV^B8(X}hyxN~d!ru3y=d&klh zGd9G!8r)T*`gZJa7q}vC7^1If-?4+B^=&(2o6;GtU9;pvP35-Oj(9lQ)ygy2>oYb* z+q%}ZcWhv_xjlAs^IfqmUFrE}+Qu7;rwUq|kiD{IdwXZBoTq$F^WV_bQgO;`b+6gg z(GlC(Ro~V@YV95OZjyA{nRescn>F`!EWK~LHy%sBai(38%-L`(_Jtc`ot@EbF$(ln zO{GAMJL9{$8d(gBd{Nfu!acUBZD&jSJ!=!2_|R>Atdj-vy=5;sV8iX5UB^?|tF`~w zxpBkVTQ6I^vSs^rkxz@(9KkfJP$WHfp8f8jcjnodX8yTax=PW*9qn5vQ~Kz98(mOe z(-4csuiL)8eTy`>*XufB>5U8QWBibcee=wNdSm4djVb9FXWQSO`~6C>wZfaypX7rA zPx$P@#}@h0^*;NH^g^Ev=yH4biSz7U|BGddBMS7RsuomE7Rvr6eRtZ-Pk;M7`@#J0 zmc1qqmsuJqFW@gfG%t+4pqq3Ri|H@?L_-SJ~J#Qu5|Awc@#}N)4S!6G^$@+y> zd|nnMumLXrgq0Rp2jegV55oxb^Pb=ln1cJ1^H?ju5_}r!n)Df1fO9Ukav$^8SuldF zcOm47LKedkOtGxx;cc}%!bOlZ|C2BbpMfcO5c<#KeH8RvAaaL{nFK7PpIdA%oL$sq z@*>(G{Wi|z6;hJa5|MZ1h~y)3c1?z>(!5D{Rb8 zt)$wxhgn-+qyF$*NlD3NNv0}p_Pt7zhQo8oj~%ht4@+vpOG+yNeOHtN^00_IaHSTc zB;9aa-G4y!;1v861q{}Stc3~K2n$dXEWx*>*?O>^nq~pOZ z5R-8ezXnU9Ug%O_ziq2cU8iHIBn7wxve8z4$qml+AN)Aw1C7tFDmNV1VH7!c6?Ig#(lR@=0`T%ZCB zUqHqzao@$ia1)J=TbIf|BS84R4@sxzevubti*5Q7 z&1kFbP0^&5-&Fgu7NFVmK8WZ^r)jsy2g0AHhW8+9GVpyxzh}{6N8yWP-P>JeWG`)s zh#hS1%E^Z@il_u05q|2oWCD+BlZ+WQuF>{%GU#YHYv||j5A~EgV*-}&?|IxEU3LOa zCGiMV3Gu(<_*HO`IB7Y%r3pE;kO8CN8)cF5W z8x&Hoh^0{TF2pZ4}<L>TJZcxwYriS-JPK#(0OQ)U)r7z04o5Qruak&nC!eg~Mt1hOiiFLI zBosAlE_BB~I{;k?u`>|T`=Jiw0@SAQ97K6G| zO#WSY_=F4eQX(cQ?1N$A=U>oHw8eIRhcBcsjuVF|fIU{z`}Z^f1y771DdG*kM5n7g zRvY=g$ggDE%*YSQ6=Tz*^btOpl&}w6ye>lp;%@fKBS%S4Hf;k8HE~uguoQd^fA9H* zIbqCF8%ZuPF&ntRF!`YK;bu+XA_@e37aKZf#H8Q~=7!~Sny@58XJvKAXn?Hu9 z_1&yBJYpg+LOjnchCagsh|4jPzf~nMZalY95W=T6(X_C)%}5sv-DO+_)|BMpMQY&x zf^nzI0z6EFVmmd3`8Z}F7{A+~ADXSdgCFzd!7i}NFzp_#;nN{*+fG7Nsi7}wdSrZ$ z;Xx*18sM|4Q4{nL?kjvrn<8pLf2W-QT_yJ8*e9*`-5+2#D zoo>v;AL3J6n$R9GSt@yejaqxJU)l# z4YhZ|vR!@{54Al#$!xgrtK|r4t5Ua`kCkcyR;uYq6Hptaa-!m|c1;ZrLiG<<7_U%m zV_G0J69ti|T5h^7<-;Dlnz?jat<(tbLwKq?116vs_COzGo=bsg$1DanlN$ukA`P%n?t;T!(r;S(TwQeX6 z7W|u5Dc5%^wKk;J#cTC8-dt}ZwKn(NbtA5=(ymt4>)l8}siR-;R*uz5v-S|VK^AcH z8Y1nGIOsi<(b(d1pk`At8+1n^xdej4I8C6+w? zhYu%;tWHZu+m{p9*3-gOMX0WFL!4a55O0jJ!E;}`v>>M~6zjJ%TatuM{OgM=T~VHx zz{vtVl{o9Ey`c+7$+}w1kGmORi|L?z%Z^a(OPy3EO3}_Z-uAO=hieaollEIyEi3s& zear#cqX)bLfq~#a-9TudVIVTlIuIY|8R#A88%X>2*iw=h!#rYup25Ds;lcc1VQ^${ zbg(#B8k`uM8k8Z=kax&8uY?s}pw; z=|#KkCz7X1qc7uRhBNt0Av2O0%@i}G%tU4~GnJ97C+p4nvi@u!8_b5X4cTzEDI3YQ zX5-mJHkIwp_GEjreOV_voXuwo*^%sMwwNttC$f{-sjTEYId9IF^XCG&V6H9~$~EM| z7w4LCkz8voo=fCXx$ay~t~ZxIFmj-HVB!Faj!_=CO!}gS?1y#EP=07+s5mq+G&SU* zS^=umKy6x`gwyTxI*yZfMx3HE;Y>Lm1QkF?4G1XRu-iU<8e%Dt7D)eOk9}drBrlLm z`meuYLn|itOTV|@-yiG`^@sZ-{qg=(e@}m3|8Reyf3&~UKiRMC>Ze^p1L5?AU$#%3 YAzmKZNUN2m2|0&sxBazwEI8*s0V2R_$p8QV delta 41105 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 OjC9xS&Xf4Jg#QJu{VkIK diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/wheel.py b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/wheel.py index 48abfde..028c2d9 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distlib/wheel.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distlib/wheel.py @@ -11,7 +11,6 @@ import codecs import datetime from email import message_from_file import hashlib -import imp import json import logging import os @@ -61,10 +60,18 @@ else: parts = ['cp', VER_SUFFIX] if sysconfig.get_config_var('Py_DEBUG'): parts.append('d') - if sysconfig.get_config_var('WITH_PYMALLOC'): - parts.append('m') - if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: - parts.append('u') + if IMP_PREFIX == 'cp': + vi = sys.version_info[:2] + if vi < (3, 8): + wpm = sysconfig.get_config_var('WITH_PYMALLOC') + if wpm is None: + wpm = True + if wpm: + parts.append('m') + if vi < (3, 3): + us = sysconfig.get_config_var('Py_UNICODE_SIZE') + if us == 4 or (us is None and sys.maxunicode == 0x10FFFF): + parts.append('u') return ''.join(parts) ABI = _derive_abi() del _derive_abi @@ -95,6 +102,29 @@ if os.sep == '/': else: to_posix = lambda o: o.replace(os.sep, '/') +if sys.version_info[0] < 3: + import imp +else: + imp = None + import importlib.machinery + import importlib.util + +def _get_suffixes(): + if imp: + return [s[0] for s in imp.get_suffixes()] + else: + return importlib.machinery.EXTENSION_SUFFIXES + +def _load_dynamic(name, path): + # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly + if imp: + return imp.load_dynamic(name, path) + else: + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module class Mounter(object): def __init__(self): @@ -124,7 +154,7 @@ class Mounter(object): else: if fullname not in self.libs: raise ImportError('unable to find extension for %s' % fullname) - result = imp.load_dynamic(fullname, self.libs[fullname]) + result = _load_dynamic(fullname, self.libs[fullname]) result.__loader__ = self parts = fullname.rsplit('.', 1) if len(parts) > 1: @@ -301,10 +331,9 @@ class Wheel(object): result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') return hash_kind, result - def write_record(self, records, record_path, base): + def write_record(self, records, record_path, archive_record_path): records = list(records) # make a copy, as mutated - p = to_posix(os.path.relpath(record_path, base)) - records.append((p, '', '')) + records.append((archive_record_path, '', '')) with CSVWriter(record_path) as writer: for row in records: writer.writerow(row) @@ -321,8 +350,8 @@ class Wheel(object): records.append((ap, digest, size)) p = os.path.join(distinfo, 'RECORD') - self.write_record(records, p, libdir) ap = to_posix(os.path.join(info_dir, 'RECORD')) + self.write_record(records, p, ap) archive_paths.append((ap, p)) def build_zip(self, pathname, archive_paths): @@ -965,7 +994,7 @@ def compatible_tags(): versions.append(''.join([major, str(minor)])) abis = [] - for suffix, _, _ in imp.get_suffixes(): + for suffix in _get_suffixes(): if suffix.startswith('.abi'): abis.append(suffix.split('.', 2)[1]) abis.sort() diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distro/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/distro/__init__.py new file mode 100644 index 0000000..7686fe8 --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distro/__init__.py @@ -0,0 +1,54 @@ +from .distro import ( + NORMALIZED_DISTRO_ID, + NORMALIZED_LSB_ID, + NORMALIZED_OS_ID, + LinuxDistribution, + __version__, + build_number, + codename, + distro_release_attr, + distro_release_info, + id, + info, + like, + linux_distribution, + lsb_release_attr, + lsb_release_info, + major_version, + minor_version, + name, + os_release_attr, + os_release_info, + uname_attr, + uname_info, + version, + version_parts, +) + +__all__ = [ + "NORMALIZED_DISTRO_ID", + "NORMALIZED_LSB_ID", + "NORMALIZED_OS_ID", + "LinuxDistribution", + "build_number", + "codename", + "distro_release_attr", + "distro_release_info", + "id", + "info", + "like", + "linux_distribution", + "lsb_release_attr", + "lsb_release_info", + "major_version", + "minor_version", + "name", + "os_release_attr", + "os_release_info", + "uname_attr", + "uname_info", + "version", + "version_parts", +] + +__version__ = __version__ diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distro/__main__.py b/sbsheriff/Lib/site-packages/pip/_vendor/distro/__main__.py new file mode 100644 index 0000000..0c01d5b --- /dev/null +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distro/__main__.py @@ -0,0 +1,4 @@ +from .distro import main + +if __name__ == "__main__": + main() diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca0d77ff060ef0dbf596099f91cd5ec58f6085fe GIT binary patch literal 916 zcmcJN$&S-N5Qd$^Nu0&mw;7N)=K#4Qgjm8MQkX~+xRfll?6@=2GcG&ownyQ0xbYl3 z1DC#X;uSd2ezq=Hlc|wxY&XgwxNw3=wKJR*n=MSp^pO? z;1Gs5f)S2kj1!m?tQ#vVel5TSH<`oI+M3$G3a0#Yq6b&2>yK}j3-~Z+^Tqnp^@=U# zx_hE7*Y8N`oJgy6erYM}E7)pRWBt)*E4OWK4op-ONFH3BV* zY!I3Rm(U`#2^~V0&?EE-1HzCnB8&+W!iB-r^io$2|M#EOD|GSywxFww`BB8!H%mUH za)jT(`b%dpZZt; literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..296c167973f120343258b57a9b08ea6235773c06 GIT binary patch literal 270 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 DSJH@a diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/distro.py b/sbsheriff/Lib/site-packages/pip/_vendor/distro/distro.py similarity index 83% rename from sbsheriff/Lib/site-packages/pip/_vendor/distro.py rename to sbsheriff/Lib/site-packages/pip/_vendor/distro/distro.py index 7892741..49066ae 100644 --- a/sbsheriff/Lib/site-packages/pip/_vendor/distro.py +++ b/sbsheriff/Lib/site-packages/pip/_vendor/distro/distro.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # Copyright 2015,2016,2017 Nir Cohen # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -36,40 +37,39 @@ import shlex import subprocess import sys import warnings +from typing import ( + Any, + Callable, + Dict, + Iterable, + Optional, + Sequence, + TextIO, + Tuple, + Type, +) -__version__ = "1.6.0" +try: + from typing import TypedDict +except ImportError: + # Python 3.7 + TypedDict = dict -# Use `if False` to avoid an ImportError on Python 2. After dropping Python 2 -# support, can use typing.TYPE_CHECKING instead. See: -# https://docs.python.org/3/library/typing.html#typing.TYPE_CHECKING -if False: # pragma: nocover - from typing import ( - Any, - Callable, - Dict, - Iterable, - Optional, - Sequence, - TextIO, - Tuple, - Type, - TypedDict, - Union, - ) +__version__ = "1.7.0" - VersionDict = TypedDict( - "VersionDict", {"major": str, "minor": str, "build_number": str} - ) - InfoDict = TypedDict( - "InfoDict", - { - "id": str, - "version": str, - "version_parts": VersionDict, - "like": str, - "codename": str, - }, - ) + +class VersionDict(TypedDict): + major: str + minor: str + build_number: str + + +class InfoDict(TypedDict): + id: str + version: str + version_parts: VersionDict + like: str + codename: str _UNIXCONFDIR = os.environ.get("UNIXCONFDIR", "/etc") @@ -85,6 +85,7 @@ _OS_RELEASE_BASENAME = "os-release" #: * Value: Normalized value. NORMALIZED_OS_ID = { "ol": "oracle", # Oracle Linux + "opensuse-leap": "opensuse", # Newer versions of OpenSuSE report as opensuse-leap } #: Translation table for normalizing the "Distributor ID" attribute returned by @@ -133,8 +134,7 @@ _DISTRO_RELEASE_IGNORE_BASENAMES = ( ) -def linux_distribution(full_distribution_name=True): - # type: (bool) -> Tuple[str, str, str] +def linux_distribution(full_distribution_name: bool = True) -> Tuple[str, str, str]: """ .. deprecated:: 1.6.0 @@ -151,7 +151,8 @@ def linux_distribution(full_distribution_name=True): * ``version``: The result of :func:`distro.version`. - * ``codename``: The result of :func:`distro.codename`. + * ``codename``: The extra item (usually in parentheses) after the + os-release version number, or the result of :func:`distro.codename`. The interface of this function is compatible with the original :py:func:`platform.linux_distribution` function, supporting a subset of @@ -176,8 +177,7 @@ def linux_distribution(full_distribution_name=True): return _distro.linux_distribution(full_distribution_name) -def id(): - # type: () -> str +def id() -> str: """ Return the distro ID of the current distribution, as a machine-readable string. @@ -198,7 +198,7 @@ def id(): "fedora" Fedora "sles" SUSE Linux Enterprise Server "opensuse" openSUSE - "amazon" Amazon Linux + "amzn" Amazon Linux "arch" Arch Linux "cloudlinux" CloudLinux OS "exherbo" Exherbo Linux @@ -219,6 +219,8 @@ def id(): "netbsd" NetBSD "freebsd" FreeBSD "midnightbsd" MidnightBSD + "rocky" Rocky Linux + "aix" AIX ============== ========================================= If you have a need to get distros for reliable IDs added into this set, @@ -256,8 +258,7 @@ def id(): return _distro.id() -def name(pretty=False): - # type: (bool) -> str +def name(pretty: bool = False) -> str: """ Return the name of the current OS distribution, as a human-readable string. @@ -296,8 +297,7 @@ def name(pretty=False): return _distro.name(pretty) -def version(pretty=False, best=False): - # type: (bool, bool) -> str +def version(pretty: bool = False, best: bool = False) -> str: """ Return the version of the current OS distribution, as a human-readable string. @@ -313,6 +313,10 @@ def version(pretty=False, best=False): sources in a fixed priority order does not always yield the most precise version (e.g. for Debian 8.2, or CentOS 7.1). + Some other distributions may not provide this kind of information. In these + cases, an empty string would be returned. This behavior can be observed + with rolling releases distributions (e.g. Arch Linux). + The *best* parameter can be used to control the approach for the returned version: @@ -341,8 +345,7 @@ def version(pretty=False, best=False): return _distro.version(pretty, best) -def version_parts(best=False): - # type: (bool) -> Tuple[str, str, str] +def version_parts(best: bool = False) -> Tuple[str, str, str]: """ Return the version of the current OS distribution as a tuple ``(major, minor, build_number)`` with items as follows: @@ -359,8 +362,7 @@ def version_parts(best=False): return _distro.version_parts(best) -def major_version(best=False): - # type: (bool) -> str +def major_version(best: bool = False) -> str: """ Return the major version of the current OS distribution, as a string, if provided. @@ -373,8 +375,7 @@ def major_version(best=False): return _distro.major_version(best) -def minor_version(best=False): - # type: (bool) -> str +def minor_version(best: bool = False) -> str: """ Return the minor version of the current OS distribution, as a string, if provided. @@ -387,8 +388,7 @@ def minor_version(best=False): return _distro.minor_version(best) -def build_number(best=False): - # type: (bool) -> str +def build_number(best: bool = False) -> str: """ Return the build number of the current OS distribution, as a string, if provided. @@ -401,8 +401,7 @@ def build_number(best=False): return _distro.build_number(best) -def like(): - # type: () -> str +def like() -> str: """ Return a space-separated list of distro IDs of distributions that are closely related to the current OS distribution in regards to packaging @@ -419,8 +418,7 @@ def like(): return _distro.like() -def codename(): - # type: () -> str +def codename() -> str: """ Return the codename for the release of the current OS distribution, as a string. @@ -444,8 +442,7 @@ def codename(): return _distro.codename() -def info(pretty=False, best=False): - # type: (bool, bool) -> InfoDict +def info(pretty: bool = False, best: bool = False) -> InfoDict: """ Return certain machine-readable information items about the current OS distribution in a dictionary, as shown in the following example: @@ -489,8 +486,7 @@ def info(pretty=False, best=False): return _distro.info(pretty, best) -def os_release_info(): - # type: () -> Dict[str, str] +def os_release_info() -> Dict[str, str]: """ Return a dictionary containing key-value pairs for the information items from the os-release file data source of the current OS distribution. @@ -500,8 +496,7 @@ def os_release_info(): return _distro.os_release_info() -def lsb_release_info(): - # type: () -> Dict[str, str] +def lsb_release_info() -> Dict[str, str]: """ Return a dictionary containing key-value pairs for the information items from the lsb_release command data source of the current OS distribution. @@ -512,8 +507,7 @@ def lsb_release_info(): return _distro.lsb_release_info() -def distro_release_info(): - # type: () -> Dict[str, str] +def distro_release_info() -> Dict[str, str]: """ Return a dictionary containing key-value pairs for the information items from the distro release file data source of the current OS distribution. @@ -523,8 +517,7 @@ def distro_release_info(): return _distro.distro_release_info() -def uname_info(): - # type: () -> Dict[str, str] +def uname_info() -> Dict[str, str]: """ Return a dictionary containing key-value pairs for the information items from the distro release file data source of the current OS distribution. @@ -532,8 +525,7 @@ def uname_info(): return _distro.uname_info() -def os_release_attr(attribute): - # type: (str) -> str +def os_release_attr(attribute: str) -> str: """ Return a single named information item from the os-release file data source of the current OS distribution. @@ -552,8 +544,7 @@ def os_release_attr(attribute): return _distro.os_release_attr(attribute) -def lsb_release_attr(attribute): - # type: (str) -> str +def lsb_release_attr(attribute: str) -> str: """ Return a single named information item from the lsb_release command output data source of the current OS distribution. @@ -573,8 +564,7 @@ def lsb_release_attr(attribute): return _distro.lsb_release_attr(attribute) -def distro_release_attr(attribute): - # type: (str) -> str +def distro_release_attr(attribute: str) -> str: """ Return a single named information item from the distro release file data source of the current OS distribution. @@ -593,8 +583,7 @@ def distro_release_attr(attribute): return _distro.distro_release_attr(attribute) -def uname_attr(attribute): - # type: (str) -> str +def uname_attr(attribute: str) -> str: """ Return a single named information item from the distro release file data source of the current OS distribution. @@ -615,25 +604,23 @@ try: from functools import cached_property except ImportError: # Python < 3.8 - class cached_property(object): # type: ignore + class cached_property: # type: ignore """A version of @property which caches the value. On access, it calls the underlying function and sets the value in `__dict__` so future accesses will not re-call the property. """ - def __init__(self, f): - # type: (Callable[[Any], Any]) -> None + def __init__(self, f: Callable[[Any], Any]) -> None: self._fname = f.__name__ self._f = f - def __get__(self, obj, owner): - # type: (Any, Type[Any]) -> Any - assert obj is not None, "call {} on an instance".format(self._fname) + def __get__(self, obj: Any, owner: Type[Any]) -> Any: + assert obj is not None, f"call {self._fname} on an instance" ret = obj.__dict__[self._fname] = self._f(obj) return ret -class LinuxDistribution(object): +class LinuxDistribution: """ Provides information about a OS distribution. @@ -653,13 +640,13 @@ class LinuxDistribution(object): def __init__( self, - include_lsb=True, - os_release_file="", - distro_release_file="", - include_uname=True, - root_dir=None, - ): - # type: (bool, str, str, bool, Optional[str]) -> None + include_lsb: Optional[bool] = None, + os_release_file: str = "", + distro_release_file: str = "", + include_uname: Optional[bool] = None, + root_dir: Optional[str] = None, + include_oslevel: Optional[bool] = None, + ) -> None: """ The initialization method of this class gathers information from the available data sources, and stores that in private instance attributes. @@ -699,7 +686,13 @@ class LinuxDistribution(object): be empty. * ``root_dir`` (string): The absolute path to the root directory to use - to find distro-related information files. + to find distro-related information files. Note that ``include_*`` + parameters must not be enabled in combination with ``root_dir``. + + * ``include_oslevel`` (bool): Controls whether (AIX) oslevel command + output is included as a data source. If the oslevel command is not + available in the program execution path the data source will be + empty. Public instance attributes: @@ -718,14 +711,21 @@ class LinuxDistribution(object): parameter. This controls whether the uname information will be loaded. + * ``include_oslevel`` (bool): The result of the ``include_oslevel`` + parameter. This controls whether (AIX) oslevel information will be + loaded. + + * ``root_dir`` (string): The result of the ``root_dir`` parameter. + The absolute path to the root directory to use to find distro-related + information files. + Raises: - * :py:exc:`IOError`: Some I/O issue with an os-release file or distro - release file. + * :py:exc:`ValueError`: Initialization parameters combination is not + supported. - * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had - some issue (other than not being available in the program execution - path). + * :py:exc:`OSError`: Some I/O issue with an os-release file or distro + release file. * :py:exc:`UnicodeError`: A data source has unexpected characters or uses an unexpected encoding. @@ -754,11 +754,24 @@ class LinuxDistribution(object): self.os_release_file = usr_lib_os_release_file self.distro_release_file = distro_release_file or "" # updated later - self.include_lsb = include_lsb - self.include_uname = include_uname - def __repr__(self): - # type: () -> str + is_root_dir_defined = root_dir is not None + if is_root_dir_defined and (include_lsb or include_uname or include_oslevel): + raise ValueError( + "Including subprocess data sources from specific root_dir is disallowed" + " to prevent false information" + ) + self.include_lsb = ( + include_lsb if include_lsb is not None else not is_root_dir_defined + ) + self.include_uname = ( + include_uname if include_uname is not None else not is_root_dir_defined + ) + self.include_oslevel = ( + include_oslevel if include_oslevel is not None else not is_root_dir_defined + ) + + def __repr__(self) -> str: """Return repr of all info""" return ( "LinuxDistribution(" @@ -766,14 +779,18 @@ class LinuxDistribution(object): "distro_release_file={self.distro_release_file!r}, " "include_lsb={self.include_lsb!r}, " "include_uname={self.include_uname!r}, " + "include_oslevel={self.include_oslevel!r}, " + "root_dir={self.root_dir!r}, " "_os_release_info={self._os_release_info!r}, " "_lsb_release_info={self._lsb_release_info!r}, " "_distro_release_info={self._distro_release_info!r}, " - "_uname_info={self._uname_info!r})".format(self=self) + "_uname_info={self._uname_info!r}, " + "_oslevel_info={self._oslevel_info!r})".format(self=self) ) - def linux_distribution(self, full_distribution_name=True): - # type: (bool) -> Tuple[str, str, str] + def linux_distribution( + self, full_distribution_name: bool = True + ) -> Tuple[str, str, str]: """ Return information about the OS distribution that is compatible with Python's :func:`platform.linux_distribution`, supporting a subset @@ -784,18 +801,16 @@ class LinuxDistribution(object): return ( self.name() if full_distribution_name else self.id(), self.version(), - self.codename(), + self._os_release_info.get("release_codename") or self.codename(), ) - def id(self): - # type: () -> str + def id(self) -> str: """Return the distro ID of the OS distribution, as a string. For details, see :func:`distro.id`. """ - def normalize(distro_id, table): - # type: (str, Dict[str, str]) -> str + def normalize(distro_id: str, table: Dict[str, str]) -> str: distro_id = distro_id.lower().replace(" ", "_") return table.get(distro_id, distro_id) @@ -817,8 +832,7 @@ class LinuxDistribution(object): return "" - def name(self, pretty=False): - # type: (bool) -> str + def name(self, pretty: bool = False) -> str: """ Return the name of the OS distribution, as a string. @@ -838,11 +852,10 @@ class LinuxDistribution(object): name = self.distro_release_attr("name") or self.uname_attr("name") version = self.version(pretty=True) if version: - name = name + " " + version + name = f"{name} {version}" return name or "" - def version(self, pretty=False, best=False): - # type: (bool, bool) -> str + def version(self, pretty: bool = False, best: bool = False) -> str: """ Return the version of the OS distribution, as a string. @@ -860,6 +873,9 @@ class LinuxDistribution(object): ).get("version_id", ""), self.uname_attr("release"), ] + if self.uname_attr("id").startswith("aix"): + # On AIX platforms, prefer oslevel command output. + versions.insert(0, self.oslevel_info()) version = "" if best: # This algorithm uses the last version in priority order that has @@ -875,11 +891,10 @@ class LinuxDistribution(object): version = v break if pretty and version and self.codename(): - version = "{0} ({1})".format(version, self.codename()) + version = f"{version} ({self.codename()})" return version - def version_parts(self, best=False): - # type: (bool) -> Tuple[str, str, str] + def version_parts(self, best: bool = False) -> Tuple[str, str, str]: """ Return the version of the OS distribution, as a tuple of version numbers. @@ -895,8 +910,7 @@ class LinuxDistribution(object): return major, minor or "", build_number or "" return "", "", "" - def major_version(self, best=False): - # type: (bool) -> str + def major_version(self, best: bool = False) -> str: """ Return the major version number of the current distribution. @@ -904,8 +918,7 @@ class LinuxDistribution(object): """ return self.version_parts(best)[0] - def minor_version(self, best=False): - # type: (bool) -> str + def minor_version(self, best: bool = False) -> str: """ Return the minor version number of the current distribution. @@ -913,8 +926,7 @@ class LinuxDistribution(object): """ return self.version_parts(best)[1] - def build_number(self, best=False): - # type: (bool) -> str + def build_number(self, best: bool = False) -> str: """ Return the build number of the current distribution. @@ -922,8 +934,7 @@ class LinuxDistribution(object): """ return self.version_parts(best)[2] - def like(self): - # type: () -> str + def like(self) -> str: """ Return the IDs of distributions that are like the OS distribution. @@ -931,8 +942,7 @@ class LinuxDistribution(object): """ return self.os_release_attr("id_like") or "" - def codename(self): - # type: () -> str + def codename(self) -> str: """ Return the codename of the OS distribution. @@ -949,8 +959,7 @@ class LinuxDistribution(object): or "" ) - def info(self, pretty=False, best=False): - # type: (bool, bool) -> InfoDict + def info(self, pretty: bool = False, best: bool = False) -> InfoDict: """ Return certain machine-readable information about the OS distribution. @@ -969,8 +978,7 @@ class LinuxDistribution(object): codename=self.codename(), ) - def os_release_info(self): - # type: () -> Dict[str, str] + def os_release_info(self) -> Dict[str, str]: """ Return a dictionary containing key-value pairs for the information items from the os-release file data source of the OS distribution. @@ -979,8 +987,7 @@ class LinuxDistribution(object): """ return self._os_release_info - def lsb_release_info(self): - # type: () -> Dict[str, str] + def lsb_release_info(self) -> Dict[str, str]: """ Return a dictionary containing key-value pairs for the information items from the lsb_release command data source of the OS @@ -990,8 +997,7 @@ class LinuxDistribution(object): """ return self._lsb_release_info - def distro_release_info(self): - # type: () -> Dict[str, str] + def distro_release_info(self) -> Dict[str, str]: """ Return a dictionary containing key-value pairs for the information items from the distro release file data source of the OS @@ -1001,8 +1007,7 @@ class LinuxDistribution(object): """ return self._distro_release_info - def uname_info(self): - # type: () -> Dict[str, str] + def uname_info(self) -> Dict[str, str]: """ Return a dictionary containing key-value pairs for the information items from the uname command data source of the OS distribution. @@ -1011,8 +1016,13 @@ class LinuxDistribution(object): """ return self._uname_info - def os_release_attr(self, attribute): - # type: (str) -> str + def oslevel_info(self) -> str: + """ + Return AIX' oslevel command output. + """ + return self._oslevel_info + + def os_release_attr(self, attribute: str) -> str: """ Return a single named information item from the os-release file data source of the OS distribution. @@ -1021,8 +1031,7 @@ class LinuxDistribution(object): """ return self._os_release_info.get(attribute, "") - def lsb_release_attr(self, attribute): - # type: (str) -> str + def lsb_release_attr(self, attribute: str) -> str: """ Return a single named information item from the lsb_release command output data source of the OS distribution. @@ -1031,8 +1040,7 @@ class LinuxDistribution(object): """ return self._lsb_release_info.get(attribute, "") - def distro_release_attr(self, attribute): - # type: (str) -> str + def distro_release_attr(self, attribute: str) -> str: """ Return a single named information item from the distro release file data source of the OS distribution. @@ -1041,8 +1049,7 @@ class LinuxDistribution(object): """ return self._distro_release_info.get(attribute, "") - def uname_attr(self, attribute): - # type: (str) -> str + def uname_attr(self, attribute: str) -> str: """ Return a single named information item from the uname command output data source of the OS distribution. @@ -1052,8 +1059,7 @@ class LinuxDistribution(object): return self._uname_info.get(attribute, "") @cached_property - def _os_release_info(self): - # type: () -> Dict[str, str] + def _os_release_info(self) -> Dict[str, str]: """ Get the information items from the specified os-release file. @@ -1061,13 +1067,12 @@ class LinuxDistribution(object): A dictionary containing all information items. """ if os.path.isfile(self.os_release_file): - with open(self.os_release_file) as release_file: + with open(self.os_release_file, encoding="utf-8") as release_file: return self._parse_os_release_content(release_file) return {} @staticmethod - def _parse_os_release_content(lines): - # type: (TextIO) -> Dict[str, str] + def _parse_os_release_content(lines: TextIO) -> Dict[str, str]: """ Parse the lines of an os-release file. @@ -1084,16 +1089,6 @@ class LinuxDistribution(object): lexer = shlex.shlex(lines, posix=True) lexer.whitespace_split = True - # The shlex module defines its `wordchars` variable using literals, - # making it dependent on the encoding of the Python source file. - # In Python 2.6 and 2.7, the shlex source file is encoded in - # 'iso-8859-1', and the `wordchars` variable is defined as a byte - # string. This causes a UnicodeDecodeError to be raised when the - # parsed content is a unicode object. The following fix resolves that - # (... but it should be fixed in shlex...): - if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): - lexer.wordchars = lexer.wordchars.decode("iso-8859-1") - tokens = list(lexer) for token in tokens: # At this point, all shell-like parsing has been done (i.e. @@ -1102,12 +1097,17 @@ class LinuxDistribution(object): # stripped, etc.), so the tokens are now either: # * variable assignments: var=value # * commands or their arguments (not allowed in os-release) + # Ignore any tokens that are not variable assignments if "=" in token: k, v = token.split("=", 1) props[k.lower()] = v - else: - # Ignore any tokens that are not variable assignments - pass + + if "version" in props: + # extract release codename (if any) from version attribute + match = re.search(r"\((\D+)\)|,\s*(\D+)", props["version"]) + if match: + release_codename = match.group(1) or match.group(2) + props["codename"] = props["release_codename"] = release_codename if "version_codename" in props: # os-release added a version_codename field. Use that in @@ -1118,22 +1118,11 @@ class LinuxDistribution(object): elif "ubuntu_codename" in props: # Same as above but a non-standard field name used on older Ubuntus props["codename"] = props["ubuntu_codename"] - elif "version" in props: - # If there is no version_codename, parse it from the version - match = re.search(r"(\(\D+\))|,(\s+)?\D+", props["version"]) - if match: - codename = match.group() - codename = codename.strip("()") - codename = codename.strip(",") - codename = codename.strip() - # codename appears within paranthese. - props["codename"] = codename return props @cached_property - def _lsb_release_info(self): - # type: () -> Dict[str, str] + def _lsb_release_info(self) -> Dict[str, str]: """ Get the information items from the lsb_release command output. @@ -1142,19 +1131,17 @@ class LinuxDistribution(object): """ if not self.include_lsb: return {} - with open(os.devnull, "wb") as devnull: - try: - cmd = ("lsb_release", "-a") - stdout = subprocess.check_output(cmd, stderr=devnull) - # Command not found or lsb_release returned error - except (OSError, subprocess.CalledProcessError): - return {} + try: + cmd = ("lsb_release", "-a") + stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + # Command not found or lsb_release returned error + except (OSError, subprocess.CalledProcessError): + return {} content = self._to_str(stdout).splitlines() return self._parse_lsb_release_content(content) @staticmethod - def _parse_lsb_release_content(lines): - # type: (Iterable[str]) -> Dict[str, str] + def _parse_lsb_release_content(lines: Iterable[str]) -> Dict[str, str]: """ Parse the output of the lsb_release command. @@ -1178,20 +1165,31 @@ class LinuxDistribution(object): return props @cached_property - def _uname_info(self): - # type: () -> Dict[str, str] - with open(os.devnull, "wb") as devnull: - try: - cmd = ("uname", "-rs") - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: - return {} + def _uname_info(self) -> Dict[str, str]: + if not self.include_uname: + return {} + try: + cmd = ("uname", "-rs") + stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + except OSError: + return {} content = self._to_str(stdout).splitlines() return self._parse_uname_content(content) + @cached_property + def _oslevel_info(self) -> str: + if not self.include_oslevel: + return "" + try: + stdout = subprocess.check_output("oslevel", stderr=subprocess.DEVNULL) + except (OSError, subprocess.CalledProcessError): + return "" + return self._to_str(stdout).strip() + @staticmethod - def _parse_uname_content(lines): - # type: (Sequence[str]) -> Dict[str, str] + def _parse_uname_content(lines: Sequence[str]) -> Dict[str, str]: + if not lines: + return {} props = {} match = re.search(r"^([^\s]+)\s+([\d\.]+)", lines[0].strip()) if match: @@ -1208,23 +1206,12 @@ class LinuxDistribution(object): return props @staticmethod - def _to_str(text): - # type: (Union[bytes, str]) -> str + def _to_str(bytestring: bytes) -> str: encoding = sys.getfilesystemencoding() - encoding = "utf-8" if encoding == "ascii" else encoding - - if sys.version_info[0] >= 3: - if isinstance(text, bytes): - return text.decode(encoding) - else: - if isinstance(text, unicode): # noqa - return text.encode(encoding) - - return text + return bytestring.decode(encoding) @cached_property - def _distro_release_info(self): - # type: () -> Dict[str, str] + def _distro_release_info(self) -> Dict[str, str]: """ Get the information items from the specified distro release file. @@ -1272,6 +1259,7 @@ class LinuxDistribution(object): "manjaro-release", "oracle-release", "redhat-release", + "rocky-release", "sl-release", "slackware-version", ] @@ -1291,8 +1279,7 @@ class LinuxDistribution(object): return distro_info return {} - def _parse_distro_release_file(self, filepath): - # type: (str) -> Dict[str, str] + def _parse_distro_release_file(self, filepath: str) -> Dict[str, str]: """ Parse a distro release file. @@ -1304,19 +1291,18 @@ class LinuxDistribution(object): A dictionary containing all information items. """ try: - with open(filepath) as fp: + with open(filepath, encoding="utf-8") as fp: # Only parse the first line. For instance, on SLES there # are multiple lines. We don't want them... return self._parse_distro_release_content(fp.readline()) - except (OSError, IOError): + except OSError: # Ignore not being able to read a specific, seemingly version # related file. # See https://github.com/python-distro/distro/issues/162 return {} @staticmethod - def _parse_distro_release_content(line): - # type: (str) -> Dict[str, str] + def _parse_distro_release_content(line: str) -> Dict[str, str]: """ Parse a line from a distro release file. @@ -1344,8 +1330,7 @@ class LinuxDistribution(object): _distro = LinuxDistribution() -def main(): - # type: () -> None +def main() -> None: logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(sys.stdout)) @@ -1367,7 +1352,10 @@ def main(): if args.root_dir: dist = LinuxDistribution( - include_lsb=False, include_uname=False, root_dir=args.root_dir + include_lsb=False, + include_uname=False, + include_oslevel=False, + root_dir=args.root_dir, ) else: dist = _distro diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__init__.py deleted file mode 100644 index d1d82f1..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -HTML parsing library based on the `WHATWG HTML specification -`_. The parser is designed to be compatible with -existing HTML found in the wild and implements well-defined error recovery that -is largely compatible with modern desktop web browsers. - -Example usage:: - - from pip._vendor import html5lib - with open("my_document.html", "rb") as f: - tree = html5lib.parse(f) - -For convenience, this module re-exports the following names: - -* :func:`~.html5parser.parse` -* :func:`~.html5parser.parseFragment` -* :class:`~.html5parser.HTMLParser` -* :func:`~.treebuilders.getTreeBuilder` -* :func:`~.treewalkers.getTreeWalker` -* :func:`~.serializer.serialize` -""" - -from __future__ import absolute_import, division, unicode_literals - -from .html5parser import HTMLParser, parse, parseFragment -from .treebuilders import getTreeBuilder -from .treewalkers import getTreeWalker -from .serializer import serialize - -__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", - "getTreeWalker", "serialize"] - -# this has to be at the top level, see how setup.py parses this -#: Distribution version number. -__version__ = "1.1" diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 16c3926029da251809a4e9ef66c3ccbd9ba77ccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1303 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-310.pyc deleted file mode 100644 index 002b09656c8fdd99f64fed53b86c91f7e7cd61bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21679 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-310.pyc deleted file mode 100644 index 28ade943a4f58f3c3a0bd27a153c965ac9401738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37361 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-310.pyc deleted file mode 100644 index 5bb9750c36eff064b9d34ab336c5254f0d7d0327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4797 zcmaJ^&2t;K6$f^g`X8Ik2>2vPBHc`8XWz(7+glv?{mfk6Fg>J-r`-WWp(YA%?W44PPf!5aW-% zI4IXa`OMz$MwF|qMbNUrZ>_cXOD5`~ahHjPTsp8@&tg0!rZJwD6^x$~Gh+5GYdtTX z5p(#yAWn&Se9wy0VgcV5Md>DMp81w!+_dwVpsmxmpGiOJ_EMGQu84Lb9i>S=+fSk} z71EEROsXK(O`g}Tr=lOrTYEi;QRRBj>qW^%)5@!vyp#DE@VR~C_UmiSay}(wC+NqS zFEb@&K6_neo2j@O>0Xe9n^NU7k-phiD%}V&c_WBazNn85Z>3jodM}NVET8Y1bKeWX zELD4>53TPJ)7p>IMEaB6df+av_piS7+H1>$YJc2)?^Z~cKKipUxQwPR07%y2g0(Ec zTehePTR3-l%Mm3}hS*9Fx+|){ltl#sY$!6@pa-M88ikp+8)ci`k3HR!VHCt(Po+Jn zvPkMnwVH?D$B7puQ5FRmM0>&8mV4UEHiOIyl=R|AXZnJtWv0DUd0D>~OKoPtG}!?i zDZDH-bh;2|gz18UPQ4%urPfe_7bJTg#NeeJP?jE)*3~%F3{n+sL`e`E8g$&NakP!4 z?JWuBmCX7oA%>*aCFKygognVZg88oS-u6za@8vIFUhbsn@&#|X9jN8zC42_U`^|z) z@mn+bnfLbFG(T7_D81{AjG`d#?QTZlrWXc@*OqjDu%OcZ#-?Fqyfnx%6}4fbD~9$% z7Fv+~_*X`!f_4Q>?*MGDeQU_Cvd_+~Tl@CDld++l@yyEX%;`7>mO4AMFqr^I9d6AWyprs1BAP%W>CkeVTFBv`M4y{l#xV{1ZX9%1B0i0UH1EWr7UAM=*kD~Uv2ANlTLAV`kNWI>RdKdj2u$iihn^`x0BaYe^{eBk3 zdZo9g7IE57N$T?e4sY-|?($h~J({%}e4f|%VCkgMtc)*uOogP*5}HxrEIJvx&mnfS zE$e}OlPN+rZFL5p+}=Pyc^18gmU_-0;7x~DSLX;<_kAoQq4@qaAT*sZ%LmUtfuqU7 zwU7eB_(y$ehAZ-R7!o)-u*UrG{PZu zkl5l$Vvrd4^Zh0-wi`)Q$YMzSu$Y?f7r_zzhVOsT58}}b=!-P;eWNIK9tWrN0%6kxO$1AP%O-TPRs~_T zjL+N%yyxt}xuOXEWMY{(rwk+DhrH~>@g|faUGe?TX!3^u|3^J$;Zs>qKOz#w;ViX8ePa%< zQ}4JQa=01-x9@*WbLP+&o_yuey2rxb_}a$*##$Jef_japK0*ED@5m6c04{*uq;J_@8H*nM4ZULccN+c^4@sfT+)kB17VC&03yxgP+^P-&TWFeGw85wGs+ne4 z|D8rtG=J<~bSwn~b1xFA;B>R`Z5B~!%(FA*wqkUHMU40Pkoc~wMGWXm4J^Tv6>c$u3Odu+qaXFu*dz(q*V`~ z)qQ7By~l_4k_j$DX9S6cg)hrn@$=id$NII<>W_O z$O(;sQp75P3ngy%IT>KbLTzB(V=#m>Fbgs*PNoHOvsM{Fdh^CHf1)!ydWX88mk%N@ zg(TzL>GYHEh@>mKNMm|Z{28l^7tTY5lo$^dyRw@`19>R8(bBQVKE@VxgMd-ob?TAG z^2%uEpD;KSTUq@Yi)tY>qnO4Gf4keM(O{Gj_xROe?|VEpT5(LS4>&IaxIo!nPj)9#4i<c}AvBPEb@Wjy2CMi=1Eq@!oZ;x{LJAwGc*sPwrto Ra_m`q)^pF|b*naB_#bSzO%(tD diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-310.pyc deleted file mode 100644 index 8174feaeaa672be87597be4828f02a5d79331250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88520 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 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-310.pyc deleted file mode 100644 index 46a858ab24e169f2df6bcd0c00168b791a6a0aec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10744 zcmbVSOKc>^dG79c4~N6yWBJ&Znp|o44~8zeNQZy{qI`eVJUP@l z2#Kz){;TS*zpDQF>#P5tVsCF;!{47xjpaVRrfI*UkM_SHK3>A(ZtI%HG^XdZf}YU} zM#d-vG69`vMm|^wWkNC^$cHmw(1Q6$A)1L6Vwo7|Ar{WZ3q6^hLL!qW^k#Y`Edp9H zlPvUQ`UB1(p~9KW8RX-&VcvVFvz`$xGs45QQI_B%BO2=+ z(GK;@SQ{lNDQ9ghbB>>9eFr)VZ5f#h{37qGJ#nZV=r^@@pIDHd4L(igs<6-fvDK5NY_=F1+>+J#b4cz%@G+qP>L9Y0le>|BxYY~J>`u<~wN z_hTM^=w-d#62F@^{G{L;wu{0n7osTq(T9b6ZqpKiuM1wvTRE-@+%K@w)LUY^XtTvU zFL1|m{rG1^TJ63)R?fh`I?AcP}Fn4oSiThe5JTY}`eqr@k|NgQ5ZaGUcpc{c;C>)8#;ysDp zWM8U(U~uTn@W|-c*>mSFTztZuUH#YE=b!F>Ui;bSwU3YX_mB49JKBH$X#e17|AV9b z50CbLc(nh~(f*H)_J4e||C6Kre>mFz>}da=j^6wG-|g?eTP9Wi>f>Mi>I(yzWBqcD z=ArRNyCjC^1|D|^C7xE*Jl!+ajRQmca6{YE@fb|s3wVL5c0Y(GgeUx=F{U)`g%x8j zxEHDh#5mP@Fj|#$Mzp=K7pX;Mo3Iz7Hq|gQMzjs%K&RG+y10cJaaBW=Df(W71@;0? z(Cev&4)nc9)u<(^kwabAz}tmrq z-7U&efx}3|Xj*MQZ(3{ZJ=a*Nr938>nK8(A4PNTjC66Xju#+ zJ=R~WgfCxuIO)D92JoF8^yAQ0$Mq~H$Nhn~l*%qTq_~SxDbLht%ffQpyyex&G47NL zP-~C-;o{nTp7Z<=xL^kaxWhyW%>6#wT`Ggg25P--*}@MLY{wsU+iAmi8 z3g(BcQVAUVfh?C&;01l%%@(YZAK2j7VJLNXY;V&KZ1RVG@IKm#2n{BVz8~iNfPiwx zX#|q3>j&K}yX5P(ujl-b?J%^8HH&>Chcf<|CZ44UTE8*3@|KG&u(E_*^>F1T-(GRO zqA08hd&9zRb~m}O*Vk9vwMOo?y|&_Fk6*>!+p;#eyHc`Cv)OIPSroIIULpT{-d>vp zQ`^eh6)t8|o#(&E}l7RVNdv(I%)GjM=XP^?#3}}6c_uX1HFKC4kF&a% zf_r7*pi7!S8dYn!%(Pt7qM5`HRQ1J&R-u&VbLwkhVZmG%#e&%sKxRsofFPziiy%9` zq}1KjTkm}o1X^{fr|+ASQCT(xZUvdJw5-s<)EF4e@`mD@NS6n)TXzZcWK zjG6tOJl6bV=hFCLfj!DaI!tB(3hW1I8OXxGJYeQ=o;K86sfQm{2c)mNvLBT^M_t95 zRppkV{S_Zg>M31ZM>dD2fLU_V>A}pAR;vK^~ zj;9BCoEMp1ypwqM;YqPjrk{mb1ej)kMOh5*K^A8{cn`55*2|JWHfNCQV=3f@*%^s| z^vnoLU`G#&Z$k(_oaY->ZueN9SiY4``uz{eMc^6>=pwsq<;!GL6^Ss4KZyO7UE{8o zZ6gkJud06zM&B;L?q%zEMY5~|mLcNe3Cqr7y0d^%HY>aS1qoxoeZ447DIQReB%AlL zwj;T@es7(o(2k$N8Bok`13)#<&WM#SZCY#Gvvbfl8dY6{LEE9@D_h{6m8GG%IAl_^ z^-9^DP1toQj30F^2e_%iJ3t7TPy!-y&9{*O2+$D4fJD(7L{&|-CUS(N$eYFia);=5F-)g4;NQnR@vrqVWLH(Ak{@|u>H`V;&? z*%n;3g3_2J$gDKiToc6|Y(sO6Z(7?n1~R?6I-$xYR#($k%$-f{oW_iqYrArs1caC+ zm~2VsmTCu9R({9YbtPS8sibY3-BZ!(xvg5;bkKCpnE)H+h7GV#p9Z2z@NPo++a`r3 z3Bzq;bxMz`s~Do4+cbCVe4b83lNHNrc{N$wHOo$(<2-9lb;n%DX*Y94$FqP4as0Hm zy#j5h^Uhh|ONV=luO(WiBZ-BcS(~JC(A}H1r35XVQ?;N-^B4=de2l1WTMylHArF&o zP3$leEdii~^`4vaPrwETx5Ejy6rocclcj1iOtiNNF&!X8D{u1p-K;@Y)~H2x%UB!B z?cn5kyLtZq8Oli$*D;!Uq3Ku!$ln~4*|3Lla2;|G?zVs(9JLXOWsy^`WX4H7of-c zgNl8+RXJ&+PfS3exJ{6%VBrXW&ClBaU-nyMj&@%Hg=JfI=gvu2Q7_94J&!8nK ze*GLERRAzk+AmLrj&bAu!Ao9a`BzuL1Ui_0oW=YGMSaYvIcF|y!q>pDN$W>yYnwVjGmGn_%N;Wz@2Do#Mj^RV zTAOp47fRl4>w9MtjG^e*{-|zustkmWjy-MTCIOXJ7^!23be*6{fsWRvgzTssgu0U%8qNTbAlmdXUi$>ICLaotCw@Y z81l|jEPDX!GaceC;rcXp%Drse&XXf-rqPp_xg{y>5T#q%Z&;>obUSC>!#xHUHF!Q| z>#9;eILO>J?l+G$@25}AH^9|7EC$>p06ERAEVuj`-N7+`EsTp9M778E+&xS|9=6Ie zSpaKX&$82La|2k=aa@h?k&E%1KzOb8*l+Ro;fw?PKiY{ymdF7@MBn`3TzWl zbfkWf_5*Nr__1a9J(W`_2yVD-!Keyx3l04Us?&hPr2N9QjlTS_bd16sNv1yMrGxP0 z@cgrAbg~ZRBlw_UqsH)YHtdG36EV&nT43^l7f)BjAs%|y9 z9#H*&+Aq0lwLbDCe^Eib&!7RX2jlS7vHAenss#A@5)caRhk3shlFjO_V`}UUZUEw*IP~OB_+pmb#62=M3N+D?fx0`JX`Jc zhHE3}XY@cjG`4lneywQiduubS!Q_`I?96HMK(@X^=h*A1e;)&4h@q3z6s7{Nqdq_N?IQ% z|ALZntfh8;0$-o7WHl-0@~13;9E}4xtaw6x(=4kxRDv8@Mp;tI@k_}&$u1LbCoI1b zY)bWx8AA*~%@|e{BdO<`^hf#w?3Y%V{Em5-q%^;Ud{3fBdQal*%k`L6T+kQIYP!iY z#rjoV>fKY2&JeU0lx|2}0FVEo9gbZQKq(v)&~K#)#Ovvn?noY2B#)<*=Iy1bDQN6f zrLk!Jgls)i*V#TctLinhPjdJp$zi1>1^X5vH~rOq?=oiD5H}=`XH>t?Snd84sBfTr zT9&`zU9R>+w^L4#JxjG91?gd`IZ}*3^-FR*xW_bD^5+mwAuEhvURWUsI1O>G`H`E& z9Azqr`SF|gZY;m^`l30B*aKa_{AdZca69)Jt0c_V-+KA>Yd6e^Np}KHrCr4T3ZO^K zrFWK=7w-rV$gut$GRz_P{;Z;gnguc1?M|ZhIko*RQ{yPYh)Ja z9s{UTbnvXtnNzCO)D?4z+Tjh@IHf#3Q!?UJ3CXMIu|8i3(p44Tm!ADLMZx6Vv|^aE z$NH=vUUV1@A~Zic=`Q$@8%1Dj$Ez4uuT}=@AFZheF*ZMb_3EU1_38q(r3jT6A)!ar z2j*OQ(F86=8xFjN4BaE@mQKraUu0;N@6mLhYarB9+>m0Es@}Mj%S4# zBlS3$AYZG5n-V$-iUEt)DESU0y_DRcB#9(Fpnz4J9Q(?5uYgw+o?{spmviigWN<>* zXyQkh+R3VqEh6bzKSqs!9Q-EfQ(T?lFr07yQ8tYjSEKT+r&Au;yD zMv#yvqIq#W9Hf|DI3QEKmBx)I==e4U@TUI({G&eb-!Q0284Vl;Wk4S`sCEk25T&4u zqD~NP6OtPII%Nd^ClNS{(gbSJgGeIE5}+We2s|9dLoJhNgLYKQ2<}tQL`gzciaSzm z>QD6+*U>xZRFagkkyNQb@E4WQ6Ogf~PaSZPpd-OWvU~0f5`e>Arq>Y4hdDL~62j{Z zXtIQ#wX~>*@ShV6;Yi2m3P%D)QwUPt7U??NT76hC<-w6ayXD1@*U?tBR!~kU4Y_@q z@}FoW0W(m$YNHT5+y*%rLZXJaGq*MA2>Ug8s@Q0&T4%VAZm3-`yhh+ohWV~ggmJkU z>T2GNyIQqHDjN(s*Qujvd(6%}H3TT*f2YL$8Y0){?^>sP(^E1eU5^ts>NaOXps!A; zrn~Rn?eW5H4l^pYH?8{b2tKA&jFH-WbDXhzT&>0V5^AccA5a9uH1d8hk00{L9i9$I ziz9wYRp^d)(hSUjwu5W7OCiGG(6Bz#eU($PACJEM_S@#-n{VEG)4a2|v~>NIMf2|B z;?2dIU6(xCMREt7MFvo(9?X}p#}GYU0C6V3m(TRO2#w0a=MpN)tDv7;Y6Ll@p-rp1 zsI+4zW&Z$;9+B(>ff5E8n&8)!3!O{V(lB*!e2ThhUHlcjMtxky$%tmNemt8k6j?b> z`9u~6fR$Gz>d+vEg0k>*RH@^oW#;7}K*x`=^>jwc^Hd&$^3W4YL|dgKM~OVYu2YUy zK+sUyh9_^q6v&maP&#*|F^X!z0LG}-)5crTU|^$>=sVF!Jfi&|9#4+Rw$xe2ALdJY z36D!Zis=mXlKm2Y4Ki>8{n~~wR&x_5lRyjhH>e^0mXg0i;zzPs98uZqsp1p2zig-% z#E0;*2Q2FgD7u?|nkIg|jNcw$;stD{CIXZMk@$W1>B>y~rzqvJVc3>ic6SWV)n tj_ZaV{yG>ZCsWEWbmMDKzBc4xD{G^Lu^$b@FUA9@3)&B~9}Io#e*tct-g^K5 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py deleted file mode 100644 index 3ff803c..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py +++ /dev/null @@ -1,289 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re -import warnings - -from .constants import DataLossWarning - -baseChar = """ -[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | -[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | -[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | -[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | -[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | -[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | -[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | -[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | -[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | -[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | -[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | -[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | -[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | -[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | -[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | -[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | -[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | -[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | -[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | -[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | -[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | -[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | -[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | -[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | -[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | -[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | -[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | -[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | -[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | -[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | -#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | -#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | -#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | -[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | -[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | -#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | -[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | -[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | -[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | -[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | -[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | -#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | -[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | -[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | -[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | -[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" - -ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" - -combiningCharacter = """ -[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | -[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | -[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | -[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | -#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | -[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | -[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | -#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | -[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | -[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | -#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | -[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | -[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | -[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | -[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | -[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | -#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | -[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | -#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | -[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | -[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | -#x3099 | #x309A""" - -digit = """ -[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | -[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | -[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | -[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" - -extender = """ -#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | -#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" - -letter = " | ".join([baseChar, ideographic]) - -# Without the -name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, - extender]) -nameFirst = " | ".join([letter, "_"]) - -reChar = re.compile(r"#x([\d|A-F]{4,4})") -reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") - - -def charStringToList(chars): - charRanges = [item.strip() for item in chars.split(" | ")] - rv = [] - for item in charRanges: - foundMatch = False - for regexp in (reChar, reCharRange): - match = regexp.match(item) - if match is not None: - rv.append([hexToInt(item) for item in match.groups()]) - if len(rv[-1]) == 1: - rv[-1] = rv[-1] * 2 - foundMatch = True - break - if not foundMatch: - assert len(item) == 1 - - rv.append([ord(item)] * 2) - rv = normaliseCharList(rv) - return rv - - -def normaliseCharList(charList): - charList = sorted(charList) - for item in charList: - assert item[1] >= item[0] - rv = [] - i = 0 - while i < len(charList): - j = 1 - rv.append(charList[i]) - while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: - rv[-1][1] = charList[i + j][1] - j += 1 - i += j - return rv - - -# We don't really support characters above the BMP :( -max_unicode = int("FFFF", 16) - - -def missingRanges(charList): - rv = [] - if charList[0] != 0: - rv.append([0, charList[0][0] - 1]) - for i, item in enumerate(charList[:-1]): - rv.append([item[1] + 1, charList[i + 1][0] - 1]) - if charList[-1][1] != max_unicode: - rv.append([charList[-1][1] + 1, max_unicode]) - return rv - - -def listToRegexpStr(charList): - rv = [] - for item in charList: - if item[0] == item[1]: - rv.append(escapeRegexp(chr(item[0]))) - else: - rv.append(escapeRegexp(chr(item[0])) + "-" + - escapeRegexp(chr(item[1]))) - return "[%s]" % "".join(rv) - - -def hexToInt(hex_str): - return int(hex_str, 16) - - -def escapeRegexp(string): - specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", - "[", "]", "|", "(", ")", "-") - for char in specialCharacters: - string = string.replace(char, "\\" + char) - - return string - -# output from the above -nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa - -nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa - -# Simpler things -nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") - - -class InfosetFilter(object): - replacementRegexp = re.compile(r"U[\dA-F]{5,5}") - - def __init__(self, - dropXmlnsLocalName=False, - dropXmlnsAttrNs=False, - preventDoubleDashComments=False, - preventDashAtCommentEnd=False, - replaceFormFeedCharacters=True, - preventSingleQuotePubid=False): - - self.dropXmlnsLocalName = dropXmlnsLocalName - self.dropXmlnsAttrNs = dropXmlnsAttrNs - - self.preventDoubleDashComments = preventDoubleDashComments - self.preventDashAtCommentEnd = preventDashAtCommentEnd - - self.replaceFormFeedCharacters = replaceFormFeedCharacters - - self.preventSingleQuotePubid = preventSingleQuotePubid - - self.replaceCache = {} - - def coerceAttribute(self, name, namespace=None): - if self.dropXmlnsLocalName and name.startswith("xmlns:"): - warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) - return None - elif (self.dropXmlnsAttrNs and - namespace == "http://www.w3.org/2000/xmlns/"): - warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) - return None - else: - return self.toXmlName(name) - - def coerceElement(self, name): - return self.toXmlName(name) - - def coerceComment(self, data): - if self.preventDoubleDashComments: - while "--" in data: - warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) - data = data.replace("--", "- -") - if data.endswith("-"): - warnings.warn("Comments cannot end in a dash", DataLossWarning) - data += " " - return data - - def coerceCharacters(self, data): - if self.replaceFormFeedCharacters: - for _ in range(data.count("\x0C")): - warnings.warn("Text cannot contain U+000C", DataLossWarning) - data = data.replace("\x0C", " ") - # Other non-xml characters - return data - - def coercePubid(self, data): - dataOutput = data - for char in nonPubidCharRegexp.findall(data): - warnings.warn("Coercing non-XML pubid", DataLossWarning) - replacement = self.getReplacementCharacter(char) - dataOutput = dataOutput.replace(char, replacement) - if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: - warnings.warn("Pubid cannot contain single quote", DataLossWarning) - dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) - return dataOutput - - def toXmlName(self, name): - nameFirst = name[0] - nameRest = name[1:] - m = nonXmlNameFirstBMPRegexp.match(nameFirst) - if m: - warnings.warn("Coercing non-XML name: %s" % name, DataLossWarning) - nameFirstOutput = self.getReplacementCharacter(nameFirst) - else: - nameFirstOutput = nameFirst - - nameRestOutput = nameRest - replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) - for char in replaceChars: - warnings.warn("Coercing non-XML name: %s" % name, DataLossWarning) - replacement = self.getReplacementCharacter(char) - nameRestOutput = nameRestOutput.replace(char, replacement) - return nameFirstOutput + nameRestOutput - - def getReplacementCharacter(self, char): - if char in self.replaceCache: - replacement = self.replaceCache[char] - else: - replacement = self.escapeChar(char) - return replacement - - def fromXmlName(self, name): - for item in set(self.replacementRegexp.findall(name)): - name = name.replace(item, self.unescapeChar(item)) - return name - - def escapeChar(self, char): - replacement = "U%05X" % ord(char) - self.replaceCache[char] = replacement - return replacement - - def unescapeChar(self, charcode): - return chr(int(charcode[1:], 16)) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py deleted file mode 100644 index e0bb376..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py +++ /dev/null @@ -1,918 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import text_type -from pip._vendor.six.moves import http_client, urllib - -import codecs -import re -from io import BytesIO, StringIO - -from pip._vendor import webencodings - -from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase -from .constants import _ReparseException -from . import _utils - -# Non-unicode versions of constants for use in the pre-parser -spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) -asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) -asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) -spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) - - -invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa - -if _utils.supports_lone_surrogates: - # Use one extra step of indirection and create surrogates with - # eval. Not using this indirection would introduce an illegal - # unicode literal on platforms not supporting such lone - # surrogates. - assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 - invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + - eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used - "]") -else: - invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) - -non_bmp_invalid_codepoints = {0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, - 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, - 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, - 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, - 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, - 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, - 0x10FFFE, 0x10FFFF} - -ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") - -# Cache for charsUntil() -charsUntilRegEx = {} - - -class BufferedStream(object): - """Buffering for streams that do not have buffering of their own - - The buffer is implemented as a list of chunks on the assumption that - joining many strings will be slow since it is O(n**2) - """ - - def __init__(self, stream): - self.stream = stream - self.buffer = [] - self.position = [-1, 0] # chunk number, offset - - def tell(self): - pos = 0 - for chunk in self.buffer[:self.position[0]]: - pos += len(chunk) - pos += self.position[1] - return pos - - def seek(self, pos): - assert pos <= self._bufferedBytes() - offset = pos - i = 0 - while len(self.buffer[i]) < offset: - offset -= len(self.buffer[i]) - i += 1 - self.position = [i, offset] - - def read(self, bytes): - if not self.buffer: - return self._readStream(bytes) - elif (self.position[0] == len(self.buffer) and - self.position[1] == len(self.buffer[-1])): - return self._readStream(bytes) - else: - return self._readFromBuffer(bytes) - - def _bufferedBytes(self): - return sum([len(item) for item in self.buffer]) - - def _readStream(self, bytes): - data = self.stream.read(bytes) - self.buffer.append(data) - self.position[0] += 1 - self.position[1] = len(data) - return data - - def _readFromBuffer(self, bytes): - remainingBytes = bytes - rv = [] - bufferIndex = self.position[0] - bufferOffset = self.position[1] - while bufferIndex < len(self.buffer) and remainingBytes != 0: - assert remainingBytes > 0 - bufferedData = self.buffer[bufferIndex] - - if remainingBytes <= len(bufferedData) - bufferOffset: - bytesToRead = remainingBytes - self.position = [bufferIndex, bufferOffset + bytesToRead] - else: - bytesToRead = len(bufferedData) - bufferOffset - self.position = [bufferIndex, len(bufferedData)] - bufferIndex += 1 - rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) - remainingBytes -= bytesToRead - - bufferOffset = 0 - - if remainingBytes: - rv.append(self._readStream(remainingBytes)) - - return b"".join(rv) - - -def HTMLInputStream(source, **kwargs): - # Work around Python bug #20007: read(0) closes the connection. - # http://bugs.python.org/issue20007 - if (isinstance(source, http_client.HTTPResponse) or - # Also check for addinfourl wrapping HTTPResponse - (isinstance(source, urllib.response.addbase) and - isinstance(source.fp, http_client.HTTPResponse))): - isUnicode = False - elif hasattr(source, "read"): - isUnicode = isinstance(source.read(0), text_type) - else: - isUnicode = isinstance(source, text_type) - - if isUnicode: - encodings = [x for x in kwargs if x.endswith("_encoding")] - if encodings: - raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) - - return HTMLUnicodeInputStream(source, **kwargs) - else: - return HTMLBinaryInputStream(source, **kwargs) - - -class HTMLUnicodeInputStream(object): - """Provides a unicode stream of characters to the HTMLTokenizer. - - This class takes care of character encoding and removing or replacing - incorrect byte-sequences and also provides column and line tracking. - - """ - - _defaultChunkSize = 10240 - - def __init__(self, source): - """Initialises the HTMLInputStream. - - HTMLInputStream(source, [encoding]) -> Normalized stream from source - for use by html5lib. - - source can be either a file-object, local filename or a string. - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - """ - - if not _utils.supports_lone_surrogates: - # Such platforms will have already checked for such - # surrogate errors, so no need to do this checking. - self.reportCharacterErrors = None - elif len("\U0010FFFF") == 1: - self.reportCharacterErrors = self.characterErrorsUCS4 - else: - self.reportCharacterErrors = self.characterErrorsUCS2 - - # List of where new lines occur - self.newLines = [0] - - self.charEncoding = (lookupEncoding("utf-8"), "certain") - self.dataStream = self.openStream(source) - - self.reset() - - def reset(self): - self.chunk = "" - self.chunkSize = 0 - self.chunkOffset = 0 - self.errors = [] - - # number of (complete) lines in previous chunks - self.prevNumLines = 0 - # number of columns in the last line of the previous chunk - self.prevNumCols = 0 - - # Deal with CR LF and surrogates split over chunk boundaries - self._bufferedCharacter = None - - def openStream(self, source): - """Produces a file object from source. - - source can be either a file object, local filename or a string. - - """ - # Already a file object - if hasattr(source, 'read'): - stream = source - else: - stream = StringIO(source) - - return stream - - def _position(self, offset): - chunk = self.chunk - nLines = chunk.count('\n', 0, offset) - positionLine = self.prevNumLines + nLines - lastLinePos = chunk.rfind('\n', 0, offset) - if lastLinePos == -1: - positionColumn = self.prevNumCols + offset - else: - positionColumn = offset - (lastLinePos + 1) - return (positionLine, positionColumn) - - def position(self): - """Returns (line, col) of the current position in the stream.""" - line, col = self._position(self.chunkOffset) - return (line + 1, col) - - def char(self): - """ Read one character from the stream or queue if available. Return - EOF when EOF is reached. - """ - # Read a new chunk from the input stream if necessary - if self.chunkOffset >= self.chunkSize: - if not self.readChunk(): - return EOF - - chunkOffset = self.chunkOffset - char = self.chunk[chunkOffset] - self.chunkOffset = chunkOffset + 1 - - return char - - def readChunk(self, chunkSize=None): - if chunkSize is None: - chunkSize = self._defaultChunkSize - - self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) - - self.chunk = "" - self.chunkSize = 0 - self.chunkOffset = 0 - - data = self.dataStream.read(chunkSize) - - # Deal with CR LF and surrogates broken across chunks - if self._bufferedCharacter: - data = self._bufferedCharacter + data - self._bufferedCharacter = None - elif not data: - # We have no more data, bye-bye stream - return False - - if len(data) > 1: - lastv = ord(data[-1]) - if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: - self._bufferedCharacter = data[-1] - data = data[:-1] - - if self.reportCharacterErrors: - self.reportCharacterErrors(data) - - # Replace invalid characters - data = data.replace("\r\n", "\n") - data = data.replace("\r", "\n") - - self.chunk = data - self.chunkSize = len(data) - - return True - - def characterErrorsUCS4(self, data): - for _ in range(len(invalid_unicode_re.findall(data))): - self.errors.append("invalid-codepoint") - - def characterErrorsUCS2(self, data): - # Someone picked the wrong compile option - # You lose - skip = False - for match in invalid_unicode_re.finditer(data): - if skip: - continue - codepoint = ord(match.group()) - pos = match.start() - # Pretty sure there should be endianness issues here - if _utils.isSurrogatePair(data[pos:pos + 2]): - # We have a surrogate pair! - char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) - if char_val in non_bmp_invalid_codepoints: - self.errors.append("invalid-codepoint") - skip = True - elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and - pos == len(data) - 1): - self.errors.append("invalid-codepoint") - else: - skip = False - self.errors.append("invalid-codepoint") - - def charsUntil(self, characters, opposite=False): - """ Returns a string of characters from the stream up to but not - including any character in 'characters' or EOF. 'characters' must be - a container that supports the 'in' method and iteration over its - characters. - """ - - # Use a cache of regexps to find the required characters - try: - chars = charsUntilRegEx[(characters, opposite)] - except KeyError: - if __debug__: - for c in characters: - assert(ord(c) < 128) - regex = "".join(["\\x%02x" % ord(c) for c in characters]) - if not opposite: - regex = "^%s" % regex - chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) - - rv = [] - - while True: - # Find the longest matching prefix - m = chars.match(self.chunk, self.chunkOffset) - if m is None: - # If nothing matched, and it wasn't because we ran out of chunk, - # then stop - if self.chunkOffset != self.chunkSize: - break - else: - end = m.end() - # If not the whole chunk matched, return everything - # up to the part that didn't match - if end != self.chunkSize: - rv.append(self.chunk[self.chunkOffset:end]) - self.chunkOffset = end - break - # If the whole remainder of the chunk matched, - # use it all and read the next chunk - rv.append(self.chunk[self.chunkOffset:]) - if not self.readChunk(): - # Reached EOF - break - - r = "".join(rv) - return r - - def unget(self, char): - # Only one character is allowed to be ungotten at once - it must - # be consumed again before any further call to unget - if char is not EOF: - if self.chunkOffset == 0: - # unget is called quite rarely, so it's a good idea to do - # more work here if it saves a bit of work in the frequently - # called char and charsUntil. - # So, just prepend the ungotten character onto the current - # chunk: - self.chunk = char + self.chunk - self.chunkSize += 1 - else: - self.chunkOffset -= 1 - assert self.chunk[self.chunkOffset] == char - - -class HTMLBinaryInputStream(HTMLUnicodeInputStream): - """Provides a unicode stream of characters to the HTMLTokenizer. - - This class takes care of character encoding and removing or replacing - incorrect byte-sequences and also provides column and line tracking. - - """ - - def __init__(self, source, override_encoding=None, transport_encoding=None, - same_origin_parent_encoding=None, likely_encoding=None, - default_encoding="windows-1252", useChardet=True): - """Initialises the HTMLInputStream. - - HTMLInputStream(source, [encoding]) -> Normalized stream from source - for use by html5lib. - - source can be either a file-object, local filename or a string. - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - """ - # Raw Stream - for unicode objects this will encode to utf-8 and set - # self.charEncoding as appropriate - self.rawStream = self.openStream(source) - - HTMLUnicodeInputStream.__init__(self, self.rawStream) - - # Encoding Information - # Number of bytes to use when looking for a meta element with - # encoding information - self.numBytesMeta = 1024 - # Number of bytes to use when using detecting encoding using chardet - self.numBytesChardet = 100 - # Things from args - self.override_encoding = override_encoding - self.transport_encoding = transport_encoding - self.same_origin_parent_encoding = same_origin_parent_encoding - self.likely_encoding = likely_encoding - self.default_encoding = default_encoding - - # Determine encoding - self.charEncoding = self.determineEncoding(useChardet) - assert self.charEncoding[0] is not None - - # Call superclass - self.reset() - - def reset(self): - self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') - HTMLUnicodeInputStream.reset(self) - - def openStream(self, source): - """Produces a file object from source. - - source can be either a file object, local filename or a string. - - """ - # Already a file object - if hasattr(source, 'read'): - stream = source - else: - stream = BytesIO(source) - - try: - stream.seek(stream.tell()) - except Exception: - stream = BufferedStream(stream) - - return stream - - def determineEncoding(self, chardet=True): - # BOMs take precedence over everything - # This will also read past the BOM if present - charEncoding = self.detectBOM(), "certain" - if charEncoding[0] is not None: - return charEncoding - - # If we've been overridden, we've been overridden - charEncoding = lookupEncoding(self.override_encoding), "certain" - if charEncoding[0] is not None: - return charEncoding - - # Now check the transport layer - charEncoding = lookupEncoding(self.transport_encoding), "certain" - if charEncoding[0] is not None: - return charEncoding - - # Look for meta elements with encoding information - charEncoding = self.detectEncodingMeta(), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Parent document encoding - charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" - if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): - return charEncoding - - # "likely" encoding - charEncoding = lookupEncoding(self.likely_encoding), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Guess with chardet, if available - if chardet: - try: - from pip._vendor.chardet.universaldetector import UniversalDetector - except ImportError: - pass - else: - buffers = [] - detector = UniversalDetector() - while not detector.done: - buffer = self.rawStream.read(self.numBytesChardet) - assert isinstance(buffer, bytes) - if not buffer: - break - buffers.append(buffer) - detector.feed(buffer) - detector.close() - encoding = lookupEncoding(detector.result['encoding']) - self.rawStream.seek(0) - if encoding is not None: - return encoding, "tentative" - - # Try the default encoding - charEncoding = lookupEncoding(self.default_encoding), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Fallback to html5lib's default if even that hasn't worked - return lookupEncoding("windows-1252"), "tentative" - - def changeEncoding(self, newEncoding): - assert self.charEncoding[1] != "certain" - newEncoding = lookupEncoding(newEncoding) - if newEncoding is None: - return - if newEncoding.name in ("utf-16be", "utf-16le"): - newEncoding = lookupEncoding("utf-8") - assert newEncoding is not None - elif newEncoding == self.charEncoding[0]: - self.charEncoding = (self.charEncoding[0], "certain") - else: - self.rawStream.seek(0) - self.charEncoding = (newEncoding, "certain") - self.reset() - raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) - - def detectBOM(self): - """Attempts to detect at BOM at the start of the stream. If - an encoding can be determined from the BOM return the name of the - encoding otherwise return None""" - bomDict = { - codecs.BOM_UTF8: 'utf-8', - codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', - codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' - } - - # Go to beginning of file and read in 4 bytes - string = self.rawStream.read(4) - assert isinstance(string, bytes) - - # Try detecting the BOM using bytes from the string - encoding = bomDict.get(string[:3]) # UTF-8 - seek = 3 - if not encoding: - # Need to detect UTF-32 before UTF-16 - encoding = bomDict.get(string) # UTF-32 - seek = 4 - if not encoding: - encoding = bomDict.get(string[:2]) # UTF-16 - seek = 2 - - # Set the read position past the BOM if one was found, otherwise - # set it to the start of the stream - if encoding: - self.rawStream.seek(seek) - return lookupEncoding(encoding) - else: - self.rawStream.seek(0) - return None - - def detectEncodingMeta(self): - """Report the encoding declared by the meta element - """ - buffer = self.rawStream.read(self.numBytesMeta) - assert isinstance(buffer, bytes) - parser = EncodingParser(buffer) - self.rawStream.seek(0) - encoding = parser.getEncoding() - - if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): - encoding = lookupEncoding("utf-8") - - return encoding - - -class EncodingBytes(bytes): - """String-like object with an associated position and various extra methods - If the position is ever greater than the string length then an exception is - raised""" - def __new__(self, value): - assert isinstance(value, bytes) - return bytes.__new__(self, value.lower()) - - def __init__(self, value): - # pylint:disable=unused-argument - self._position = -1 - - def __iter__(self): - return self - - def __next__(self): - p = self._position = self._position + 1 - if p >= len(self): - raise StopIteration - elif p < 0: - raise TypeError - return self[p:p + 1] - - def next(self): - # Py2 compat - return self.__next__() - - def previous(self): - p = self._position - if p >= len(self): - raise StopIteration - elif p < 0: - raise TypeError - self._position = p = p - 1 - return self[p:p + 1] - - def setPosition(self, position): - if self._position >= len(self): - raise StopIteration - self._position = position - - def getPosition(self): - if self._position >= len(self): - raise StopIteration - if self._position >= 0: - return self._position - else: - return None - - position = property(getPosition, setPosition) - - def getCurrentByte(self): - return self[self.position:self.position + 1] - - currentByte = property(getCurrentByte) - - def skip(self, chars=spaceCharactersBytes): - """Skip past a list of characters""" - p = self.position # use property for the error-checking - while p < len(self): - c = self[p:p + 1] - if c not in chars: - self._position = p - return c - p += 1 - self._position = p - return None - - def skipUntil(self, chars): - p = self.position - while p < len(self): - c = self[p:p + 1] - if c in chars: - self._position = p - return c - p += 1 - self._position = p - return None - - def matchBytes(self, bytes): - """Look for a sequence of bytes at the start of a string. If the bytes - are found return True and advance the position to the byte after the - match. Otherwise return False and leave the position alone""" - rv = self.startswith(bytes, self.position) - if rv: - self.position += len(bytes) - return rv - - def jumpTo(self, bytes): - """Look for the next sequence of bytes matching a given sequence. If - a match is found advance the position to the last byte of the match""" - try: - self._position = self.index(bytes, self.position) + len(bytes) - 1 - except ValueError: - raise StopIteration - return True - - -class EncodingParser(object): - """Mini parser for detecting character encoding from meta elements""" - - def __init__(self, data): - """string - the data to work on for encoding detection""" - self.data = EncodingBytes(data) - self.encoding = None - - def getEncoding(self): - if b"") - - def handleMeta(self): - if self.data.currentByte not in spaceCharactersBytes: - # if we have ") - - def getAttribute(self): - """Return a name,value pair for the next attribute in the stream, - if one is found, or None""" - data = self.data - # Step 1 (skip chars) - c = data.skip(spaceCharactersBytes | frozenset([b"/"])) - assert c is None or len(c) == 1 - # Step 2 - if c in (b">", None): - return None - # Step 3 - attrName = [] - attrValue = [] - # Step 4 attribute name - while True: - if c == b"=" and attrName: - break - elif c in spaceCharactersBytes: - # Step 6! - c = data.skip() - break - elif c in (b"/", b">"): - return b"".join(attrName), b"" - elif c in asciiUppercaseBytes: - attrName.append(c.lower()) - elif c is None: - return None - else: - attrName.append(c) - # Step 5 - c = next(data) - # Step 7 - if c != b"=": - data.previous() - return b"".join(attrName), b"" - # Step 8 - next(data) - # Step 9 - c = data.skip() - # Step 10 - if c in (b"'", b'"'): - # 10.1 - quoteChar = c - while True: - # 10.2 - c = next(data) - # 10.3 - if c == quoteChar: - next(data) - return b"".join(attrName), b"".join(attrValue) - # 10.4 - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - # 10.5 - else: - attrValue.append(c) - elif c == b">": - return b"".join(attrName), b"" - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - elif c is None: - return None - else: - attrValue.append(c) - # Step 11 - while True: - c = next(data) - if c in spacesAngleBrackets: - return b"".join(attrName), b"".join(attrValue) - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - elif c is None: - return None - else: - attrValue.append(c) - - -class ContentAttrParser(object): - def __init__(self, data): - assert isinstance(data, bytes) - self.data = data - - def parse(self): - try: - # Check if the attr name is charset - # otherwise return - self.data.jumpTo(b"charset") - self.data.position += 1 - self.data.skip() - if not self.data.currentByte == b"=": - # If there is no = sign keep looking for attrs - return None - self.data.position += 1 - self.data.skip() - # Look for an encoding between matching quote marks - if self.data.currentByte in (b'"', b"'"): - quoteMark = self.data.currentByte - self.data.position += 1 - oldPosition = self.data.position - if self.data.jumpTo(quoteMark): - return self.data[oldPosition:self.data.position] - else: - return None - else: - # Unquoted value - oldPosition = self.data.position - try: - self.data.skipUntil(spaceCharactersBytes) - return self.data[oldPosition:self.data.position] - except StopIteration: - # Return the whole remaining value - return self.data[oldPosition:] - except StopIteration: - return None - - -def lookupEncoding(encoding): - """Return the python codec name corresponding to an encoding or None if the - string doesn't correspond to a valid encoding.""" - if isinstance(encoding, bytes): - try: - encoding = encoding.decode("ascii") - except UnicodeDecodeError: - return None - - if encoding is not None: - try: - return webencodings.lookup(encoding) - except AttributeError: - return None - else: - return None diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py deleted file mode 100644 index 5f00253..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py +++ /dev/null @@ -1,1735 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import unichr as chr - -from collections import deque, OrderedDict -from sys import version_info - -from .constants import spaceCharacters -from .constants import entities -from .constants import asciiLetters, asciiUpper2Lower -from .constants import digits, hexDigits, EOF -from .constants import tokenTypes, tagTokenTypes -from .constants import replacementCharacters - -from ._inputstream import HTMLInputStream - -from ._trie import Trie - -entitiesTrie = Trie(entities) - -if version_info >= (3, 7): - attributeMap = dict -else: - attributeMap = OrderedDict - - -class HTMLTokenizer(object): - """ This class takes care of tokenizing HTML. - - * self.currentToken - Holds the token that is currently being processed. - - * self.state - Holds a reference to the method to be invoked... XXX - - * self.stream - Points to HTMLInputStream object. - """ - - def __init__(self, stream, parser=None, **kwargs): - - self.stream = HTMLInputStream(stream, **kwargs) - self.parser = parser - - # Setup the initial tokenizer state - self.escapeFlag = False - self.lastFourChars = [] - self.state = self.dataState - self.escape = False - - # The current token being created - self.currentToken = None - super(HTMLTokenizer, self).__init__() - - def __iter__(self): - """ This is where the magic happens. - - We do our usually processing through the states and when we have a token - to return we yield the token which pauses processing until the next token - is requested. - """ - self.tokenQueue = deque([]) - # Start processing. When EOF is reached self.state will return False - # instead of True and the loop will terminate. - while self.state(): - while self.stream.errors: - yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} - while self.tokenQueue: - yield self.tokenQueue.popleft() - - def consumeNumberEntity(self, isHex): - """This function returns either U+FFFD or the character based on the - decimal or hexadecimal representation. It also discards ";" if present. - If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. - """ - - allowed = digits - radix = 10 - if isHex: - allowed = hexDigits - radix = 16 - - charStack = [] - - # Consume all the characters that are in range while making sure we - # don't hit an EOF. - c = self.stream.char() - while c in allowed and c is not EOF: - charStack.append(c) - c = self.stream.char() - - # Convert the set of characters consumed to an int. - charAsInt = int("".join(charStack), radix) - - # Certain characters get replaced with others - if charAsInt in replacementCharacters: - char = replacementCharacters[charAsInt] - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - elif ((0xD800 <= charAsInt <= 0xDFFF) or - (charAsInt > 0x10FFFF)): - char = "\uFFFD" - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - else: - # Should speed up this check somehow (e.g. move the set to a constant) - if ((0x0001 <= charAsInt <= 0x0008) or - (0x000E <= charAsInt <= 0x001F) or - (0x007F <= charAsInt <= 0x009F) or - (0xFDD0 <= charAsInt <= 0xFDEF) or - charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, - 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, - 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, - 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, - 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, - 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, - 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, - 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, - 0xFFFFF, 0x10FFFE, 0x10FFFF])): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - try: - # Try/except needed as UCS-2 Python builds' unichar only works - # within the BMP. - char = chr(charAsInt) - except ValueError: - v = charAsInt - 0x10000 - char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) - - # Discard the ; if present. Otherwise, put it back on the queue and - # invoke parseError on parser. - if c != ";": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "numeric-entity-without-semicolon"}) - self.stream.unget(c) - - return char - - def consumeEntity(self, allowedChar=None, fromAttribute=False): - # Initialise to the default output for when no entity is matched - output = "&" - - charStack = [self.stream.char()] - if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or - (allowedChar is not None and allowedChar == charStack[0])): - self.stream.unget(charStack[0]) - - elif charStack[0] == "#": - # Read the next character to see if it's hex or decimal - hex = False - charStack.append(self.stream.char()) - if charStack[-1] in ("x", "X"): - hex = True - charStack.append(self.stream.char()) - - # charStack[-1] should be the first digit - if (hex and charStack[-1] in hexDigits) \ - or (not hex and charStack[-1] in digits): - # At least one digit found, so consume the whole number - self.stream.unget(charStack[-1]) - output = self.consumeNumberEntity(hex) - else: - # No digits found - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "expected-numeric-entity"}) - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - - else: - # At this point in the process might have named entity. Entities - # are stored in the global variable "entities". - # - # Consume characters and compare to these to a substring of the - # entity names in the list until the substring no longer matches. - while (charStack[-1] is not EOF): - if not entitiesTrie.has_keys_with_prefix("".join(charStack)): - break - charStack.append(self.stream.char()) - - # At this point we have a string that starts with some characters - # that may match an entity - # Try to find the longest entity the string will match to take care - # of ¬i for instance. - try: - entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) - entityLength = len(entityName) - except KeyError: - entityName = None - - if entityName is not None: - if entityName[-1] != ";": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "named-entity-without-semicolon"}) - if (entityName[-1] != ";" and fromAttribute and - (charStack[entityLength] in asciiLetters or - charStack[entityLength] in digits or - charStack[entityLength] == "=")): - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - else: - output = entities[entityName] - self.stream.unget(charStack.pop()) - output += "".join(charStack[entityLength:]) - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-named-entity"}) - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - - if fromAttribute: - self.currentToken["data"][-1][1] += output - else: - if output in spaceCharacters: - tokenType = "SpaceCharacters" - else: - tokenType = "Characters" - self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) - - def processEntityInAttribute(self, allowedChar): - """This method replaces the need for "entityInAttributeValueState". - """ - self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) - - def emitCurrentToken(self): - """This method is a generic handler for emitting the tags. It also sets - the state to "data" because that's what's needed after a token has been - emitted. - """ - token = self.currentToken - # Add token to the queue to be yielded - if (token["type"] in tagTokenTypes): - token["name"] = token["name"].translate(asciiUpper2Lower) - if token["type"] == tokenTypes["StartTag"]: - raw = token["data"] - data = attributeMap(raw) - if len(raw) > len(data): - # we had some duplicated attribute, fix so first wins - data.update(raw[::-1]) - token["data"] = data - - if token["type"] == tokenTypes["EndTag"]: - if token["data"]: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "attributes-in-end-tag"}) - if token["selfClosing"]: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "self-closing-flag-on-end-tag"}) - self.tokenQueue.append(token) - self.state = self.dataState - - # Below are the various tokenizer states worked out. - def dataState(self): - data = self.stream.char() - if data == "&": - self.state = self.entityDataState - elif data == "<": - self.state = self.tagOpenState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\u0000"}) - elif data is EOF: - # Tokenization ends. - return False - elif data in spaceCharacters: - # Directly after emitting a token you switch back to the "data - # state". At that point spaceCharacters are important so they are - # emitted separately. - self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": - data + self.stream.charsUntil(spaceCharacters, True)}) - # No need to update lastFourChars here, since the first space will - # have already been appended to lastFourChars and will have broken - # any sequences - else: - chars = self.stream.charsUntil(("&", "<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def entityDataState(self): - self.consumeEntity() - self.state = self.dataState - return True - - def rcdataState(self): - data = self.stream.char() - if data == "&": - self.state = self.characterReferenceInRcdata - elif data == "<": - self.state = self.rcdataLessThanSignState - elif data == EOF: - # Tokenization ends. - return False - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data in spaceCharacters: - # Directly after emitting a token you switch back to the "data - # state". At that point spaceCharacters are important so they are - # emitted separately. - self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": - data + self.stream.charsUntil(spaceCharacters, True)}) - # No need to update lastFourChars here, since the first space will - # have already been appended to lastFourChars and will have broken - # any sequences - else: - chars = self.stream.charsUntil(("&", "<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def characterReferenceInRcdata(self): - self.consumeEntity() - self.state = self.rcdataState - return True - - def rawtextState(self): - data = self.stream.char() - if data == "<": - self.state = self.rawtextLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - # Tokenization ends. - return False - else: - chars = self.stream.charsUntil(("<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def scriptDataState(self): - data = self.stream.char() - if data == "<": - self.state = self.scriptDataLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - # Tokenization ends. - return False - else: - chars = self.stream.charsUntil(("<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def plaintextState(self): - data = self.stream.char() - if data == EOF: - # Tokenization ends. - return False - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + self.stream.charsUntil("\u0000")}) - return True - - def tagOpenState(self): - data = self.stream.char() - if data == "!": - self.state = self.markupDeclarationOpenState - elif data == "/": - self.state = self.closeTagOpenState - elif data in asciiLetters: - self.currentToken = {"type": tokenTypes["StartTag"], - "name": data, "data": [], - "selfClosing": False, - "selfClosingAcknowledged": False} - self.state = self.tagNameState - elif data == ">": - # XXX In theory it could be something besides a tag name. But - # do we really care? - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name-but-got-right-bracket"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) - self.state = self.dataState - elif data == "?": - # XXX In theory it could be something besides a tag name. But - # do we really care? - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name-but-got-question-mark"}) - self.stream.unget(data) - self.state = self.bogusCommentState - else: - # XXX - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.dataState - return True - - def closeTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.currentToken = {"type": tokenTypes["EndTag"], "name": data, - "data": [], "selfClosing": False} - self.state = self.tagNameState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-right-bracket"}) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-eof"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "": - self.emitCurrentToken() - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-tag-name"}) - self.state = self.dataState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] += "\uFFFD" - else: - self.currentToken["name"] += data - # (Don't use charsUntil here, because tag names are - # very short and it's faster to not do anything fancy) - return True - - def rcdataLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.rcdataEndTagOpenState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rcdataEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.rcdataEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) - self.state = self.scriptDataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataEscapedState - elif data == EOF: - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.scriptDataEscapedEndTagOpenState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) - self.temporaryBuffer = data - self.state = self.scriptDataDoubleEscapeStartState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer = data - self.state = self.scriptDataEscapedEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": ""))): - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - if self.temporaryBuffer.lower() == "script": - self.state = self.scriptDataDoubleEscapedState - else: - self.state = self.scriptDataEscapedState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.temporaryBuffer += data - else: - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataDoubleEscapedState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataDoubleEscapedDashState - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - return True - - def scriptDataDoubleEscapedDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataDoubleEscapedDashDashState - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataDoubleEscapedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapedDashDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) - self.state = self.scriptDataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataDoubleEscapedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapedLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) - self.temporaryBuffer = "" - self.state = self.scriptDataDoubleEscapeEndState - else: - self.stream.unget(data) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapeEndState(self): - data = self.stream.char() - if data in (spaceCharacters | frozenset(("/", ">"))): - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - if self.temporaryBuffer.lower() == "script": - self.state = self.scriptDataEscapedState - else: - self.state = self.scriptDataDoubleEscapedState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.temporaryBuffer += data - else: - self.stream.unget(data) - self.state = self.scriptDataDoubleEscapedState - return True - - def beforeAttributeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data in asciiLetters: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == ">": - self.emitCurrentToken() - elif data == "/": - self.state = self.selfClosingStartTagState - elif data in ("'", '"', "=", "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "invalid-character-in-attribute-name"}) - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"].append(["\uFFFD", ""]) - self.state = self.attributeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-name-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - return True - - def attributeNameState(self): - data = self.stream.char() - leavingThisState = True - emitToken = False - if data == "=": - self.state = self.beforeAttributeValueState - elif data in asciiLetters: - self.currentToken["data"][-1][0] += data +\ - self.stream.charsUntil(asciiLetters, True) - leavingThisState = False - elif data == ">": - # XXX If we emit here the attributes are converted to a dict - # without being checked and when the code below runs we error - # because data is a dict not a list - emitToken = True - elif data in spaceCharacters: - self.state = self.afterAttributeNameState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][0] += "\uFFFD" - leavingThisState = False - elif data in ("'", '"', "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "invalid-character-in-attribute-name"}) - self.currentToken["data"][-1][0] += data - leavingThisState = False - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "eof-in-attribute-name"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][0] += data - leavingThisState = False - - if leavingThisState: - # Attributes are not dropped at this stage. That happens when the - # start tag token is emitted so values can still be safely appended - # to attributes, but we do want to report the parse error in time. - self.currentToken["data"][-1][0] = ( - self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) - for name, _ in self.currentToken["data"][:-1]: - if self.currentToken["data"][-1][0] == name: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "duplicate-attribute"}) - break - # XXX Fix for above XXX - if emitToken: - self.emitCurrentToken() - return True - - def afterAttributeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data == "=": - self.state = self.beforeAttributeValueState - elif data == ">": - self.emitCurrentToken() - elif data in asciiLetters: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"].append(["\uFFFD", ""]) - self.state = self.attributeNameState - elif data in ("'", '"', "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "invalid-character-after-attribute-name"}) - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-end-of-tag-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - return True - - def beforeAttributeValueState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data == "\"": - self.state = self.attributeValueDoubleQuotedState - elif data == "&": - self.state = self.attributeValueUnQuotedState - self.stream.unget(data) - elif data == "'": - self.state = self.attributeValueSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-value-but-got-right-bracket"}) - self.emitCurrentToken() - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - self.state = self.attributeValueUnQuotedState - elif data in ("=", "<", "`"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "equals-in-unquoted-attribute-value"}) - self.currentToken["data"][-1][1] += data - self.state = self.attributeValueUnQuotedState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-value-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data - self.state = self.attributeValueUnQuotedState - return True - - def attributeValueDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterAttributeValueState - elif data == "&": - self.processEntityInAttribute('"') - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-double-quote"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data +\ - self.stream.charsUntil(("\"", "&", "\u0000")) - return True - - def attributeValueSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterAttributeValueState - elif data == "&": - self.processEntityInAttribute("'") - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-single-quote"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data +\ - self.stream.charsUntil(("'", "&", "\u0000")) - return True - - def attributeValueUnQuotedState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == "&": - self.processEntityInAttribute(">") - elif data == ">": - self.emitCurrentToken() - elif data in ('"', "'", "=", "<", "`"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-in-unquoted-attribute-value"}) - self.currentToken["data"][-1][1] += data - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-no-quotes"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data + self.stream.charsUntil( - frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) - return True - - def afterAttributeValueState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == ">": - self.emitCurrentToken() - elif data == "/": - self.state = self.selfClosingStartTagState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-EOF-after-attribute-value"}) - self.stream.unget(data) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-after-attribute-value"}) - self.stream.unget(data) - self.state = self.beforeAttributeNameState - return True - - def selfClosingStartTagState(self): - data = self.stream.char() - if data == ">": - self.currentToken["selfClosing"] = True - self.emitCurrentToken() - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "unexpected-EOF-after-solidus-in-tag"}) - self.stream.unget(data) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-after-solidus-in-tag"}) - self.stream.unget(data) - self.state = self.beforeAttributeNameState - return True - - def bogusCommentState(self): - # Make a new comment token and give it as value all the characters - # until the first > or EOF (charsUntil checks for EOF automatically) - # and emit it. - data = self.stream.charsUntil(">") - data = data.replace("\u0000", "\uFFFD") - self.tokenQueue.append( - {"type": tokenTypes["Comment"], "data": data}) - - # Eat the character directly after the bogus comment which is either a - # ">" or an EOF. - self.stream.char() - self.state = self.dataState - return True - - def markupDeclarationOpenState(self): - charStack = [self.stream.char()] - if charStack[-1] == "-": - charStack.append(self.stream.char()) - if charStack[-1] == "-": - self.currentToken = {"type": tokenTypes["Comment"], "data": ""} - self.state = self.commentStartState - return True - elif charStack[-1] in ('d', 'D'): - matched = True - for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), - ('y', 'Y'), ('p', 'P'), ('e', 'E')): - charStack.append(self.stream.char()) - if charStack[-1] not in expected: - matched = False - break - if matched: - self.currentToken = {"type": tokenTypes["Doctype"], - "name": "", - "publicId": None, "systemId": None, - "correct": True} - self.state = self.doctypeState - return True - elif (charStack[-1] == "[" and - self.parser is not None and - self.parser.tree.openElements and - self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): - matched = True - for expected in ["C", "D", "A", "T", "A", "["]: - charStack.append(self.stream.char()) - if charStack[-1] != expected: - matched = False - break - if matched: - self.state = self.cdataSectionState - return True - - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-dashes-or-doctype"}) - - while charStack: - self.stream.unget(charStack.pop()) - self.state = self.bogusCommentState - return True - - def commentStartState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentStartDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "incorrect-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += data - self.state = self.commentState - return True - - def commentStartDashState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "-\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "incorrect-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "-" + data - self.state = self.commentState - return True - - def commentState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += data + \ - self.stream.charsUntil(("-", "\u0000")) - return True - - def commentEndDashState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "-\uFFFD" - self.state = self.commentState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-end-dash"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "-" + data - self.state = self.commentState - return True - - def commentEndState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "--\uFFFD" - self.state = self.commentState - elif data == "!": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-bang-after-double-dash-in-comment"}) - self.state = self.commentEndBangState - elif data == "-": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-dash-after-double-dash-in-comment"}) - self.currentToken["data"] += data - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-double-dash"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - # XXX - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-comment"}) - self.currentToken["data"] += "--" + data - self.state = self.commentState - return True - - def commentEndBangState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "-": - self.currentToken["data"] += "--!" - self.state = self.commentEndDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "--!\uFFFD" - self.state = self.commentState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-end-bang-state"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "--!" + data - self.state = self.commentState - return True - - def doctypeState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-eof"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "need-space-after-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypeNameState - return True - - def beforeDoctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-right-bracket"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] = "\uFFFD" - self.state = self.doctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-eof"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["name"] = data - self.state = self.doctypeNameState - return True - - def doctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.state = self.afterDoctypeNameState - elif data == ">": - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] += "\uFFFD" - self.state = self.doctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype-name"}) - self.currentToken["correct"] = False - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["name"] += data - return True - - def afterDoctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.currentToken["correct"] = False - self.stream.unget(data) - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - if data in ("p", "P"): - matched = True - for expected in (("u", "U"), ("b", "B"), ("l", "L"), - ("i", "I"), ("c", "C")): - data = self.stream.char() - if data not in expected: - matched = False - break - if matched: - self.state = self.afterDoctypePublicKeywordState - return True - elif data in ("s", "S"): - matched = True - for expected in (("y", "Y"), ("s", "S"), ("t", "T"), - ("e", "E"), ("m", "M")): - data = self.stream.char() - if data not in expected: - matched = False - break - if matched: - self.state = self.afterDoctypeSystemKeywordState - return True - - # All the characters read before the current 'data' will be - # [a-zA-Z], so they're garbage in the bogus doctype and can be - # discarded; only the latest character might be '>' or EOF - # and needs to be ungetted - self.stream.unget(data) - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-space-or-right-bracket-in-doctype", "datavars": - {"data": data}}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - - return True - - def afterDoctypePublicKeywordState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypePublicIdentifierState - elif data in ("'", '"'): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypePublicIdentifierState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.stream.unget(data) - self.state = self.beforeDoctypePublicIdentifierState - return True - - def beforeDoctypePublicIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == "\"": - self.currentToken["publicId"] = "" - self.state = self.doctypePublicIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["publicId"] = "" - self.state = self.doctypePublicIdentifierSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def doctypePublicIdentifierDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterDoctypePublicIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["publicId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["publicId"] += data - return True - - def doctypePublicIdentifierSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterDoctypePublicIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["publicId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["publicId"] += data - return True - - def afterDoctypePublicIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.betweenDoctypePublicAndSystemIdentifiersState - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == '"': - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def betweenDoctypePublicAndSystemIdentifiersState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == '"': - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def afterDoctypeSystemKeywordState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypeSystemIdentifierState - elif data in ("'", '"'): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypeSystemIdentifierState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.stream.unget(data) - self.state = self.beforeDoctypeSystemIdentifierState - return True - - def beforeDoctypeSystemIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == "\"": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def doctypeSystemIdentifierDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterDoctypeSystemIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["systemId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["systemId"] += data - return True - - def doctypeSystemIdentifierSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterDoctypeSystemIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["systemId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["systemId"] += data - return True - - def afterDoctypeSystemIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.state = self.bogusDoctypeState - return True - - def bogusDoctypeState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - # XXX EMIT - self.stream.unget(data) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - pass - return True - - def cdataSectionState(self): - data = [] - while True: - data.append(self.stream.charsUntil("]")) - data.append(self.stream.charsUntil(">")) - char = self.stream.char() - if char == EOF: - break - else: - assert char == ">" - if data[-1][-2:] == "]]": - data[-1] = data[-1][:-2] - break - else: - data.append(char) - - data = "".join(data) # pylint:disable=redefined-variable-type - # Deal with null here rather than in the parser - nullCount = data.count("\u0000") - if nullCount > 0: - for _ in range(nullCount): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - data = data.replace("\u0000", "\uFFFD") - if data: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": data}) - self.state = self.dataState - return True diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py deleted file mode 100644 index 07bad5d..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from .py import Trie - -__all__ = ["Trie"] diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 90891a0cddc9bfe410be4a4ced9b28f1bd88ee92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmYjMO-lnY5KXe%4~j((Ui<~Jg6_$ShzNQVFV)Ku7Q=tVu~APdBv@$gw3jqGbL1JayzO< ziRWuxjn!zuit#@6vm%Sfb>p4sg9fynqY$SGx9HKe@uY8Y>68Y8K~rt~o)0rT<}ZYr z#z{OElQ;ud^`R#XK!Y912FMdc(d`axaRN{q1MtOY_~!sWZx1)})ob!{5ePrzquxp% z9NC6&U8lQ#qX}0l>6<_HgpKsc&1F|F-|MyZvcs-~t!|a0auck%HrSMq_URG;TMPhK X-7ZdVty8_xcf$*Quzt#p#7z7GseNHu diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-310.pyc deleted file mode 100644 index 54a1dcb5f9de22ac612bf15e3b139d5c6ad84e3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1605 zcmZ`(&u`pB6n-=I?s|VDyGlYKRVxBWARpND!ljBLPy+}7E2Ib30XLi@By>@22 zX|gyM64ajg3zB31rMYtIAHanRyys1-4K222JU`yd`@Z+S=WK1Q1^E2>$#(RY1MnwJ zRv!;1pJOvWV<$nf1X32Tlm|R@0*ArE!&RQRX)UNR_z7lR7gYW90|xX~dyVDZFEC@z z;A@bMbT2@FO-PWJky2sWPBW(IGfqtd=^KUR3eEB zrNhMd%r?Fc^E{qSB09eMxYrZ&5C;kZCL!RG1&(Y#hcT-lGy_-GWc>nynrui9zjfJ^ zE&Mi~gA0L&z&h4_tYfvf|Ha4@I*f{)QE1dol!V6Yj5EDc;I0`&e8oA25pJ4!fRh3W zR>C>I?K_7-ch6Iv$UQW^^<9E*=dH#{SbhjGl%QWrlg2?}}qJlbPO~ z7HRTX5|4HTg=AMyocj5xZSEOWL|K~eSMZ6;U0B?ssP><#Q`6r|vIw)e-+yiByS8TL zxzf6h*48C6>)NBSZRK=N|Xi246H^dwnBe zB$!8Z;6v<6xP&V>fG4dpUh+$fGsbuw)r`qGawWzYQ}p;NpH~<(`S2aRfu9PQbr5kC z=4D5S?AA0if|v-(i&*C39o#WgfF0Iib;kd3oyB$q@@>}t5BdkZqC|}ygRYkdvOuV) zId;w@dl!|5RJM=`RzbI%nlMS9%=?atY6%;$qwq(TgOO^36IvQDCA z*85hSeyMe)Z!u=^fBCK_8J;o4HPd^nHRa~7Kw+uOEp@T6+0l5+7fIGTsa^-eT diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-310.pyc deleted file mode 100644 index 250290c6eb256ee04ed3e9ccc2e3c3f89395b8cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmah~OK%%D5GJ`#$+E4ahGX}sK9E3dBj?f<2#g@Fra%$+5;q4y1+fw-d!5xvAt~2Z zS3q0khs4MHi~bH?d&;SY+l_Lxxel;PGFbg#*56+q3kN%Edl0qBE>wQg8?@`9*U;Qtc$ zZgzgqQt8ekqtcVkeRDQKE%wV6nKUqNEzZ+CHJrD0 zvtbV+eyg=qpKRU9vc?m6svCo`HjS=qXt0|fXiJm}e#Lr8mRTQlY-JyE^P~&THevF|m4d4ag>q zX~@=SNH5dL>ba}@D?u=FEF@pA3Oogf^IMHR3D&~50@^S zGZ(`Z&JU!4vkW+Yf9a||zt3`M@0_~`6tQ+(_$-74MP#9} zp@NURGpeq_=y%wZO+6E!9)zA1-pu#O)Sm`^?5S=g~rTMk%Zb_6?bqK9+j=ZrN=LzX)7c@zGY(+f#M8hr*jRV}+5mo|eW| zp;aiOe@e}vx`G-m9`HyImnKkZLNuc?O~a9r{q)4LY-rhGY6G{|(o|hW{qqravX4Nn z8$dQ`mDX65Zqho#0`g(3LowC=4*e?i*`(qkf)#r%5*USLBm^*vLQ;_^amN@iz~?;} zy*cjCTaSVT?o&Sxq4zq;j7|MH(t$(zbHN;}$WAJomTY}}KFg{(1a zViME15_|ZodbKNVb+5UCZu?_1R^V1)&ru!{?DcjXUWnHGg=p#Y#Jxo}EMIbk`2`KS mo4`ASud9vj+`WhQecNGdyjx!G7WOucJ#B;30H_+<@csc~&Fq>0 diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py deleted file mode 100644 index 6b71975..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -try: - from collections.abc import Mapping -except ImportError: # Python 2.7 - from collections import Mapping - - -class Trie(Mapping): - """Abstract base class for tries""" - - def keys(self, prefix=None): - # pylint:disable=arguments-differ - keys = super(Trie, self).keys() - - if prefix is None: - return set(keys) - - return {x for x in keys if x.startswith(prefix)} - - def has_keys_with_prefix(self, prefix): - for key in self.keys(): - if key.startswith(prefix): - return True - - return False - - def longest_prefix(self, prefix): - if prefix in self: - return prefix - - for i in range(1, len(prefix) + 1): - if prefix[:-i] in self: - return prefix[:-i] - - raise KeyError(prefix) - - def longest_prefix_item(self, prefix): - lprefix = self.longest_prefix(prefix) - return (lprefix, self[lprefix]) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py deleted file mode 100644 index c178b21..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from bisect import bisect_left - -from ._base import Trie as ABCTrie - - -class Trie(ABCTrie): - def __init__(self, data): - if not all(isinstance(x, text_type) for x in data.keys()): - raise TypeError("All keys must be strings") - - self._data = data - self._keys = sorted(data.keys()) - self._cachestr = "" - self._cachepoints = (0, len(data)) - - def __contains__(self, key): - return key in self._data - - def __len__(self): - return len(self._data) - - def __iter__(self): - return iter(self._data) - - def __getitem__(self, key): - return self._data[key] - - def keys(self, prefix=None): - if prefix is None or prefix == "" or not self._keys: - return set(self._keys) - - if prefix.startswith(self._cachestr): - lo, hi = self._cachepoints - start = i = bisect_left(self._keys, prefix, lo, hi) - else: - start = i = bisect_left(self._keys, prefix) - - keys = set() - if start == len(self._keys): - return keys - - while self._keys[i].startswith(prefix): - keys.add(self._keys[i]) - i += 1 - - self._cachestr = prefix - self._cachepoints = (start, i) - - return keys - - def has_keys_with_prefix(self, prefix): - if prefix in self._data: - return True - - if prefix.startswith(self._cachestr): - lo, hi = self._cachepoints - i = bisect_left(self._keys, prefix, lo, hi) - else: - i = bisect_left(self._keys, prefix) - - if i == len(self._keys): - return False - - return self._keys[i].startswith(prefix) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_utils.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_utils.py deleted file mode 100644 index d7c4926..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_utils.py +++ /dev/null @@ -1,159 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from types import ModuleType - -try: - from collections.abc import Mapping -except ImportError: - from collections import Mapping - -from pip._vendor.six import text_type, PY3 - -if PY3: - import xml.etree.ElementTree as default_etree -else: - try: - import xml.etree.cElementTree as default_etree - except ImportError: - import xml.etree.ElementTree as default_etree - - -__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", - "surrogatePairToCodepoint", "moduleFactoryFactory", - "supports_lone_surrogates"] - - -# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be -# caught by the below test. In general this would be any platform -# using UTF-16 as its encoding of unicode strings, such as -# Jython. This is because UTF-16 itself is based on the use of such -# surrogates, and there is no mechanism to further escape such -# escapes. -try: - _x = eval('"\\uD800"') # pylint:disable=eval-used - if not isinstance(_x, text_type): - # We need this with u"" because of http://bugs.jython.org/issue2039 - _x = eval('u"\\uD800"') # pylint:disable=eval-used - assert isinstance(_x, text_type) -except Exception: - supports_lone_surrogates = False -else: - supports_lone_surrogates = True - - -class MethodDispatcher(dict): - """Dict with 2 special properties: - - On initiation, keys that are lists, sets or tuples are converted to - multiple keys so accessing any one of the items in the original - list-like object returns the matching value - - md = MethodDispatcher({("foo", "bar"):"baz"}) - md["foo"] == "baz" - - A default value which can be set through the default attribute. - """ - - def __init__(self, items=()): - _dictEntries = [] - for name, value in items: - if isinstance(name, (list, tuple, frozenset, set)): - for item in name: - _dictEntries.append((item, value)) - else: - _dictEntries.append((name, value)) - dict.__init__(self, _dictEntries) - assert len(self) == len(_dictEntries) - self.default = None - - def __getitem__(self, key): - return dict.get(self, key, self.default) - - def __get__(self, instance, owner=None): - return BoundMethodDispatcher(instance, self) - - -class BoundMethodDispatcher(Mapping): - """Wraps a MethodDispatcher, binding its return values to `instance`""" - def __init__(self, instance, dispatcher): - self.instance = instance - self.dispatcher = dispatcher - - def __getitem__(self, key): - # see https://docs.python.org/3/reference/datamodel.html#object.__get__ - # on a function, __get__ is used to bind a function to an instance as a bound method - return self.dispatcher[key].__get__(self.instance) - - def get(self, key, default): - if key in self.dispatcher: - return self[key] - else: - return default - - def __iter__(self): - return iter(self.dispatcher) - - def __len__(self): - return len(self.dispatcher) - - def __contains__(self, key): - return key in self.dispatcher - - -# Some utility functions to deal with weirdness around UCS2 vs UCS4 -# python builds - -def isSurrogatePair(data): - return (len(data) == 2 and - ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and - ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) - - -def surrogatePairToCodepoint(data): - char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + - (ord(data[1]) - 0xDC00)) - return char_val - -# Module Factory Factory (no, this isn't Java, I know) -# Here to stop this being duplicated all over the place. - - -def moduleFactoryFactory(factory): - moduleCache = {} - - def moduleFactory(baseModule, *args, **kwargs): - if isinstance(ModuleType.__name__, type("")): - name = "_%s_factory" % baseModule.__name__ - else: - name = b"_%s_factory" % baseModule.__name__ - - kwargs_tuple = tuple(kwargs.items()) - - try: - return moduleCache[name][args][kwargs_tuple] - except KeyError: - mod = ModuleType(name) - objs = factory(baseModule, *args, **kwargs) - mod.__dict__.update(objs) - if "name" not in moduleCache: - moduleCache[name] = {} - if "args" not in moduleCache[name]: - moduleCache[name][args] = {} - if "kwargs" not in moduleCache[name][args]: - moduleCache[name][args][kwargs_tuple] = {} - moduleCache[name][args][kwargs_tuple] = mod - return mod - - return moduleFactory - - -def memoize(func): - cache = {} - - def wrapped(*args, **kwargs): - key = (tuple(args), tuple(kwargs.items())) - if key not in cache: - cache[key] = func(*args, **kwargs) - return cache[key] - - return wrapped diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/constants.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/constants.py deleted file mode 100644 index fe3e237..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/constants.py +++ /dev/null @@ -1,2946 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import string - -EOF = None - -E = { - "null-character": - "Null character in input stream, replaced with U+FFFD.", - "invalid-codepoint": - "Invalid codepoint in stream.", - "incorrectly-placed-solidus": - "Solidus (/) incorrectly placed in tag.", - "incorrect-cr-newline-entity": - "Incorrect CR newline entity, replaced with LF.", - "illegal-windows-1252-entity": - "Entity used with illegal number (windows-1252 reference).", - "cant-convert-numeric-entity": - "Numeric entity couldn't be converted to character " - "(codepoint U+%(charAsInt)08x).", - "illegal-codepoint-for-numeric-entity": - "Numeric entity represents an illegal codepoint: " - "U+%(charAsInt)08x.", - "numeric-entity-without-semicolon": - "Numeric entity didn't end with ';'.", - "expected-numeric-entity-but-got-eof": - "Numeric entity expected. Got end of file instead.", - "expected-numeric-entity": - "Numeric entity expected but none found.", - "named-entity-without-semicolon": - "Named entity didn't end with ';'.", - "expected-named-entity": - "Named entity expected. Got none.", - "attributes-in-end-tag": - "End tag contains unexpected attributes.", - 'self-closing-flag-on-end-tag': - "End tag contains unexpected self-closing flag.", - "expected-tag-name-but-got-right-bracket": - "Expected tag name. Got '>' instead.", - "expected-tag-name-but-got-question-mark": - "Expected tag name. Got '?' instead. (HTML doesn't " - "support processing instructions.)", - "expected-tag-name": - "Expected tag name. Got something else instead", - "expected-closing-tag-but-got-right-bracket": - "Expected closing tag. Got '>' instead. Ignoring ''.", - "expected-closing-tag-but-got-eof": - "Expected closing tag. Unexpected end of file.", - "expected-closing-tag-but-got-char": - "Expected closing tag. Unexpected character '%(data)s' found.", - "eof-in-tag-name": - "Unexpected end of file in the tag name.", - "expected-attribute-name-but-got-eof": - "Unexpected end of file. Expected attribute name instead.", - "eof-in-attribute-name": - "Unexpected end of file in attribute name.", - "invalid-character-in-attribute-name": - "Invalid character in attribute name", - "duplicate-attribute": - "Dropped duplicate attribute on tag.", - "expected-end-of-tag-name-but-got-eof": - "Unexpected end of file. Expected = or end of tag.", - "expected-attribute-value-but-got-eof": - "Unexpected end of file. Expected attribute value.", - "expected-attribute-value-but-got-right-bracket": - "Expected attribute value. Got '>' instead.", - 'equals-in-unquoted-attribute-value': - "Unexpected = in unquoted attribute", - 'unexpected-character-in-unquoted-attribute-value': - "Unexpected character in unquoted attribute", - "invalid-character-after-attribute-name": - "Unexpected character after attribute name.", - "unexpected-character-after-attribute-value": - "Unexpected character after attribute value.", - "eof-in-attribute-value-double-quote": - "Unexpected end of file in attribute value (\").", - "eof-in-attribute-value-single-quote": - "Unexpected end of file in attribute value (').", - "eof-in-attribute-value-no-quotes": - "Unexpected end of file in attribute value.", - "unexpected-EOF-after-solidus-in-tag": - "Unexpected end of file in tag. Expected >", - "unexpected-character-after-solidus-in-tag": - "Unexpected character after / in tag. Expected >", - "expected-dashes-or-doctype": - "Expected '--' or 'DOCTYPE'. Not found.", - "unexpected-bang-after-double-dash-in-comment": - "Unexpected ! after -- in comment", - "unexpected-space-after-double-dash-in-comment": - "Unexpected space after -- in comment", - "incorrect-comment": - "Incorrect comment.", - "eof-in-comment": - "Unexpected end of file in comment.", - "eof-in-comment-end-dash": - "Unexpected end of file in comment (-)", - "unexpected-dash-after-double-dash-in-comment": - "Unexpected '-' after '--' found in comment.", - "eof-in-comment-double-dash": - "Unexpected end of file in comment (--).", - "eof-in-comment-end-space-state": - "Unexpected end of file in comment.", - "eof-in-comment-end-bang-state": - "Unexpected end of file in comment.", - "unexpected-char-in-comment": - "Unexpected character in comment found.", - "need-space-after-doctype": - "No space after literal string 'DOCTYPE'.", - "expected-doctype-name-but-got-right-bracket": - "Unexpected > character. Expected DOCTYPE name.", - "expected-doctype-name-but-got-eof": - "Unexpected end of file. Expected DOCTYPE name.", - "eof-in-doctype-name": - "Unexpected end of file in DOCTYPE name.", - "eof-in-doctype": - "Unexpected end of file in DOCTYPE.", - "expected-space-or-right-bracket-in-doctype": - "Expected space or '>'. Got '%(data)s'", - "unexpected-end-of-doctype": - "Unexpected end of DOCTYPE.", - "unexpected-char-in-doctype": - "Unexpected character in DOCTYPE.", - "eof-in-innerhtml": - "XXX innerHTML EOF", - "unexpected-doctype": - "Unexpected DOCTYPE. Ignored.", - "non-html-root": - "html needs to be the first start tag.", - "expected-doctype-but-got-eof": - "Unexpected End of file. Expected DOCTYPE.", - "unknown-doctype": - "Erroneous DOCTYPE.", - "expected-doctype-but-got-chars": - "Unexpected non-space characters. Expected DOCTYPE.", - "expected-doctype-but-got-start-tag": - "Unexpected start tag (%(name)s). Expected DOCTYPE.", - "expected-doctype-but-got-end-tag": - "Unexpected end tag (%(name)s). Expected DOCTYPE.", - "end-tag-after-implied-root": - "Unexpected end tag (%(name)s) after the (implied) root element.", - "expected-named-closing-tag-but-got-eof": - "Unexpected end of file. Expected end tag (%(name)s).", - "two-heads-are-not-better-than-one": - "Unexpected start tag head in existing head. Ignored.", - "unexpected-end-tag": - "Unexpected end tag (%(name)s). Ignored.", - "unexpected-start-tag-out-of-my-head": - "Unexpected start tag (%(name)s) that can be in head. Moved.", - "unexpected-start-tag": - "Unexpected start tag (%(name)s).", - "missing-end-tag": - "Missing end tag (%(name)s).", - "missing-end-tags": - "Missing end tags (%(name)s).", - "unexpected-start-tag-implies-end-tag": - "Unexpected start tag (%(startName)s) " - "implies end tag (%(endName)s).", - "unexpected-start-tag-treated-as": - "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", - "deprecated-tag": - "Unexpected start tag %(name)s. Don't use it!", - "unexpected-start-tag-ignored": - "Unexpected start tag %(name)s. Ignored.", - "expected-one-end-tag-but-got-another": - "Unexpected end tag (%(gotName)s). " - "Missing end tag (%(expectedName)s).", - "end-tag-too-early": - "End tag (%(name)s) seen too early. Expected other end tag.", - "end-tag-too-early-named": - "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", - "end-tag-too-early-ignored": - "End tag (%(name)s) seen too early. Ignored.", - "adoption-agency-1.1": - "End tag (%(name)s) violates step 1, " - "paragraph 1 of the adoption agency algorithm.", - "adoption-agency-1.2": - "End tag (%(name)s) violates step 1, " - "paragraph 2 of the adoption agency algorithm.", - "adoption-agency-1.3": - "End tag (%(name)s) violates step 1, " - "paragraph 3 of the adoption agency algorithm.", - "adoption-agency-4.4": - "End tag (%(name)s) violates step 4, " - "paragraph 4 of the adoption agency algorithm.", - "unexpected-end-tag-treated-as": - "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", - "no-end-tag": - "This element (%(name)s) has no end tag.", - "unexpected-implied-end-tag-in-table": - "Unexpected implied end tag (%(name)s) in the table phase.", - "unexpected-implied-end-tag-in-table-body": - "Unexpected implied end tag (%(name)s) in the table body phase.", - "unexpected-char-implies-table-voodoo": - "Unexpected non-space characters in " - "table context caused voodoo mode.", - "unexpected-hidden-input-in-table": - "Unexpected input with type hidden in table context.", - "unexpected-form-in-table": - "Unexpected form in table context.", - "unexpected-start-tag-implies-table-voodoo": - "Unexpected start tag (%(name)s) in " - "table context caused voodoo mode.", - "unexpected-end-tag-implies-table-voodoo": - "Unexpected end tag (%(name)s) in " - "table context caused voodoo mode.", - "unexpected-cell-in-table-body": - "Unexpected table cell start tag (%(name)s) " - "in the table body phase.", - "unexpected-cell-end-tag": - "Got table cell end tag (%(name)s) " - "while required end tags are missing.", - "unexpected-end-tag-in-table-body": - "Unexpected end tag (%(name)s) in the table body phase. Ignored.", - "unexpected-implied-end-tag-in-table-row": - "Unexpected implied end tag (%(name)s) in the table row phase.", - "unexpected-end-tag-in-table-row": - "Unexpected end tag (%(name)s) in the table row phase. Ignored.", - "unexpected-select-in-select": - "Unexpected select start tag in the select phase " - "treated as select end tag.", - "unexpected-input-in-select": - "Unexpected input start tag in the select phase.", - "unexpected-start-tag-in-select": - "Unexpected start tag token (%(name)s in the select phase. " - "Ignored.", - "unexpected-end-tag-in-select": - "Unexpected end tag (%(name)s) in the select phase. Ignored.", - "unexpected-table-element-start-tag-in-select-in-table": - "Unexpected table element start tag (%(name)s) in the select in table phase.", - "unexpected-table-element-end-tag-in-select-in-table": - "Unexpected table element end tag (%(name)s) in the select in table phase.", - "unexpected-char-after-body": - "Unexpected non-space characters in the after body phase.", - "unexpected-start-tag-after-body": - "Unexpected start tag token (%(name)s)" - " in the after body phase.", - "unexpected-end-tag-after-body": - "Unexpected end tag token (%(name)s)" - " in the after body phase.", - "unexpected-char-in-frameset": - "Unexpected characters in the frameset phase. Characters ignored.", - "unexpected-start-tag-in-frameset": - "Unexpected start tag token (%(name)s)" - " in the frameset phase. Ignored.", - "unexpected-frameset-in-frameset-innerhtml": - "Unexpected end tag token (frameset) " - "in the frameset phase (innerHTML).", - "unexpected-end-tag-in-frameset": - "Unexpected end tag token (%(name)s)" - " in the frameset phase. Ignored.", - "unexpected-char-after-frameset": - "Unexpected non-space characters in the " - "after frameset phase. Ignored.", - "unexpected-start-tag-after-frameset": - "Unexpected start tag (%(name)s)" - " in the after frameset phase. Ignored.", - "unexpected-end-tag-after-frameset": - "Unexpected end tag (%(name)s)" - " in the after frameset phase. Ignored.", - "unexpected-end-tag-after-body-innerhtml": - "Unexpected end tag after body(innerHtml)", - "expected-eof-but-got-char": - "Unexpected non-space characters. Expected end of file.", - "expected-eof-but-got-start-tag": - "Unexpected start tag (%(name)s)" - ". Expected end of file.", - "expected-eof-but-got-end-tag": - "Unexpected end tag (%(name)s)" - ". Expected end of file.", - "eof-in-table": - "Unexpected end of file. Expected table content.", - "eof-in-select": - "Unexpected end of file. Expected select content.", - "eof-in-frameset": - "Unexpected end of file. Expected frameset content.", - "eof-in-script-in-script": - "Unexpected end of file. Expected script content.", - "eof-in-foreign-lands": - "Unexpected end of file. Expected foreign content", - "non-void-element-with-trailing-solidus": - "Trailing solidus not allowed on element %(name)s", - "unexpected-html-element-in-foreign-content": - "Element %(name)s not allowed in a non-html context", - "unexpected-end-tag-before-html": - "Unexpected end tag (%(name)s) before html.", - "unexpected-inhead-noscript-tag": - "Element %(name)s not allowed in a inhead-noscript context", - "eof-in-head-noscript": - "Unexpected end of file. Expected inhead-noscript content", - "char-in-head-noscript": - "Unexpected non-space character. Expected inhead-noscript content", - "XXX-undefined-error": - "Undefined error (this sucks and should be fixed)", -} - -namespaces = { - "html": "http://www.w3.org/1999/xhtml", - "mathml": "http://www.w3.org/1998/Math/MathML", - "svg": "http://www.w3.org/2000/svg", - "xlink": "http://www.w3.org/1999/xlink", - "xml": "http://www.w3.org/XML/1998/namespace", - "xmlns": "http://www.w3.org/2000/xmlns/" -} - -scopingElements = frozenset([ - (namespaces["html"], "applet"), - (namespaces["html"], "caption"), - (namespaces["html"], "html"), - (namespaces["html"], "marquee"), - (namespaces["html"], "object"), - (namespaces["html"], "table"), - (namespaces["html"], "td"), - (namespaces["html"], "th"), - (namespaces["mathml"], "mi"), - (namespaces["mathml"], "mo"), - (namespaces["mathml"], "mn"), - (namespaces["mathml"], "ms"), - (namespaces["mathml"], "mtext"), - (namespaces["mathml"], "annotation-xml"), - (namespaces["svg"], "foreignObject"), - (namespaces["svg"], "desc"), - (namespaces["svg"], "title"), -]) - -formattingElements = frozenset([ - (namespaces["html"], "a"), - (namespaces["html"], "b"), - (namespaces["html"], "big"), - (namespaces["html"], "code"), - (namespaces["html"], "em"), - (namespaces["html"], "font"), - (namespaces["html"], "i"), - (namespaces["html"], "nobr"), - (namespaces["html"], "s"), - (namespaces["html"], "small"), - (namespaces["html"], "strike"), - (namespaces["html"], "strong"), - (namespaces["html"], "tt"), - (namespaces["html"], "u") -]) - -specialElements = frozenset([ - (namespaces["html"], "address"), - (namespaces["html"], "applet"), - (namespaces["html"], "area"), - (namespaces["html"], "article"), - (namespaces["html"], "aside"), - (namespaces["html"], "base"), - (namespaces["html"], "basefont"), - (namespaces["html"], "bgsound"), - (namespaces["html"], "blockquote"), - (namespaces["html"], "body"), - (namespaces["html"], "br"), - (namespaces["html"], "button"), - (namespaces["html"], "caption"), - (namespaces["html"], "center"), - (namespaces["html"], "col"), - (namespaces["html"], "colgroup"), - (namespaces["html"], "command"), - (namespaces["html"], "dd"), - (namespaces["html"], "details"), - (namespaces["html"], "dir"), - (namespaces["html"], "div"), - (namespaces["html"], "dl"), - (namespaces["html"], "dt"), - (namespaces["html"], "embed"), - (namespaces["html"], "fieldset"), - (namespaces["html"], "figure"), - (namespaces["html"], "footer"), - (namespaces["html"], "form"), - (namespaces["html"], "frame"), - (namespaces["html"], "frameset"), - (namespaces["html"], "h1"), - (namespaces["html"], "h2"), - (namespaces["html"], "h3"), - (namespaces["html"], "h4"), - (namespaces["html"], "h5"), - (namespaces["html"], "h6"), - (namespaces["html"], "head"), - (namespaces["html"], "header"), - (namespaces["html"], "hr"), - (namespaces["html"], "html"), - (namespaces["html"], "iframe"), - # Note that image is commented out in the spec as "this isn't an - # element that can end up on the stack, so it doesn't matter," - (namespaces["html"], "image"), - (namespaces["html"], "img"), - (namespaces["html"], "input"), - (namespaces["html"], "isindex"), - (namespaces["html"], "li"), - (namespaces["html"], "link"), - (namespaces["html"], "listing"), - (namespaces["html"], "marquee"), - (namespaces["html"], "menu"), - (namespaces["html"], "meta"), - (namespaces["html"], "nav"), - (namespaces["html"], "noembed"), - (namespaces["html"], "noframes"), - (namespaces["html"], "noscript"), - (namespaces["html"], "object"), - (namespaces["html"], "ol"), - (namespaces["html"], "p"), - (namespaces["html"], "param"), - (namespaces["html"], "plaintext"), - (namespaces["html"], "pre"), - (namespaces["html"], "script"), - (namespaces["html"], "section"), - (namespaces["html"], "select"), - (namespaces["html"], "style"), - (namespaces["html"], "table"), - (namespaces["html"], "tbody"), - (namespaces["html"], "td"), - (namespaces["html"], "textarea"), - (namespaces["html"], "tfoot"), - (namespaces["html"], "th"), - (namespaces["html"], "thead"), - (namespaces["html"], "title"), - (namespaces["html"], "tr"), - (namespaces["html"], "ul"), - (namespaces["html"], "wbr"), - (namespaces["html"], "xmp"), - (namespaces["svg"], "foreignObject") -]) - -htmlIntegrationPointElements = frozenset([ - (namespaces["mathml"], "annotation-xml"), - (namespaces["svg"], "foreignObject"), - (namespaces["svg"], "desc"), - (namespaces["svg"], "title") -]) - -mathmlTextIntegrationPointElements = frozenset([ - (namespaces["mathml"], "mi"), - (namespaces["mathml"], "mo"), - (namespaces["mathml"], "mn"), - (namespaces["mathml"], "ms"), - (namespaces["mathml"], "mtext") -]) - -adjustSVGAttributes = { - "attributename": "attributeName", - "attributetype": "attributeType", - "basefrequency": "baseFrequency", - "baseprofile": "baseProfile", - "calcmode": "calcMode", - "clippathunits": "clipPathUnits", - "contentscripttype": "contentScriptType", - "contentstyletype": "contentStyleType", - "diffuseconstant": "diffuseConstant", - "edgemode": "edgeMode", - "externalresourcesrequired": "externalResourcesRequired", - "filterres": "filterRes", - "filterunits": "filterUnits", - "glyphref": "glyphRef", - "gradienttransform": "gradientTransform", - "gradientunits": "gradientUnits", - "kernelmatrix": "kernelMatrix", - "kernelunitlength": "kernelUnitLength", - "keypoints": "keyPoints", - "keysplines": "keySplines", - "keytimes": "keyTimes", - "lengthadjust": "lengthAdjust", - "limitingconeangle": "limitingConeAngle", - "markerheight": "markerHeight", - "markerunits": "markerUnits", - "markerwidth": "markerWidth", - "maskcontentunits": "maskContentUnits", - "maskunits": "maskUnits", - "numoctaves": "numOctaves", - "pathlength": "pathLength", - "patterncontentunits": "patternContentUnits", - "patterntransform": "patternTransform", - "patternunits": "patternUnits", - "pointsatx": "pointsAtX", - "pointsaty": "pointsAtY", - "pointsatz": "pointsAtZ", - "preservealpha": "preserveAlpha", - "preserveaspectratio": "preserveAspectRatio", - "primitiveunits": "primitiveUnits", - "refx": "refX", - "refy": "refY", - "repeatcount": "repeatCount", - "repeatdur": "repeatDur", - "requiredextensions": "requiredExtensions", - "requiredfeatures": "requiredFeatures", - "specularconstant": "specularConstant", - "specularexponent": "specularExponent", - "spreadmethod": "spreadMethod", - "startoffset": "startOffset", - "stddeviation": "stdDeviation", - "stitchtiles": "stitchTiles", - "surfacescale": "surfaceScale", - "systemlanguage": "systemLanguage", - "tablevalues": "tableValues", - "targetx": "targetX", - "targety": "targetY", - "textlength": "textLength", - "viewbox": "viewBox", - "viewtarget": "viewTarget", - "xchannelselector": "xChannelSelector", - "ychannelselector": "yChannelSelector", - "zoomandpan": "zoomAndPan" -} - -adjustMathMLAttributes = {"definitionurl": "definitionURL"} - -adjustForeignAttributes = { - "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), - "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), - "xlink:href": ("xlink", "href", namespaces["xlink"]), - "xlink:role": ("xlink", "role", namespaces["xlink"]), - "xlink:show": ("xlink", "show", namespaces["xlink"]), - "xlink:title": ("xlink", "title", namespaces["xlink"]), - "xlink:type": ("xlink", "type", namespaces["xlink"]), - "xml:base": ("xml", "base", namespaces["xml"]), - "xml:lang": ("xml", "lang", namespaces["xml"]), - "xml:space": ("xml", "space", namespaces["xml"]), - "xmlns": (None, "xmlns", namespaces["xmlns"]), - "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) -} - -unadjustForeignAttributes = {(ns, local): qname for qname, (prefix, local, ns) in - adjustForeignAttributes.items()} - -spaceCharacters = frozenset([ - "\t", - "\n", - "\u000C", - " ", - "\r" -]) - -tableInsertModeElements = frozenset([ - "table", - "tbody", - "tfoot", - "thead", - "tr" -]) - -asciiLowercase = frozenset(string.ascii_lowercase) -asciiUppercase = frozenset(string.ascii_uppercase) -asciiLetters = frozenset(string.ascii_letters) -digits = frozenset(string.digits) -hexDigits = frozenset(string.hexdigits) - -asciiUpper2Lower = {ord(c): ord(c.lower()) for c in string.ascii_uppercase} - -# Heading elements need to be ordered -headingElements = ( - "h1", - "h2", - "h3", - "h4", - "h5", - "h6" -) - -voidElements = frozenset([ - "base", - "command", - "event-source", - "link", - "meta", - "hr", - "br", - "img", - "embed", - "param", - "area", - "col", - "input", - "source", - "track" -]) - -cdataElements = frozenset(['title', 'textarea']) - -rcdataElements = frozenset([ - 'style', - 'script', - 'xmp', - 'iframe', - 'noembed', - 'noframes', - 'noscript' -]) - -booleanAttributes = { - "": frozenset(["irrelevant", "itemscope"]), - "style": frozenset(["scoped"]), - "img": frozenset(["ismap"]), - "audio": frozenset(["autoplay", "controls"]), - "video": frozenset(["autoplay", "controls"]), - "script": frozenset(["defer", "async"]), - "details": frozenset(["open"]), - "datagrid": frozenset(["multiple", "disabled"]), - "command": frozenset(["hidden", "disabled", "checked", "default"]), - "hr": frozenset(["noshade"]), - "menu": frozenset(["autosubmit"]), - "fieldset": frozenset(["disabled", "readonly"]), - "option": frozenset(["disabled", "readonly", "selected"]), - "optgroup": frozenset(["disabled", "readonly"]), - "button": frozenset(["disabled", "autofocus"]), - "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), - "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), - "output": frozenset(["disabled", "readonly"]), - "iframe": frozenset(["seamless"]), -} - -# entitiesWindows1252 has to be _ordered_ and needs to have an index. It -# therefore can't be a frozenset. -entitiesWindows1252 = ( - 8364, # 0x80 0x20AC EURO SIGN - 65533, # 0x81 UNDEFINED - 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK - 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK - 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK - 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS - 8224, # 0x86 0x2020 DAGGER - 8225, # 0x87 0x2021 DOUBLE DAGGER - 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT - 8240, # 0x89 0x2030 PER MILLE SIGN - 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON - 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE - 65533, # 0x8D UNDEFINED - 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON - 65533, # 0x8F UNDEFINED - 65533, # 0x90 UNDEFINED - 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK - 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK - 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK - 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK - 8226, # 0x95 0x2022 BULLET - 8211, # 0x96 0x2013 EN DASH - 8212, # 0x97 0x2014 EM DASH - 732, # 0x98 0x02DC SMALL TILDE - 8482, # 0x99 0x2122 TRADE MARK SIGN - 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON - 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE - 65533, # 0x9D UNDEFINED - 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON - 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS -) - -xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) - -entities = { - "AElig": "\xc6", - "AElig;": "\xc6", - "AMP": "&", - "AMP;": "&", - "Aacute": "\xc1", - "Aacute;": "\xc1", - "Abreve;": "\u0102", - "Acirc": "\xc2", - "Acirc;": "\xc2", - "Acy;": "\u0410", - "Afr;": "\U0001d504", - "Agrave": "\xc0", - "Agrave;": "\xc0", - "Alpha;": "\u0391", - "Amacr;": "\u0100", - "And;": "\u2a53", - "Aogon;": "\u0104", - "Aopf;": "\U0001d538", - "ApplyFunction;": "\u2061", - "Aring": "\xc5", - "Aring;": "\xc5", - "Ascr;": "\U0001d49c", - "Assign;": "\u2254", - "Atilde": "\xc3", - "Atilde;": "\xc3", - "Auml": "\xc4", - "Auml;": "\xc4", - "Backslash;": "\u2216", - "Barv;": "\u2ae7", - "Barwed;": "\u2306", - "Bcy;": "\u0411", - "Because;": "\u2235", - "Bernoullis;": "\u212c", - "Beta;": "\u0392", - "Bfr;": "\U0001d505", - "Bopf;": "\U0001d539", - "Breve;": "\u02d8", - "Bscr;": "\u212c", - "Bumpeq;": "\u224e", - "CHcy;": "\u0427", - "COPY": "\xa9", - "COPY;": "\xa9", - "Cacute;": "\u0106", - "Cap;": "\u22d2", - "CapitalDifferentialD;": "\u2145", - "Cayleys;": "\u212d", - "Ccaron;": "\u010c", - "Ccedil": "\xc7", - "Ccedil;": "\xc7", - "Ccirc;": "\u0108", - "Cconint;": "\u2230", - "Cdot;": "\u010a", - "Cedilla;": "\xb8", - "CenterDot;": "\xb7", - "Cfr;": "\u212d", - "Chi;": "\u03a7", - "CircleDot;": "\u2299", - "CircleMinus;": "\u2296", - "CirclePlus;": "\u2295", - "CircleTimes;": "\u2297", - "ClockwiseContourIntegral;": "\u2232", - "CloseCurlyDoubleQuote;": "\u201d", - "CloseCurlyQuote;": "\u2019", - "Colon;": "\u2237", - "Colone;": "\u2a74", - "Congruent;": "\u2261", - "Conint;": "\u222f", - "ContourIntegral;": "\u222e", - "Copf;": "\u2102", - "Coproduct;": "\u2210", - "CounterClockwiseContourIntegral;": "\u2233", - "Cross;": "\u2a2f", - "Cscr;": "\U0001d49e", - "Cup;": "\u22d3", - "CupCap;": "\u224d", - "DD;": "\u2145", - "DDotrahd;": "\u2911", - "DJcy;": "\u0402", - "DScy;": "\u0405", - "DZcy;": "\u040f", - "Dagger;": "\u2021", - "Darr;": "\u21a1", - "Dashv;": "\u2ae4", - "Dcaron;": "\u010e", - "Dcy;": "\u0414", - "Del;": "\u2207", - "Delta;": "\u0394", - "Dfr;": "\U0001d507", - "DiacriticalAcute;": "\xb4", - "DiacriticalDot;": "\u02d9", - "DiacriticalDoubleAcute;": "\u02dd", - "DiacriticalGrave;": "`", - "DiacriticalTilde;": "\u02dc", - "Diamond;": "\u22c4", - "DifferentialD;": "\u2146", - "Dopf;": "\U0001d53b", - "Dot;": "\xa8", - "DotDot;": "\u20dc", - "DotEqual;": "\u2250", - "DoubleContourIntegral;": "\u222f", - "DoubleDot;": "\xa8", - "DoubleDownArrow;": "\u21d3", - "DoubleLeftArrow;": "\u21d0", - "DoubleLeftRightArrow;": "\u21d4", - "DoubleLeftTee;": "\u2ae4", - "DoubleLongLeftArrow;": "\u27f8", - "DoubleLongLeftRightArrow;": "\u27fa", - "DoubleLongRightArrow;": "\u27f9", - "DoubleRightArrow;": "\u21d2", - "DoubleRightTee;": "\u22a8", - "DoubleUpArrow;": "\u21d1", - "DoubleUpDownArrow;": "\u21d5", - "DoubleVerticalBar;": "\u2225", - "DownArrow;": "\u2193", - "DownArrowBar;": "\u2913", - "DownArrowUpArrow;": "\u21f5", - "DownBreve;": "\u0311", - "DownLeftRightVector;": "\u2950", - "DownLeftTeeVector;": "\u295e", - "DownLeftVector;": "\u21bd", - "DownLeftVectorBar;": "\u2956", - "DownRightTeeVector;": "\u295f", - "DownRightVector;": "\u21c1", - "DownRightVectorBar;": "\u2957", - "DownTee;": "\u22a4", - "DownTeeArrow;": "\u21a7", - "Downarrow;": "\u21d3", - "Dscr;": "\U0001d49f", - "Dstrok;": "\u0110", - "ENG;": "\u014a", - "ETH": "\xd0", - "ETH;": "\xd0", - "Eacute": "\xc9", - "Eacute;": "\xc9", - "Ecaron;": "\u011a", - "Ecirc": "\xca", - "Ecirc;": "\xca", - "Ecy;": "\u042d", - "Edot;": "\u0116", - "Efr;": "\U0001d508", - "Egrave": "\xc8", - "Egrave;": "\xc8", - "Element;": "\u2208", - "Emacr;": "\u0112", - "EmptySmallSquare;": "\u25fb", - "EmptyVerySmallSquare;": "\u25ab", - "Eogon;": "\u0118", - "Eopf;": "\U0001d53c", - "Epsilon;": "\u0395", - "Equal;": "\u2a75", - "EqualTilde;": "\u2242", - "Equilibrium;": "\u21cc", - "Escr;": "\u2130", - "Esim;": "\u2a73", - "Eta;": "\u0397", - "Euml": "\xcb", - "Euml;": "\xcb", - "Exists;": "\u2203", - "ExponentialE;": "\u2147", - "Fcy;": "\u0424", - "Ffr;": "\U0001d509", - "FilledSmallSquare;": "\u25fc", - "FilledVerySmallSquare;": "\u25aa", - "Fopf;": "\U0001d53d", - "ForAll;": "\u2200", - "Fouriertrf;": "\u2131", - "Fscr;": "\u2131", - "GJcy;": "\u0403", - "GT": ">", - "GT;": ">", - "Gamma;": "\u0393", - "Gammad;": "\u03dc", - "Gbreve;": "\u011e", - "Gcedil;": "\u0122", - "Gcirc;": "\u011c", - "Gcy;": "\u0413", - "Gdot;": "\u0120", - "Gfr;": "\U0001d50a", - "Gg;": "\u22d9", - "Gopf;": "\U0001d53e", - "GreaterEqual;": "\u2265", - "GreaterEqualLess;": "\u22db", - "GreaterFullEqual;": "\u2267", - "GreaterGreater;": "\u2aa2", - "GreaterLess;": "\u2277", - "GreaterSlantEqual;": "\u2a7e", - "GreaterTilde;": "\u2273", - "Gscr;": "\U0001d4a2", - "Gt;": "\u226b", - "HARDcy;": "\u042a", - "Hacek;": "\u02c7", - "Hat;": "^", - "Hcirc;": "\u0124", - "Hfr;": "\u210c", - "HilbertSpace;": "\u210b", - "Hopf;": "\u210d", - "HorizontalLine;": "\u2500", - "Hscr;": "\u210b", - "Hstrok;": "\u0126", - "HumpDownHump;": "\u224e", - "HumpEqual;": "\u224f", - "IEcy;": "\u0415", - "IJlig;": "\u0132", - "IOcy;": "\u0401", - "Iacute": "\xcd", - "Iacute;": "\xcd", - "Icirc": "\xce", - "Icirc;": "\xce", - "Icy;": "\u0418", - "Idot;": "\u0130", - "Ifr;": "\u2111", - "Igrave": "\xcc", - "Igrave;": "\xcc", - "Im;": "\u2111", - "Imacr;": "\u012a", - "ImaginaryI;": "\u2148", - "Implies;": "\u21d2", - "Int;": "\u222c", - "Integral;": "\u222b", - "Intersection;": "\u22c2", - "InvisibleComma;": "\u2063", - "InvisibleTimes;": "\u2062", - "Iogon;": "\u012e", - "Iopf;": "\U0001d540", - "Iota;": "\u0399", - "Iscr;": "\u2110", - "Itilde;": "\u0128", - "Iukcy;": "\u0406", - "Iuml": "\xcf", - "Iuml;": "\xcf", - "Jcirc;": "\u0134", - "Jcy;": "\u0419", - "Jfr;": "\U0001d50d", - "Jopf;": "\U0001d541", - "Jscr;": "\U0001d4a5", - "Jsercy;": "\u0408", - "Jukcy;": "\u0404", - "KHcy;": "\u0425", - "KJcy;": "\u040c", - "Kappa;": "\u039a", - "Kcedil;": "\u0136", - "Kcy;": "\u041a", - "Kfr;": "\U0001d50e", - "Kopf;": "\U0001d542", - "Kscr;": "\U0001d4a6", - "LJcy;": "\u0409", - "LT": "<", - "LT;": "<", - "Lacute;": "\u0139", - "Lambda;": "\u039b", - "Lang;": "\u27ea", - "Laplacetrf;": "\u2112", - "Larr;": "\u219e", - "Lcaron;": "\u013d", - "Lcedil;": "\u013b", - "Lcy;": "\u041b", - "LeftAngleBracket;": "\u27e8", - "LeftArrow;": "\u2190", - "LeftArrowBar;": "\u21e4", - "LeftArrowRightArrow;": "\u21c6", - "LeftCeiling;": "\u2308", - "LeftDoubleBracket;": "\u27e6", - "LeftDownTeeVector;": "\u2961", - "LeftDownVector;": "\u21c3", - "LeftDownVectorBar;": "\u2959", - "LeftFloor;": "\u230a", - "LeftRightArrow;": "\u2194", - "LeftRightVector;": "\u294e", - "LeftTee;": "\u22a3", - "LeftTeeArrow;": "\u21a4", - "LeftTeeVector;": "\u295a", - "LeftTriangle;": "\u22b2", - "LeftTriangleBar;": "\u29cf", - "LeftTriangleEqual;": "\u22b4", - "LeftUpDownVector;": "\u2951", - "LeftUpTeeVector;": "\u2960", - "LeftUpVector;": "\u21bf", - "LeftUpVectorBar;": "\u2958", - "LeftVector;": "\u21bc", - "LeftVectorBar;": "\u2952", - "Leftarrow;": "\u21d0", - "Leftrightarrow;": "\u21d4", - "LessEqualGreater;": "\u22da", - "LessFullEqual;": "\u2266", - "LessGreater;": "\u2276", - "LessLess;": "\u2aa1", - "LessSlantEqual;": "\u2a7d", - "LessTilde;": "\u2272", - "Lfr;": "\U0001d50f", - "Ll;": "\u22d8", - "Lleftarrow;": "\u21da", - "Lmidot;": "\u013f", - "LongLeftArrow;": "\u27f5", - "LongLeftRightArrow;": "\u27f7", - "LongRightArrow;": "\u27f6", - "Longleftarrow;": "\u27f8", - "Longleftrightarrow;": "\u27fa", - "Longrightarrow;": "\u27f9", - "Lopf;": "\U0001d543", - "LowerLeftArrow;": "\u2199", - "LowerRightArrow;": "\u2198", - "Lscr;": "\u2112", - "Lsh;": "\u21b0", - "Lstrok;": "\u0141", - "Lt;": "\u226a", - "Map;": "\u2905", - "Mcy;": "\u041c", - "MediumSpace;": "\u205f", - "Mellintrf;": "\u2133", - "Mfr;": "\U0001d510", - "MinusPlus;": "\u2213", - "Mopf;": "\U0001d544", - "Mscr;": "\u2133", - "Mu;": "\u039c", - "NJcy;": "\u040a", - "Nacute;": "\u0143", - "Ncaron;": "\u0147", - "Ncedil;": "\u0145", - "Ncy;": "\u041d", - "NegativeMediumSpace;": "\u200b", - "NegativeThickSpace;": "\u200b", - "NegativeThinSpace;": "\u200b", - "NegativeVeryThinSpace;": "\u200b", - "NestedGreaterGreater;": "\u226b", - "NestedLessLess;": "\u226a", - "NewLine;": "\n", - "Nfr;": "\U0001d511", - "NoBreak;": "\u2060", - "NonBreakingSpace;": "\xa0", - "Nopf;": "\u2115", - "Not;": "\u2aec", - "NotCongruent;": "\u2262", - "NotCupCap;": "\u226d", - "NotDoubleVerticalBar;": "\u2226", - "NotElement;": "\u2209", - "NotEqual;": "\u2260", - "NotEqualTilde;": "\u2242\u0338", - "NotExists;": "\u2204", - "NotGreater;": "\u226f", - "NotGreaterEqual;": "\u2271", - "NotGreaterFullEqual;": "\u2267\u0338", - "NotGreaterGreater;": "\u226b\u0338", - "NotGreaterLess;": "\u2279", - "NotGreaterSlantEqual;": "\u2a7e\u0338", - "NotGreaterTilde;": "\u2275", - "NotHumpDownHump;": "\u224e\u0338", - "NotHumpEqual;": "\u224f\u0338", - "NotLeftTriangle;": "\u22ea", - "NotLeftTriangleBar;": "\u29cf\u0338", - "NotLeftTriangleEqual;": "\u22ec", - "NotLess;": "\u226e", - "NotLessEqual;": "\u2270", - "NotLessGreater;": "\u2278", - "NotLessLess;": "\u226a\u0338", - "NotLessSlantEqual;": "\u2a7d\u0338", - "NotLessTilde;": "\u2274", - "NotNestedGreaterGreater;": "\u2aa2\u0338", - "NotNestedLessLess;": "\u2aa1\u0338", - "NotPrecedes;": "\u2280", - "NotPrecedesEqual;": "\u2aaf\u0338", - "NotPrecedesSlantEqual;": "\u22e0", - "NotReverseElement;": "\u220c", - "NotRightTriangle;": "\u22eb", - "NotRightTriangleBar;": "\u29d0\u0338", - "NotRightTriangleEqual;": "\u22ed", - "NotSquareSubset;": "\u228f\u0338", - "NotSquareSubsetEqual;": "\u22e2", - "NotSquareSuperset;": "\u2290\u0338", - "NotSquareSupersetEqual;": "\u22e3", - "NotSubset;": "\u2282\u20d2", - "NotSubsetEqual;": "\u2288", - "NotSucceeds;": "\u2281", - "NotSucceedsEqual;": "\u2ab0\u0338", - "NotSucceedsSlantEqual;": "\u22e1", - "NotSucceedsTilde;": "\u227f\u0338", - "NotSuperset;": "\u2283\u20d2", - "NotSupersetEqual;": "\u2289", - "NotTilde;": "\u2241", - "NotTildeEqual;": "\u2244", - "NotTildeFullEqual;": "\u2247", - "NotTildeTilde;": "\u2249", - "NotVerticalBar;": "\u2224", - "Nscr;": "\U0001d4a9", - "Ntilde": "\xd1", - "Ntilde;": "\xd1", - "Nu;": "\u039d", - "OElig;": "\u0152", - "Oacute": "\xd3", - "Oacute;": "\xd3", - "Ocirc": "\xd4", - "Ocirc;": "\xd4", - "Ocy;": "\u041e", - "Odblac;": "\u0150", - "Ofr;": "\U0001d512", - "Ograve": "\xd2", - "Ograve;": "\xd2", - "Omacr;": "\u014c", - "Omega;": "\u03a9", - "Omicron;": "\u039f", - "Oopf;": "\U0001d546", - "OpenCurlyDoubleQuote;": "\u201c", - "OpenCurlyQuote;": "\u2018", - "Or;": "\u2a54", - "Oscr;": "\U0001d4aa", - "Oslash": "\xd8", - "Oslash;": "\xd8", - "Otilde": "\xd5", - "Otilde;": "\xd5", - "Otimes;": "\u2a37", - "Ouml": "\xd6", - "Ouml;": "\xd6", - "OverBar;": "\u203e", - "OverBrace;": "\u23de", - "OverBracket;": "\u23b4", - "OverParenthesis;": "\u23dc", - "PartialD;": "\u2202", - "Pcy;": "\u041f", - "Pfr;": "\U0001d513", - "Phi;": "\u03a6", - "Pi;": "\u03a0", - "PlusMinus;": "\xb1", - "Poincareplane;": "\u210c", - "Popf;": "\u2119", - "Pr;": "\u2abb", - "Precedes;": "\u227a", - "PrecedesEqual;": "\u2aaf", - "PrecedesSlantEqual;": "\u227c", - "PrecedesTilde;": "\u227e", - "Prime;": "\u2033", - "Product;": "\u220f", - "Proportion;": "\u2237", - "Proportional;": "\u221d", - "Pscr;": "\U0001d4ab", - "Psi;": "\u03a8", - "QUOT": "\"", - "QUOT;": "\"", - "Qfr;": "\U0001d514", - "Qopf;": "\u211a", - "Qscr;": "\U0001d4ac", - "RBarr;": "\u2910", - "REG": "\xae", - "REG;": "\xae", - "Racute;": "\u0154", - "Rang;": "\u27eb", - "Rarr;": "\u21a0", - "Rarrtl;": "\u2916", - "Rcaron;": "\u0158", - "Rcedil;": "\u0156", - "Rcy;": "\u0420", - "Re;": "\u211c", - "ReverseElement;": "\u220b", - "ReverseEquilibrium;": "\u21cb", - "ReverseUpEquilibrium;": "\u296f", - "Rfr;": "\u211c", - "Rho;": "\u03a1", - "RightAngleBracket;": "\u27e9", - "RightArrow;": "\u2192", - "RightArrowBar;": "\u21e5", - "RightArrowLeftArrow;": "\u21c4", - "RightCeiling;": "\u2309", - "RightDoubleBracket;": "\u27e7", - "RightDownTeeVector;": "\u295d", - "RightDownVector;": "\u21c2", - "RightDownVectorBar;": "\u2955", - "RightFloor;": "\u230b", - "RightTee;": "\u22a2", - "RightTeeArrow;": "\u21a6", - "RightTeeVector;": "\u295b", - "RightTriangle;": "\u22b3", - "RightTriangleBar;": "\u29d0", - "RightTriangleEqual;": "\u22b5", - "RightUpDownVector;": "\u294f", - "RightUpTeeVector;": "\u295c", - "RightUpVector;": "\u21be", - "RightUpVectorBar;": "\u2954", - "RightVector;": "\u21c0", - "RightVectorBar;": "\u2953", - "Rightarrow;": "\u21d2", - "Ropf;": "\u211d", - "RoundImplies;": "\u2970", - "Rrightarrow;": "\u21db", - "Rscr;": "\u211b", - "Rsh;": "\u21b1", - "RuleDelayed;": "\u29f4", - "SHCHcy;": "\u0429", - "SHcy;": "\u0428", - "SOFTcy;": "\u042c", - "Sacute;": "\u015a", - "Sc;": "\u2abc", - "Scaron;": "\u0160", - "Scedil;": "\u015e", - "Scirc;": "\u015c", - "Scy;": "\u0421", - "Sfr;": "\U0001d516", - "ShortDownArrow;": "\u2193", - "ShortLeftArrow;": "\u2190", - "ShortRightArrow;": "\u2192", - "ShortUpArrow;": "\u2191", - "Sigma;": "\u03a3", - "SmallCircle;": "\u2218", - "Sopf;": "\U0001d54a", - "Sqrt;": "\u221a", - "Square;": "\u25a1", - "SquareIntersection;": "\u2293", - "SquareSubset;": "\u228f", - "SquareSubsetEqual;": "\u2291", - "SquareSuperset;": "\u2290", - "SquareSupersetEqual;": "\u2292", - "SquareUnion;": "\u2294", - "Sscr;": "\U0001d4ae", - "Star;": "\u22c6", - "Sub;": "\u22d0", - "Subset;": "\u22d0", - "SubsetEqual;": "\u2286", - "Succeeds;": "\u227b", - "SucceedsEqual;": "\u2ab0", - "SucceedsSlantEqual;": "\u227d", - "SucceedsTilde;": "\u227f", - "SuchThat;": "\u220b", - "Sum;": "\u2211", - "Sup;": "\u22d1", - "Superset;": "\u2283", - "SupersetEqual;": "\u2287", - "Supset;": "\u22d1", - "THORN": "\xde", - "THORN;": "\xde", - "TRADE;": "\u2122", - "TSHcy;": "\u040b", - "TScy;": "\u0426", - "Tab;": "\t", - "Tau;": "\u03a4", - "Tcaron;": "\u0164", - "Tcedil;": "\u0162", - "Tcy;": "\u0422", - "Tfr;": "\U0001d517", - "Therefore;": "\u2234", - "Theta;": "\u0398", - "ThickSpace;": "\u205f\u200a", - "ThinSpace;": "\u2009", - "Tilde;": "\u223c", - "TildeEqual;": "\u2243", - "TildeFullEqual;": "\u2245", - "TildeTilde;": "\u2248", - "Topf;": "\U0001d54b", - "TripleDot;": "\u20db", - "Tscr;": "\U0001d4af", - "Tstrok;": "\u0166", - "Uacute": "\xda", - "Uacute;": "\xda", - "Uarr;": "\u219f", - "Uarrocir;": "\u2949", - "Ubrcy;": "\u040e", - "Ubreve;": "\u016c", - "Ucirc": "\xdb", - "Ucirc;": "\xdb", - "Ucy;": "\u0423", - "Udblac;": "\u0170", - "Ufr;": "\U0001d518", - "Ugrave": "\xd9", - "Ugrave;": "\xd9", - "Umacr;": "\u016a", - "UnderBar;": "_", - "UnderBrace;": "\u23df", - "UnderBracket;": "\u23b5", - "UnderParenthesis;": "\u23dd", - "Union;": "\u22c3", - "UnionPlus;": "\u228e", - "Uogon;": "\u0172", - "Uopf;": "\U0001d54c", - "UpArrow;": "\u2191", - "UpArrowBar;": "\u2912", - "UpArrowDownArrow;": "\u21c5", - "UpDownArrow;": "\u2195", - "UpEquilibrium;": "\u296e", - "UpTee;": "\u22a5", - "UpTeeArrow;": "\u21a5", - "Uparrow;": "\u21d1", - "Updownarrow;": "\u21d5", - "UpperLeftArrow;": "\u2196", - "UpperRightArrow;": "\u2197", - "Upsi;": "\u03d2", - "Upsilon;": "\u03a5", - "Uring;": "\u016e", - "Uscr;": "\U0001d4b0", - "Utilde;": "\u0168", - "Uuml": "\xdc", - "Uuml;": "\xdc", - "VDash;": "\u22ab", - "Vbar;": "\u2aeb", - "Vcy;": "\u0412", - "Vdash;": "\u22a9", - "Vdashl;": "\u2ae6", - "Vee;": "\u22c1", - "Verbar;": "\u2016", - "Vert;": "\u2016", - "VerticalBar;": "\u2223", - "VerticalLine;": "|", - "VerticalSeparator;": "\u2758", - "VerticalTilde;": "\u2240", - "VeryThinSpace;": "\u200a", - "Vfr;": "\U0001d519", - "Vopf;": "\U0001d54d", - "Vscr;": "\U0001d4b1", - "Vvdash;": "\u22aa", - "Wcirc;": "\u0174", - "Wedge;": "\u22c0", - "Wfr;": "\U0001d51a", - "Wopf;": "\U0001d54e", - "Wscr;": "\U0001d4b2", - "Xfr;": "\U0001d51b", - "Xi;": "\u039e", - "Xopf;": "\U0001d54f", - "Xscr;": "\U0001d4b3", - "YAcy;": "\u042f", - "YIcy;": "\u0407", - "YUcy;": "\u042e", - "Yacute": "\xdd", - "Yacute;": "\xdd", - "Ycirc;": "\u0176", - "Ycy;": "\u042b", - "Yfr;": "\U0001d51c", - "Yopf;": "\U0001d550", - "Yscr;": "\U0001d4b4", - "Yuml;": "\u0178", - "ZHcy;": "\u0416", - "Zacute;": "\u0179", - "Zcaron;": "\u017d", - "Zcy;": "\u0417", - "Zdot;": "\u017b", - "ZeroWidthSpace;": "\u200b", - "Zeta;": "\u0396", - "Zfr;": "\u2128", - "Zopf;": "\u2124", - "Zscr;": "\U0001d4b5", - "aacute": "\xe1", - "aacute;": "\xe1", - "abreve;": "\u0103", - "ac;": "\u223e", - "acE;": "\u223e\u0333", - "acd;": "\u223f", - "acirc": "\xe2", - "acirc;": "\xe2", - "acute": "\xb4", - "acute;": "\xb4", - "acy;": "\u0430", - "aelig": "\xe6", - "aelig;": "\xe6", - "af;": "\u2061", - "afr;": "\U0001d51e", - "agrave": "\xe0", - "agrave;": "\xe0", - "alefsym;": "\u2135", - "aleph;": "\u2135", - "alpha;": "\u03b1", - "amacr;": "\u0101", - "amalg;": "\u2a3f", - "amp": "&", - "amp;": "&", - "and;": "\u2227", - "andand;": "\u2a55", - "andd;": "\u2a5c", - "andslope;": "\u2a58", - "andv;": "\u2a5a", - "ang;": "\u2220", - "ange;": "\u29a4", - "angle;": "\u2220", - "angmsd;": "\u2221", - "angmsdaa;": "\u29a8", - "angmsdab;": "\u29a9", - "angmsdac;": "\u29aa", - "angmsdad;": "\u29ab", - "angmsdae;": "\u29ac", - "angmsdaf;": "\u29ad", - "angmsdag;": "\u29ae", - "angmsdah;": "\u29af", - "angrt;": "\u221f", - "angrtvb;": "\u22be", - "angrtvbd;": "\u299d", - "angsph;": "\u2222", - "angst;": "\xc5", - "angzarr;": "\u237c", - "aogon;": "\u0105", - "aopf;": "\U0001d552", - "ap;": "\u2248", - "apE;": "\u2a70", - "apacir;": "\u2a6f", - "ape;": "\u224a", - "apid;": "\u224b", - "apos;": "'", - "approx;": "\u2248", - "approxeq;": "\u224a", - "aring": "\xe5", - "aring;": "\xe5", - "ascr;": "\U0001d4b6", - "ast;": "*", - "asymp;": "\u2248", - "asympeq;": "\u224d", - "atilde": "\xe3", - "atilde;": "\xe3", - "auml": "\xe4", - "auml;": "\xe4", - "awconint;": "\u2233", - "awint;": "\u2a11", - "bNot;": "\u2aed", - "backcong;": "\u224c", - "backepsilon;": "\u03f6", - "backprime;": "\u2035", - "backsim;": "\u223d", - "backsimeq;": "\u22cd", - "barvee;": "\u22bd", - "barwed;": "\u2305", - "barwedge;": "\u2305", - "bbrk;": "\u23b5", - "bbrktbrk;": "\u23b6", - "bcong;": "\u224c", - "bcy;": "\u0431", - "bdquo;": "\u201e", - "becaus;": "\u2235", - "because;": "\u2235", - "bemptyv;": "\u29b0", - "bepsi;": "\u03f6", - "bernou;": "\u212c", - "beta;": "\u03b2", - "beth;": "\u2136", - "between;": "\u226c", - "bfr;": "\U0001d51f", - "bigcap;": "\u22c2", - "bigcirc;": "\u25ef", - "bigcup;": "\u22c3", - "bigodot;": "\u2a00", - "bigoplus;": "\u2a01", - "bigotimes;": "\u2a02", - "bigsqcup;": "\u2a06", - "bigstar;": "\u2605", - "bigtriangledown;": "\u25bd", - "bigtriangleup;": "\u25b3", - "biguplus;": "\u2a04", - "bigvee;": "\u22c1", - "bigwedge;": "\u22c0", - "bkarow;": "\u290d", - "blacklozenge;": "\u29eb", - "blacksquare;": "\u25aa", - "blacktriangle;": "\u25b4", - "blacktriangledown;": "\u25be", - "blacktriangleleft;": "\u25c2", - "blacktriangleright;": "\u25b8", - "blank;": "\u2423", - "blk12;": "\u2592", - "blk14;": "\u2591", - "blk34;": "\u2593", - "block;": "\u2588", - "bne;": "=\u20e5", - "bnequiv;": "\u2261\u20e5", - "bnot;": "\u2310", - "bopf;": "\U0001d553", - "bot;": "\u22a5", - "bottom;": "\u22a5", - "bowtie;": "\u22c8", - "boxDL;": "\u2557", - "boxDR;": "\u2554", - "boxDl;": "\u2556", - "boxDr;": "\u2553", - "boxH;": "\u2550", - "boxHD;": "\u2566", - "boxHU;": "\u2569", - "boxHd;": "\u2564", - "boxHu;": "\u2567", - "boxUL;": "\u255d", - "boxUR;": "\u255a", - "boxUl;": "\u255c", - "boxUr;": "\u2559", - "boxV;": "\u2551", - "boxVH;": "\u256c", - "boxVL;": "\u2563", - "boxVR;": "\u2560", - "boxVh;": "\u256b", - "boxVl;": "\u2562", - "boxVr;": "\u255f", - "boxbox;": "\u29c9", - "boxdL;": "\u2555", - "boxdR;": "\u2552", - "boxdl;": "\u2510", - "boxdr;": "\u250c", - "boxh;": "\u2500", - "boxhD;": "\u2565", - "boxhU;": "\u2568", - "boxhd;": "\u252c", - "boxhu;": "\u2534", - "boxminus;": "\u229f", - "boxplus;": "\u229e", - "boxtimes;": "\u22a0", - "boxuL;": "\u255b", - "boxuR;": "\u2558", - "boxul;": "\u2518", - "boxur;": "\u2514", - "boxv;": "\u2502", - "boxvH;": "\u256a", - "boxvL;": "\u2561", - "boxvR;": "\u255e", - "boxvh;": "\u253c", - "boxvl;": "\u2524", - "boxvr;": "\u251c", - "bprime;": "\u2035", - "breve;": "\u02d8", - "brvbar": "\xa6", - "brvbar;": "\xa6", - "bscr;": "\U0001d4b7", - "bsemi;": "\u204f", - "bsim;": "\u223d", - "bsime;": "\u22cd", - "bsol;": "\\", - "bsolb;": "\u29c5", - "bsolhsub;": "\u27c8", - "bull;": "\u2022", - "bullet;": "\u2022", - "bump;": "\u224e", - "bumpE;": "\u2aae", - "bumpe;": "\u224f", - "bumpeq;": "\u224f", - "cacute;": "\u0107", - "cap;": "\u2229", - "capand;": "\u2a44", - "capbrcup;": "\u2a49", - "capcap;": "\u2a4b", - "capcup;": "\u2a47", - "capdot;": "\u2a40", - "caps;": "\u2229\ufe00", - "caret;": "\u2041", - "caron;": "\u02c7", - "ccaps;": "\u2a4d", - "ccaron;": "\u010d", - "ccedil": "\xe7", - "ccedil;": "\xe7", - "ccirc;": "\u0109", - "ccups;": "\u2a4c", - "ccupssm;": "\u2a50", - "cdot;": "\u010b", - "cedil": "\xb8", - "cedil;": "\xb8", - "cemptyv;": "\u29b2", - "cent": "\xa2", - "cent;": "\xa2", - "centerdot;": "\xb7", - "cfr;": "\U0001d520", - "chcy;": "\u0447", - "check;": "\u2713", - "checkmark;": "\u2713", - "chi;": "\u03c7", - "cir;": "\u25cb", - "cirE;": "\u29c3", - "circ;": "\u02c6", - "circeq;": "\u2257", - "circlearrowleft;": "\u21ba", - "circlearrowright;": "\u21bb", - "circledR;": "\xae", - "circledS;": "\u24c8", - "circledast;": "\u229b", - "circledcirc;": "\u229a", - "circleddash;": "\u229d", - "cire;": "\u2257", - "cirfnint;": "\u2a10", - "cirmid;": "\u2aef", - "cirscir;": "\u29c2", - "clubs;": "\u2663", - "clubsuit;": "\u2663", - "colon;": ":", - "colone;": "\u2254", - "coloneq;": "\u2254", - "comma;": ",", - "commat;": "@", - "comp;": "\u2201", - "compfn;": "\u2218", - "complement;": "\u2201", - "complexes;": "\u2102", - "cong;": "\u2245", - "congdot;": "\u2a6d", - "conint;": "\u222e", - "copf;": "\U0001d554", - "coprod;": "\u2210", - "copy": "\xa9", - "copy;": "\xa9", - "copysr;": "\u2117", - "crarr;": "\u21b5", - "cross;": "\u2717", - "cscr;": "\U0001d4b8", - "csub;": "\u2acf", - "csube;": "\u2ad1", - "csup;": "\u2ad0", - "csupe;": "\u2ad2", - "ctdot;": "\u22ef", - "cudarrl;": "\u2938", - "cudarrr;": "\u2935", - "cuepr;": "\u22de", - "cuesc;": "\u22df", - "cularr;": "\u21b6", - "cularrp;": "\u293d", - "cup;": "\u222a", - "cupbrcap;": "\u2a48", - "cupcap;": "\u2a46", - "cupcup;": "\u2a4a", - "cupdot;": "\u228d", - "cupor;": "\u2a45", - "cups;": "\u222a\ufe00", - "curarr;": "\u21b7", - "curarrm;": "\u293c", - "curlyeqprec;": "\u22de", - "curlyeqsucc;": "\u22df", - "curlyvee;": "\u22ce", - "curlywedge;": "\u22cf", - "curren": "\xa4", - "curren;": "\xa4", - "curvearrowleft;": "\u21b6", - "curvearrowright;": "\u21b7", - "cuvee;": "\u22ce", - "cuwed;": "\u22cf", - "cwconint;": "\u2232", - "cwint;": "\u2231", - "cylcty;": "\u232d", - "dArr;": "\u21d3", - "dHar;": "\u2965", - "dagger;": "\u2020", - "daleth;": "\u2138", - "darr;": "\u2193", - "dash;": "\u2010", - "dashv;": "\u22a3", - "dbkarow;": "\u290f", - "dblac;": "\u02dd", - "dcaron;": "\u010f", - "dcy;": "\u0434", - "dd;": "\u2146", - "ddagger;": "\u2021", - "ddarr;": "\u21ca", - "ddotseq;": "\u2a77", - "deg": "\xb0", - "deg;": "\xb0", - "delta;": "\u03b4", - "demptyv;": "\u29b1", - "dfisht;": "\u297f", - "dfr;": "\U0001d521", - "dharl;": "\u21c3", - "dharr;": "\u21c2", - "diam;": "\u22c4", - "diamond;": "\u22c4", - "diamondsuit;": "\u2666", - "diams;": "\u2666", - "die;": "\xa8", - "digamma;": "\u03dd", - "disin;": "\u22f2", - "div;": "\xf7", - "divide": "\xf7", - "divide;": "\xf7", - "divideontimes;": "\u22c7", - "divonx;": "\u22c7", - "djcy;": "\u0452", - "dlcorn;": "\u231e", - "dlcrop;": "\u230d", - "dollar;": "$", - "dopf;": "\U0001d555", - "dot;": "\u02d9", - "doteq;": "\u2250", - "doteqdot;": "\u2251", - "dotminus;": "\u2238", - "dotplus;": "\u2214", - "dotsquare;": "\u22a1", - "doublebarwedge;": "\u2306", - "downarrow;": "\u2193", - "downdownarrows;": "\u21ca", - "downharpoonleft;": "\u21c3", - "downharpoonright;": "\u21c2", - "drbkarow;": "\u2910", - "drcorn;": "\u231f", - "drcrop;": "\u230c", - "dscr;": "\U0001d4b9", - "dscy;": "\u0455", - "dsol;": "\u29f6", - "dstrok;": "\u0111", - "dtdot;": "\u22f1", - "dtri;": "\u25bf", - "dtrif;": "\u25be", - "duarr;": "\u21f5", - "duhar;": "\u296f", - "dwangle;": "\u29a6", - "dzcy;": "\u045f", - "dzigrarr;": "\u27ff", - "eDDot;": "\u2a77", - "eDot;": "\u2251", - "eacute": "\xe9", - "eacute;": "\xe9", - "easter;": "\u2a6e", - "ecaron;": "\u011b", - "ecir;": "\u2256", - "ecirc": "\xea", - "ecirc;": "\xea", - "ecolon;": "\u2255", - "ecy;": "\u044d", - "edot;": "\u0117", - "ee;": "\u2147", - "efDot;": "\u2252", - "efr;": "\U0001d522", - "eg;": "\u2a9a", - "egrave": "\xe8", - "egrave;": "\xe8", - "egs;": "\u2a96", - "egsdot;": "\u2a98", - "el;": "\u2a99", - "elinters;": "\u23e7", - "ell;": "\u2113", - "els;": "\u2a95", - "elsdot;": "\u2a97", - "emacr;": "\u0113", - "empty;": "\u2205", - "emptyset;": "\u2205", - "emptyv;": "\u2205", - "emsp13;": "\u2004", - "emsp14;": "\u2005", - "emsp;": "\u2003", - "eng;": "\u014b", - "ensp;": "\u2002", - "eogon;": "\u0119", - "eopf;": "\U0001d556", - "epar;": "\u22d5", - "eparsl;": "\u29e3", - "eplus;": "\u2a71", - "epsi;": "\u03b5", - "epsilon;": "\u03b5", - "epsiv;": "\u03f5", - "eqcirc;": "\u2256", - "eqcolon;": "\u2255", - "eqsim;": "\u2242", - "eqslantgtr;": "\u2a96", - "eqslantless;": "\u2a95", - "equals;": "=", - "equest;": "\u225f", - "equiv;": "\u2261", - "equivDD;": "\u2a78", - "eqvparsl;": "\u29e5", - "erDot;": "\u2253", - "erarr;": "\u2971", - "escr;": "\u212f", - "esdot;": "\u2250", - "esim;": "\u2242", - "eta;": "\u03b7", - "eth": "\xf0", - "eth;": "\xf0", - "euml": "\xeb", - "euml;": "\xeb", - "euro;": "\u20ac", - "excl;": "!", - "exist;": "\u2203", - "expectation;": "\u2130", - "exponentiale;": "\u2147", - "fallingdotseq;": "\u2252", - "fcy;": "\u0444", - "female;": "\u2640", - "ffilig;": "\ufb03", - "fflig;": "\ufb00", - "ffllig;": "\ufb04", - "ffr;": "\U0001d523", - "filig;": "\ufb01", - "fjlig;": "fj", - "flat;": "\u266d", - "fllig;": "\ufb02", - "fltns;": "\u25b1", - "fnof;": "\u0192", - "fopf;": "\U0001d557", - "forall;": "\u2200", - "fork;": "\u22d4", - "forkv;": "\u2ad9", - "fpartint;": "\u2a0d", - "frac12": "\xbd", - "frac12;": "\xbd", - "frac13;": "\u2153", - "frac14": "\xbc", - "frac14;": "\xbc", - "frac15;": "\u2155", - "frac16;": "\u2159", - "frac18;": "\u215b", - "frac23;": "\u2154", - "frac25;": "\u2156", - "frac34": "\xbe", - "frac34;": "\xbe", - "frac35;": "\u2157", - "frac38;": "\u215c", - "frac45;": "\u2158", - "frac56;": "\u215a", - "frac58;": "\u215d", - "frac78;": "\u215e", - "frasl;": "\u2044", - "frown;": "\u2322", - "fscr;": "\U0001d4bb", - "gE;": "\u2267", - "gEl;": "\u2a8c", - "gacute;": "\u01f5", - "gamma;": "\u03b3", - "gammad;": "\u03dd", - "gap;": "\u2a86", - "gbreve;": "\u011f", - "gcirc;": "\u011d", - "gcy;": "\u0433", - "gdot;": "\u0121", - "ge;": "\u2265", - "gel;": "\u22db", - "geq;": "\u2265", - "geqq;": "\u2267", - "geqslant;": "\u2a7e", - "ges;": "\u2a7e", - "gescc;": "\u2aa9", - "gesdot;": "\u2a80", - "gesdoto;": "\u2a82", - "gesdotol;": "\u2a84", - "gesl;": "\u22db\ufe00", - "gesles;": "\u2a94", - "gfr;": "\U0001d524", - "gg;": "\u226b", - "ggg;": "\u22d9", - "gimel;": "\u2137", - "gjcy;": "\u0453", - "gl;": "\u2277", - "glE;": "\u2a92", - "gla;": "\u2aa5", - "glj;": "\u2aa4", - "gnE;": "\u2269", - "gnap;": "\u2a8a", - "gnapprox;": "\u2a8a", - "gne;": "\u2a88", - "gneq;": "\u2a88", - "gneqq;": "\u2269", - "gnsim;": "\u22e7", - "gopf;": "\U0001d558", - "grave;": "`", - "gscr;": "\u210a", - "gsim;": "\u2273", - "gsime;": "\u2a8e", - "gsiml;": "\u2a90", - "gt": ">", - "gt;": ">", - "gtcc;": "\u2aa7", - "gtcir;": "\u2a7a", - "gtdot;": "\u22d7", - "gtlPar;": "\u2995", - "gtquest;": "\u2a7c", - "gtrapprox;": "\u2a86", - "gtrarr;": "\u2978", - "gtrdot;": "\u22d7", - "gtreqless;": "\u22db", - "gtreqqless;": "\u2a8c", - "gtrless;": "\u2277", - "gtrsim;": "\u2273", - "gvertneqq;": "\u2269\ufe00", - "gvnE;": "\u2269\ufe00", - "hArr;": "\u21d4", - "hairsp;": "\u200a", - "half;": "\xbd", - "hamilt;": "\u210b", - "hardcy;": "\u044a", - "harr;": "\u2194", - "harrcir;": "\u2948", - "harrw;": "\u21ad", - "hbar;": "\u210f", - "hcirc;": "\u0125", - "hearts;": "\u2665", - "heartsuit;": "\u2665", - "hellip;": "\u2026", - "hercon;": "\u22b9", - "hfr;": "\U0001d525", - "hksearow;": "\u2925", - "hkswarow;": "\u2926", - "hoarr;": "\u21ff", - "homtht;": "\u223b", - "hookleftarrow;": "\u21a9", - "hookrightarrow;": "\u21aa", - "hopf;": "\U0001d559", - "horbar;": "\u2015", - "hscr;": "\U0001d4bd", - "hslash;": "\u210f", - "hstrok;": "\u0127", - "hybull;": "\u2043", - "hyphen;": "\u2010", - "iacute": "\xed", - "iacute;": "\xed", - "ic;": "\u2063", - "icirc": "\xee", - "icirc;": "\xee", - "icy;": "\u0438", - "iecy;": "\u0435", - "iexcl": "\xa1", - "iexcl;": "\xa1", - "iff;": "\u21d4", - "ifr;": "\U0001d526", - "igrave": "\xec", - "igrave;": "\xec", - "ii;": "\u2148", - "iiiint;": "\u2a0c", - "iiint;": "\u222d", - "iinfin;": "\u29dc", - "iiota;": "\u2129", - "ijlig;": "\u0133", - "imacr;": "\u012b", - "image;": "\u2111", - "imagline;": "\u2110", - "imagpart;": "\u2111", - "imath;": "\u0131", - "imof;": "\u22b7", - "imped;": "\u01b5", - "in;": "\u2208", - "incare;": "\u2105", - "infin;": "\u221e", - "infintie;": "\u29dd", - "inodot;": "\u0131", - "int;": "\u222b", - "intcal;": "\u22ba", - "integers;": "\u2124", - "intercal;": "\u22ba", - "intlarhk;": "\u2a17", - "intprod;": "\u2a3c", - "iocy;": "\u0451", - "iogon;": "\u012f", - "iopf;": "\U0001d55a", - "iota;": "\u03b9", - "iprod;": "\u2a3c", - "iquest": "\xbf", - "iquest;": "\xbf", - "iscr;": "\U0001d4be", - "isin;": "\u2208", - "isinE;": "\u22f9", - "isindot;": "\u22f5", - "isins;": "\u22f4", - "isinsv;": "\u22f3", - "isinv;": "\u2208", - "it;": "\u2062", - "itilde;": "\u0129", - "iukcy;": "\u0456", - "iuml": "\xef", - "iuml;": "\xef", - "jcirc;": "\u0135", - "jcy;": "\u0439", - "jfr;": "\U0001d527", - "jmath;": "\u0237", - "jopf;": "\U0001d55b", - "jscr;": "\U0001d4bf", - "jsercy;": "\u0458", - "jukcy;": "\u0454", - "kappa;": "\u03ba", - "kappav;": "\u03f0", - "kcedil;": "\u0137", - "kcy;": "\u043a", - "kfr;": "\U0001d528", - "kgreen;": "\u0138", - "khcy;": "\u0445", - "kjcy;": "\u045c", - "kopf;": "\U0001d55c", - "kscr;": "\U0001d4c0", - "lAarr;": "\u21da", - "lArr;": "\u21d0", - "lAtail;": "\u291b", - "lBarr;": "\u290e", - "lE;": "\u2266", - "lEg;": "\u2a8b", - "lHar;": "\u2962", - "lacute;": "\u013a", - "laemptyv;": "\u29b4", - "lagran;": "\u2112", - "lambda;": "\u03bb", - "lang;": "\u27e8", - "langd;": "\u2991", - "langle;": "\u27e8", - "lap;": "\u2a85", - "laquo": "\xab", - "laquo;": "\xab", - "larr;": "\u2190", - "larrb;": "\u21e4", - "larrbfs;": "\u291f", - "larrfs;": "\u291d", - "larrhk;": "\u21a9", - "larrlp;": "\u21ab", - "larrpl;": "\u2939", - "larrsim;": "\u2973", - "larrtl;": "\u21a2", - "lat;": "\u2aab", - "latail;": "\u2919", - "late;": "\u2aad", - "lates;": "\u2aad\ufe00", - "lbarr;": "\u290c", - "lbbrk;": "\u2772", - "lbrace;": "{", - "lbrack;": "[", - "lbrke;": "\u298b", - "lbrksld;": "\u298f", - "lbrkslu;": "\u298d", - "lcaron;": "\u013e", - "lcedil;": "\u013c", - "lceil;": "\u2308", - "lcub;": "{", - "lcy;": "\u043b", - "ldca;": "\u2936", - "ldquo;": "\u201c", - "ldquor;": "\u201e", - "ldrdhar;": "\u2967", - "ldrushar;": "\u294b", - "ldsh;": "\u21b2", - "le;": "\u2264", - "leftarrow;": "\u2190", - "leftarrowtail;": "\u21a2", - "leftharpoondown;": "\u21bd", - "leftharpoonup;": "\u21bc", - "leftleftarrows;": "\u21c7", - "leftrightarrow;": "\u2194", - "leftrightarrows;": "\u21c6", - "leftrightharpoons;": "\u21cb", - "leftrightsquigarrow;": "\u21ad", - "leftthreetimes;": "\u22cb", - "leg;": "\u22da", - "leq;": "\u2264", - "leqq;": "\u2266", - "leqslant;": "\u2a7d", - "les;": "\u2a7d", - "lescc;": "\u2aa8", - "lesdot;": "\u2a7f", - "lesdoto;": "\u2a81", - "lesdotor;": "\u2a83", - "lesg;": "\u22da\ufe00", - "lesges;": "\u2a93", - "lessapprox;": "\u2a85", - "lessdot;": "\u22d6", - "lesseqgtr;": "\u22da", - "lesseqqgtr;": "\u2a8b", - "lessgtr;": "\u2276", - "lesssim;": "\u2272", - "lfisht;": "\u297c", - "lfloor;": "\u230a", - "lfr;": "\U0001d529", - "lg;": "\u2276", - "lgE;": "\u2a91", - "lhard;": "\u21bd", - "lharu;": "\u21bc", - "lharul;": "\u296a", - "lhblk;": "\u2584", - "ljcy;": "\u0459", - "ll;": "\u226a", - "llarr;": "\u21c7", - "llcorner;": "\u231e", - "llhard;": "\u296b", - "lltri;": "\u25fa", - "lmidot;": "\u0140", - "lmoust;": "\u23b0", - "lmoustache;": "\u23b0", - "lnE;": "\u2268", - "lnap;": "\u2a89", - "lnapprox;": "\u2a89", - "lne;": "\u2a87", - "lneq;": "\u2a87", - "lneqq;": "\u2268", - "lnsim;": "\u22e6", - "loang;": "\u27ec", - "loarr;": "\u21fd", - "lobrk;": "\u27e6", - "longleftarrow;": "\u27f5", - "longleftrightarrow;": "\u27f7", - "longmapsto;": "\u27fc", - "longrightarrow;": "\u27f6", - "looparrowleft;": "\u21ab", - "looparrowright;": "\u21ac", - "lopar;": "\u2985", - "lopf;": "\U0001d55d", - "loplus;": "\u2a2d", - "lotimes;": "\u2a34", - "lowast;": "\u2217", - "lowbar;": "_", - "loz;": "\u25ca", - "lozenge;": "\u25ca", - "lozf;": "\u29eb", - "lpar;": "(", - "lparlt;": "\u2993", - "lrarr;": "\u21c6", - "lrcorner;": "\u231f", - "lrhar;": "\u21cb", - "lrhard;": "\u296d", - "lrm;": "\u200e", - "lrtri;": "\u22bf", - "lsaquo;": "\u2039", - "lscr;": "\U0001d4c1", - "lsh;": "\u21b0", - "lsim;": "\u2272", - "lsime;": "\u2a8d", - "lsimg;": "\u2a8f", - "lsqb;": "[", - "lsquo;": "\u2018", - "lsquor;": "\u201a", - "lstrok;": "\u0142", - "lt": "<", - "lt;": "<", - "ltcc;": "\u2aa6", - "ltcir;": "\u2a79", - "ltdot;": "\u22d6", - "lthree;": "\u22cb", - "ltimes;": "\u22c9", - "ltlarr;": "\u2976", - "ltquest;": "\u2a7b", - "ltrPar;": "\u2996", - "ltri;": "\u25c3", - "ltrie;": "\u22b4", - "ltrif;": "\u25c2", - "lurdshar;": "\u294a", - "luruhar;": "\u2966", - "lvertneqq;": "\u2268\ufe00", - "lvnE;": "\u2268\ufe00", - "mDDot;": "\u223a", - "macr": "\xaf", - "macr;": "\xaf", - "male;": "\u2642", - "malt;": "\u2720", - "maltese;": "\u2720", - "map;": "\u21a6", - "mapsto;": "\u21a6", - "mapstodown;": "\u21a7", - "mapstoleft;": "\u21a4", - "mapstoup;": "\u21a5", - "marker;": "\u25ae", - "mcomma;": "\u2a29", - "mcy;": "\u043c", - "mdash;": "\u2014", - "measuredangle;": "\u2221", - "mfr;": "\U0001d52a", - "mho;": "\u2127", - "micro": "\xb5", - "micro;": "\xb5", - "mid;": "\u2223", - "midast;": "*", - "midcir;": "\u2af0", - "middot": "\xb7", - "middot;": "\xb7", - "minus;": "\u2212", - "minusb;": "\u229f", - "minusd;": "\u2238", - "minusdu;": "\u2a2a", - "mlcp;": "\u2adb", - "mldr;": "\u2026", - "mnplus;": "\u2213", - "models;": "\u22a7", - "mopf;": "\U0001d55e", - "mp;": "\u2213", - "mscr;": "\U0001d4c2", - "mstpos;": "\u223e", - "mu;": "\u03bc", - "multimap;": "\u22b8", - "mumap;": "\u22b8", - "nGg;": "\u22d9\u0338", - "nGt;": "\u226b\u20d2", - "nGtv;": "\u226b\u0338", - "nLeftarrow;": "\u21cd", - "nLeftrightarrow;": "\u21ce", - "nLl;": "\u22d8\u0338", - "nLt;": "\u226a\u20d2", - "nLtv;": "\u226a\u0338", - "nRightarrow;": "\u21cf", - "nVDash;": "\u22af", - "nVdash;": "\u22ae", - "nabla;": "\u2207", - "nacute;": "\u0144", - "nang;": "\u2220\u20d2", - "nap;": "\u2249", - "napE;": "\u2a70\u0338", - "napid;": "\u224b\u0338", - "napos;": "\u0149", - "napprox;": "\u2249", - "natur;": "\u266e", - "natural;": "\u266e", - "naturals;": "\u2115", - "nbsp": "\xa0", - "nbsp;": "\xa0", - "nbump;": "\u224e\u0338", - "nbumpe;": "\u224f\u0338", - "ncap;": "\u2a43", - "ncaron;": "\u0148", - "ncedil;": "\u0146", - "ncong;": "\u2247", - "ncongdot;": "\u2a6d\u0338", - "ncup;": "\u2a42", - "ncy;": "\u043d", - "ndash;": "\u2013", - "ne;": "\u2260", - "neArr;": "\u21d7", - "nearhk;": "\u2924", - "nearr;": "\u2197", - "nearrow;": "\u2197", - "nedot;": "\u2250\u0338", - "nequiv;": "\u2262", - "nesear;": "\u2928", - "nesim;": "\u2242\u0338", - "nexist;": "\u2204", - "nexists;": "\u2204", - "nfr;": "\U0001d52b", - "ngE;": "\u2267\u0338", - "nge;": "\u2271", - "ngeq;": "\u2271", - "ngeqq;": "\u2267\u0338", - "ngeqslant;": "\u2a7e\u0338", - "nges;": "\u2a7e\u0338", - "ngsim;": "\u2275", - "ngt;": "\u226f", - "ngtr;": "\u226f", - "nhArr;": "\u21ce", - "nharr;": "\u21ae", - "nhpar;": "\u2af2", - "ni;": "\u220b", - "nis;": "\u22fc", - "nisd;": "\u22fa", - "niv;": "\u220b", - "njcy;": "\u045a", - "nlArr;": "\u21cd", - "nlE;": "\u2266\u0338", - "nlarr;": "\u219a", - "nldr;": "\u2025", - "nle;": "\u2270", - "nleftarrow;": "\u219a", - "nleftrightarrow;": "\u21ae", - "nleq;": "\u2270", - "nleqq;": "\u2266\u0338", - "nleqslant;": "\u2a7d\u0338", - "nles;": "\u2a7d\u0338", - "nless;": "\u226e", - "nlsim;": "\u2274", - "nlt;": "\u226e", - "nltri;": "\u22ea", - "nltrie;": "\u22ec", - "nmid;": "\u2224", - "nopf;": "\U0001d55f", - "not": "\xac", - "not;": "\xac", - "notin;": "\u2209", - "notinE;": "\u22f9\u0338", - "notindot;": "\u22f5\u0338", - "notinva;": "\u2209", - "notinvb;": "\u22f7", - "notinvc;": "\u22f6", - "notni;": "\u220c", - "notniva;": "\u220c", - "notnivb;": "\u22fe", - "notnivc;": "\u22fd", - "npar;": "\u2226", - "nparallel;": "\u2226", - "nparsl;": "\u2afd\u20e5", - "npart;": "\u2202\u0338", - "npolint;": "\u2a14", - "npr;": "\u2280", - "nprcue;": "\u22e0", - "npre;": "\u2aaf\u0338", - "nprec;": "\u2280", - "npreceq;": "\u2aaf\u0338", - "nrArr;": "\u21cf", - "nrarr;": "\u219b", - "nrarrc;": "\u2933\u0338", - "nrarrw;": "\u219d\u0338", - "nrightarrow;": "\u219b", - "nrtri;": "\u22eb", - "nrtrie;": "\u22ed", - "nsc;": "\u2281", - "nsccue;": "\u22e1", - "nsce;": "\u2ab0\u0338", - "nscr;": "\U0001d4c3", - "nshortmid;": "\u2224", - "nshortparallel;": "\u2226", - "nsim;": "\u2241", - "nsime;": "\u2244", - "nsimeq;": "\u2244", - "nsmid;": "\u2224", - "nspar;": "\u2226", - "nsqsube;": "\u22e2", - "nsqsupe;": "\u22e3", - "nsub;": "\u2284", - "nsubE;": "\u2ac5\u0338", - "nsube;": "\u2288", - "nsubset;": "\u2282\u20d2", - "nsubseteq;": "\u2288", - "nsubseteqq;": "\u2ac5\u0338", - "nsucc;": "\u2281", - "nsucceq;": "\u2ab0\u0338", - "nsup;": "\u2285", - "nsupE;": "\u2ac6\u0338", - "nsupe;": "\u2289", - "nsupset;": "\u2283\u20d2", - "nsupseteq;": "\u2289", - "nsupseteqq;": "\u2ac6\u0338", - "ntgl;": "\u2279", - "ntilde": "\xf1", - "ntilde;": "\xf1", - "ntlg;": "\u2278", - "ntriangleleft;": "\u22ea", - "ntrianglelefteq;": "\u22ec", - "ntriangleright;": "\u22eb", - "ntrianglerighteq;": "\u22ed", - "nu;": "\u03bd", - "num;": "#", - "numero;": "\u2116", - "numsp;": "\u2007", - "nvDash;": "\u22ad", - "nvHarr;": "\u2904", - "nvap;": "\u224d\u20d2", - "nvdash;": "\u22ac", - "nvge;": "\u2265\u20d2", - "nvgt;": ">\u20d2", - "nvinfin;": "\u29de", - "nvlArr;": "\u2902", - "nvle;": "\u2264\u20d2", - "nvlt;": "<\u20d2", - "nvltrie;": "\u22b4\u20d2", - "nvrArr;": "\u2903", - "nvrtrie;": "\u22b5\u20d2", - "nvsim;": "\u223c\u20d2", - "nwArr;": "\u21d6", - "nwarhk;": "\u2923", - "nwarr;": "\u2196", - "nwarrow;": "\u2196", - "nwnear;": "\u2927", - "oS;": "\u24c8", - "oacute": "\xf3", - "oacute;": "\xf3", - "oast;": "\u229b", - "ocir;": "\u229a", - "ocirc": "\xf4", - "ocirc;": "\xf4", - "ocy;": "\u043e", - "odash;": "\u229d", - "odblac;": "\u0151", - "odiv;": "\u2a38", - "odot;": "\u2299", - "odsold;": "\u29bc", - "oelig;": "\u0153", - "ofcir;": "\u29bf", - "ofr;": "\U0001d52c", - "ogon;": "\u02db", - "ograve": "\xf2", - "ograve;": "\xf2", - "ogt;": "\u29c1", - "ohbar;": "\u29b5", - "ohm;": "\u03a9", - "oint;": "\u222e", - "olarr;": "\u21ba", - "olcir;": "\u29be", - "olcross;": "\u29bb", - "oline;": "\u203e", - "olt;": "\u29c0", - "omacr;": "\u014d", - "omega;": "\u03c9", - "omicron;": "\u03bf", - "omid;": "\u29b6", - "ominus;": "\u2296", - "oopf;": "\U0001d560", - "opar;": "\u29b7", - "operp;": "\u29b9", - "oplus;": "\u2295", - "or;": "\u2228", - "orarr;": "\u21bb", - "ord;": "\u2a5d", - "order;": "\u2134", - "orderof;": "\u2134", - "ordf": "\xaa", - "ordf;": "\xaa", - "ordm": "\xba", - "ordm;": "\xba", - "origof;": "\u22b6", - "oror;": "\u2a56", - "orslope;": "\u2a57", - "orv;": "\u2a5b", - "oscr;": "\u2134", - "oslash": "\xf8", - "oslash;": "\xf8", - "osol;": "\u2298", - "otilde": "\xf5", - "otilde;": "\xf5", - "otimes;": "\u2297", - "otimesas;": "\u2a36", - "ouml": "\xf6", - "ouml;": "\xf6", - "ovbar;": "\u233d", - "par;": "\u2225", - "para": "\xb6", - "para;": "\xb6", - "parallel;": "\u2225", - "parsim;": "\u2af3", - "parsl;": "\u2afd", - "part;": "\u2202", - "pcy;": "\u043f", - "percnt;": "%", - "period;": ".", - "permil;": "\u2030", - "perp;": "\u22a5", - "pertenk;": "\u2031", - "pfr;": "\U0001d52d", - "phi;": "\u03c6", - "phiv;": "\u03d5", - "phmmat;": "\u2133", - "phone;": "\u260e", - "pi;": "\u03c0", - "pitchfork;": "\u22d4", - "piv;": "\u03d6", - "planck;": "\u210f", - "planckh;": "\u210e", - "plankv;": "\u210f", - "plus;": "+", - "plusacir;": "\u2a23", - "plusb;": "\u229e", - "pluscir;": "\u2a22", - "plusdo;": "\u2214", - "plusdu;": "\u2a25", - "pluse;": "\u2a72", - "plusmn": "\xb1", - "plusmn;": "\xb1", - "plussim;": "\u2a26", - "plustwo;": "\u2a27", - "pm;": "\xb1", - "pointint;": "\u2a15", - "popf;": "\U0001d561", - "pound": "\xa3", - "pound;": "\xa3", - "pr;": "\u227a", - "prE;": "\u2ab3", - "prap;": "\u2ab7", - "prcue;": "\u227c", - "pre;": "\u2aaf", - "prec;": "\u227a", - "precapprox;": "\u2ab7", - "preccurlyeq;": "\u227c", - "preceq;": "\u2aaf", - "precnapprox;": "\u2ab9", - "precneqq;": "\u2ab5", - "precnsim;": "\u22e8", - "precsim;": "\u227e", - "prime;": "\u2032", - "primes;": "\u2119", - "prnE;": "\u2ab5", - "prnap;": "\u2ab9", - "prnsim;": "\u22e8", - "prod;": "\u220f", - "profalar;": "\u232e", - "profline;": "\u2312", - "profsurf;": "\u2313", - "prop;": "\u221d", - "propto;": "\u221d", - "prsim;": "\u227e", - "prurel;": "\u22b0", - "pscr;": "\U0001d4c5", - "psi;": "\u03c8", - "puncsp;": "\u2008", - "qfr;": "\U0001d52e", - "qint;": "\u2a0c", - "qopf;": "\U0001d562", - "qprime;": "\u2057", - "qscr;": "\U0001d4c6", - "quaternions;": "\u210d", - "quatint;": "\u2a16", - "quest;": "?", - "questeq;": "\u225f", - "quot": "\"", - "quot;": "\"", - "rAarr;": "\u21db", - "rArr;": "\u21d2", - "rAtail;": "\u291c", - "rBarr;": "\u290f", - "rHar;": "\u2964", - "race;": "\u223d\u0331", - "racute;": "\u0155", - "radic;": "\u221a", - "raemptyv;": "\u29b3", - "rang;": "\u27e9", - "rangd;": "\u2992", - "range;": "\u29a5", - "rangle;": "\u27e9", - "raquo": "\xbb", - "raquo;": "\xbb", - "rarr;": "\u2192", - "rarrap;": "\u2975", - "rarrb;": "\u21e5", - "rarrbfs;": "\u2920", - "rarrc;": "\u2933", - "rarrfs;": "\u291e", - "rarrhk;": "\u21aa", - "rarrlp;": "\u21ac", - "rarrpl;": "\u2945", - "rarrsim;": "\u2974", - "rarrtl;": "\u21a3", - "rarrw;": "\u219d", - "ratail;": "\u291a", - "ratio;": "\u2236", - "rationals;": "\u211a", - "rbarr;": "\u290d", - "rbbrk;": "\u2773", - "rbrace;": "}", - "rbrack;": "]", - "rbrke;": "\u298c", - "rbrksld;": "\u298e", - "rbrkslu;": "\u2990", - "rcaron;": "\u0159", - "rcedil;": "\u0157", - "rceil;": "\u2309", - "rcub;": "}", - "rcy;": "\u0440", - "rdca;": "\u2937", - "rdldhar;": "\u2969", - "rdquo;": "\u201d", - "rdquor;": "\u201d", - "rdsh;": "\u21b3", - "real;": "\u211c", - "realine;": "\u211b", - "realpart;": "\u211c", - "reals;": "\u211d", - "rect;": "\u25ad", - "reg": "\xae", - "reg;": "\xae", - "rfisht;": "\u297d", - "rfloor;": "\u230b", - "rfr;": "\U0001d52f", - "rhard;": "\u21c1", - "rharu;": "\u21c0", - "rharul;": "\u296c", - "rho;": "\u03c1", - "rhov;": "\u03f1", - "rightarrow;": "\u2192", - "rightarrowtail;": "\u21a3", - "rightharpoondown;": "\u21c1", - "rightharpoonup;": "\u21c0", - "rightleftarrows;": "\u21c4", - "rightleftharpoons;": "\u21cc", - "rightrightarrows;": "\u21c9", - "rightsquigarrow;": "\u219d", - "rightthreetimes;": "\u22cc", - "ring;": "\u02da", - "risingdotseq;": "\u2253", - "rlarr;": "\u21c4", - "rlhar;": "\u21cc", - "rlm;": "\u200f", - "rmoust;": "\u23b1", - "rmoustache;": "\u23b1", - "rnmid;": "\u2aee", - "roang;": "\u27ed", - "roarr;": "\u21fe", - "robrk;": "\u27e7", - "ropar;": "\u2986", - "ropf;": "\U0001d563", - "roplus;": "\u2a2e", - "rotimes;": "\u2a35", - "rpar;": ")", - "rpargt;": "\u2994", - "rppolint;": "\u2a12", - "rrarr;": "\u21c9", - "rsaquo;": "\u203a", - "rscr;": "\U0001d4c7", - "rsh;": "\u21b1", - "rsqb;": "]", - "rsquo;": "\u2019", - "rsquor;": "\u2019", - "rthree;": "\u22cc", - "rtimes;": "\u22ca", - "rtri;": "\u25b9", - "rtrie;": "\u22b5", - "rtrif;": "\u25b8", - "rtriltri;": "\u29ce", - "ruluhar;": "\u2968", - "rx;": "\u211e", - "sacute;": "\u015b", - "sbquo;": "\u201a", - "sc;": "\u227b", - "scE;": "\u2ab4", - "scap;": "\u2ab8", - "scaron;": "\u0161", - "sccue;": "\u227d", - "sce;": "\u2ab0", - "scedil;": "\u015f", - "scirc;": "\u015d", - "scnE;": "\u2ab6", - "scnap;": "\u2aba", - "scnsim;": "\u22e9", - "scpolint;": "\u2a13", - "scsim;": "\u227f", - "scy;": "\u0441", - "sdot;": "\u22c5", - "sdotb;": "\u22a1", - "sdote;": "\u2a66", - "seArr;": "\u21d8", - "searhk;": "\u2925", - "searr;": "\u2198", - "searrow;": "\u2198", - "sect": "\xa7", - "sect;": "\xa7", - "semi;": ";", - "seswar;": "\u2929", - "setminus;": "\u2216", - "setmn;": "\u2216", - "sext;": "\u2736", - "sfr;": "\U0001d530", - "sfrown;": "\u2322", - "sharp;": "\u266f", - "shchcy;": "\u0449", - "shcy;": "\u0448", - "shortmid;": "\u2223", - "shortparallel;": "\u2225", - "shy": "\xad", - "shy;": "\xad", - "sigma;": "\u03c3", - "sigmaf;": "\u03c2", - "sigmav;": "\u03c2", - "sim;": "\u223c", - "simdot;": "\u2a6a", - "sime;": "\u2243", - "simeq;": "\u2243", - "simg;": "\u2a9e", - "simgE;": "\u2aa0", - "siml;": "\u2a9d", - "simlE;": "\u2a9f", - "simne;": "\u2246", - "simplus;": "\u2a24", - "simrarr;": "\u2972", - "slarr;": "\u2190", - "smallsetminus;": "\u2216", - "smashp;": "\u2a33", - "smeparsl;": "\u29e4", - "smid;": "\u2223", - "smile;": "\u2323", - "smt;": "\u2aaa", - "smte;": "\u2aac", - "smtes;": "\u2aac\ufe00", - "softcy;": "\u044c", - "sol;": "/", - "solb;": "\u29c4", - "solbar;": "\u233f", - "sopf;": "\U0001d564", - "spades;": "\u2660", - "spadesuit;": "\u2660", - "spar;": "\u2225", - "sqcap;": "\u2293", - "sqcaps;": "\u2293\ufe00", - "sqcup;": "\u2294", - "sqcups;": "\u2294\ufe00", - "sqsub;": "\u228f", - "sqsube;": "\u2291", - "sqsubset;": "\u228f", - "sqsubseteq;": "\u2291", - "sqsup;": "\u2290", - "sqsupe;": "\u2292", - "sqsupset;": "\u2290", - "sqsupseteq;": "\u2292", - "squ;": "\u25a1", - "square;": "\u25a1", - "squarf;": "\u25aa", - "squf;": "\u25aa", - "srarr;": "\u2192", - "sscr;": "\U0001d4c8", - "ssetmn;": "\u2216", - "ssmile;": "\u2323", - "sstarf;": "\u22c6", - "star;": "\u2606", - "starf;": "\u2605", - "straightepsilon;": "\u03f5", - "straightphi;": "\u03d5", - "strns;": "\xaf", - "sub;": "\u2282", - "subE;": "\u2ac5", - "subdot;": "\u2abd", - "sube;": "\u2286", - "subedot;": "\u2ac3", - "submult;": "\u2ac1", - "subnE;": "\u2acb", - "subne;": "\u228a", - "subplus;": "\u2abf", - "subrarr;": "\u2979", - "subset;": "\u2282", - "subseteq;": "\u2286", - "subseteqq;": "\u2ac5", - "subsetneq;": "\u228a", - "subsetneqq;": "\u2acb", - "subsim;": "\u2ac7", - "subsub;": "\u2ad5", - "subsup;": "\u2ad3", - "succ;": "\u227b", - "succapprox;": "\u2ab8", - "succcurlyeq;": "\u227d", - "succeq;": "\u2ab0", - "succnapprox;": "\u2aba", - "succneqq;": "\u2ab6", - "succnsim;": "\u22e9", - "succsim;": "\u227f", - "sum;": "\u2211", - "sung;": "\u266a", - "sup1": "\xb9", - "sup1;": "\xb9", - "sup2": "\xb2", - "sup2;": "\xb2", - "sup3": "\xb3", - "sup3;": "\xb3", - "sup;": "\u2283", - "supE;": "\u2ac6", - "supdot;": "\u2abe", - "supdsub;": "\u2ad8", - "supe;": "\u2287", - "supedot;": "\u2ac4", - "suphsol;": "\u27c9", - "suphsub;": "\u2ad7", - "suplarr;": "\u297b", - "supmult;": "\u2ac2", - "supnE;": "\u2acc", - "supne;": "\u228b", - "supplus;": "\u2ac0", - "supset;": "\u2283", - "supseteq;": "\u2287", - "supseteqq;": "\u2ac6", - "supsetneq;": "\u228b", - "supsetneqq;": "\u2acc", - "supsim;": "\u2ac8", - "supsub;": "\u2ad4", - "supsup;": "\u2ad6", - "swArr;": "\u21d9", - "swarhk;": "\u2926", - "swarr;": "\u2199", - "swarrow;": "\u2199", - "swnwar;": "\u292a", - "szlig": "\xdf", - "szlig;": "\xdf", - "target;": "\u2316", - "tau;": "\u03c4", - "tbrk;": "\u23b4", - "tcaron;": "\u0165", - "tcedil;": "\u0163", - "tcy;": "\u0442", - "tdot;": "\u20db", - "telrec;": "\u2315", - "tfr;": "\U0001d531", - "there4;": "\u2234", - "therefore;": "\u2234", - "theta;": "\u03b8", - "thetasym;": "\u03d1", - "thetav;": "\u03d1", - "thickapprox;": "\u2248", - "thicksim;": "\u223c", - "thinsp;": "\u2009", - "thkap;": "\u2248", - "thksim;": "\u223c", - "thorn": "\xfe", - "thorn;": "\xfe", - "tilde;": "\u02dc", - "times": "\xd7", - "times;": "\xd7", - "timesb;": "\u22a0", - "timesbar;": "\u2a31", - "timesd;": "\u2a30", - "tint;": "\u222d", - "toea;": "\u2928", - "top;": "\u22a4", - "topbot;": "\u2336", - "topcir;": "\u2af1", - "topf;": "\U0001d565", - "topfork;": "\u2ada", - "tosa;": "\u2929", - "tprime;": "\u2034", - "trade;": "\u2122", - "triangle;": "\u25b5", - "triangledown;": "\u25bf", - "triangleleft;": "\u25c3", - "trianglelefteq;": "\u22b4", - "triangleq;": "\u225c", - "triangleright;": "\u25b9", - "trianglerighteq;": "\u22b5", - "tridot;": "\u25ec", - "trie;": "\u225c", - "triminus;": "\u2a3a", - "triplus;": "\u2a39", - "trisb;": "\u29cd", - "tritime;": "\u2a3b", - "trpezium;": "\u23e2", - "tscr;": "\U0001d4c9", - "tscy;": "\u0446", - "tshcy;": "\u045b", - "tstrok;": "\u0167", - "twixt;": "\u226c", - "twoheadleftarrow;": "\u219e", - "twoheadrightarrow;": "\u21a0", - "uArr;": "\u21d1", - "uHar;": "\u2963", - "uacute": "\xfa", - "uacute;": "\xfa", - "uarr;": "\u2191", - "ubrcy;": "\u045e", - "ubreve;": "\u016d", - "ucirc": "\xfb", - "ucirc;": "\xfb", - "ucy;": "\u0443", - "udarr;": "\u21c5", - "udblac;": "\u0171", - "udhar;": "\u296e", - "ufisht;": "\u297e", - "ufr;": "\U0001d532", - "ugrave": "\xf9", - "ugrave;": "\xf9", - "uharl;": "\u21bf", - "uharr;": "\u21be", - "uhblk;": "\u2580", - "ulcorn;": "\u231c", - "ulcorner;": "\u231c", - "ulcrop;": "\u230f", - "ultri;": "\u25f8", - "umacr;": "\u016b", - "uml": "\xa8", - "uml;": "\xa8", - "uogon;": "\u0173", - "uopf;": "\U0001d566", - "uparrow;": "\u2191", - "updownarrow;": "\u2195", - "upharpoonleft;": "\u21bf", - "upharpoonright;": "\u21be", - "uplus;": "\u228e", - "upsi;": "\u03c5", - "upsih;": "\u03d2", - "upsilon;": "\u03c5", - "upuparrows;": "\u21c8", - "urcorn;": "\u231d", - "urcorner;": "\u231d", - "urcrop;": "\u230e", - "uring;": "\u016f", - "urtri;": "\u25f9", - "uscr;": "\U0001d4ca", - "utdot;": "\u22f0", - "utilde;": "\u0169", - "utri;": "\u25b5", - "utrif;": "\u25b4", - "uuarr;": "\u21c8", - "uuml": "\xfc", - "uuml;": "\xfc", - "uwangle;": "\u29a7", - "vArr;": "\u21d5", - "vBar;": "\u2ae8", - "vBarv;": "\u2ae9", - "vDash;": "\u22a8", - "vangrt;": "\u299c", - "varepsilon;": "\u03f5", - "varkappa;": "\u03f0", - "varnothing;": "\u2205", - "varphi;": "\u03d5", - "varpi;": "\u03d6", - "varpropto;": "\u221d", - "varr;": "\u2195", - "varrho;": "\u03f1", - "varsigma;": "\u03c2", - "varsubsetneq;": "\u228a\ufe00", - "varsubsetneqq;": "\u2acb\ufe00", - "varsupsetneq;": "\u228b\ufe00", - "varsupsetneqq;": "\u2acc\ufe00", - "vartheta;": "\u03d1", - "vartriangleleft;": "\u22b2", - "vartriangleright;": "\u22b3", - "vcy;": "\u0432", - "vdash;": "\u22a2", - "vee;": "\u2228", - "veebar;": "\u22bb", - "veeeq;": "\u225a", - "vellip;": "\u22ee", - "verbar;": "|", - "vert;": "|", - "vfr;": "\U0001d533", - "vltri;": "\u22b2", - "vnsub;": "\u2282\u20d2", - "vnsup;": "\u2283\u20d2", - "vopf;": "\U0001d567", - "vprop;": "\u221d", - "vrtri;": "\u22b3", - "vscr;": "\U0001d4cb", - "vsubnE;": "\u2acb\ufe00", - "vsubne;": "\u228a\ufe00", - "vsupnE;": "\u2acc\ufe00", - "vsupne;": "\u228b\ufe00", - "vzigzag;": "\u299a", - "wcirc;": "\u0175", - "wedbar;": "\u2a5f", - "wedge;": "\u2227", - "wedgeq;": "\u2259", - "weierp;": "\u2118", - "wfr;": "\U0001d534", - "wopf;": "\U0001d568", - "wp;": "\u2118", - "wr;": "\u2240", - "wreath;": "\u2240", - "wscr;": "\U0001d4cc", - "xcap;": "\u22c2", - "xcirc;": "\u25ef", - "xcup;": "\u22c3", - "xdtri;": "\u25bd", - "xfr;": "\U0001d535", - "xhArr;": "\u27fa", - "xharr;": "\u27f7", - "xi;": "\u03be", - "xlArr;": "\u27f8", - "xlarr;": "\u27f5", - "xmap;": "\u27fc", - "xnis;": "\u22fb", - "xodot;": "\u2a00", - "xopf;": "\U0001d569", - "xoplus;": "\u2a01", - "xotime;": "\u2a02", - "xrArr;": "\u27f9", - "xrarr;": "\u27f6", - "xscr;": "\U0001d4cd", - "xsqcup;": "\u2a06", - "xuplus;": "\u2a04", - "xutri;": "\u25b3", - "xvee;": "\u22c1", - "xwedge;": "\u22c0", - "yacute": "\xfd", - "yacute;": "\xfd", - "yacy;": "\u044f", - "ycirc;": "\u0177", - "ycy;": "\u044b", - "yen": "\xa5", - "yen;": "\xa5", - "yfr;": "\U0001d536", - "yicy;": "\u0457", - "yopf;": "\U0001d56a", - "yscr;": "\U0001d4ce", - "yucy;": "\u044e", - "yuml": "\xff", - "yuml;": "\xff", - "zacute;": "\u017a", - "zcaron;": "\u017e", - "zcy;": "\u0437", - "zdot;": "\u017c", - "zeetrf;": "\u2128", - "zeta;": "\u03b6", - "zfr;": "\U0001d537", - "zhcy;": "\u0436", - "zigrarr;": "\u21dd", - "zopf;": "\U0001d56b", - "zscr;": "\U0001d4cf", - "zwj;": "\u200d", - "zwnj;": "\u200c", -} - -replacementCharacters = { - 0x0: "\uFFFD", - 0x0d: "\u000D", - 0x80: "\u20AC", - 0x81: "\u0081", - 0x82: "\u201A", - 0x83: "\u0192", - 0x84: "\u201E", - 0x85: "\u2026", - 0x86: "\u2020", - 0x87: "\u2021", - 0x88: "\u02C6", - 0x89: "\u2030", - 0x8A: "\u0160", - 0x8B: "\u2039", - 0x8C: "\u0152", - 0x8D: "\u008D", - 0x8E: "\u017D", - 0x8F: "\u008F", - 0x90: "\u0090", - 0x91: "\u2018", - 0x92: "\u2019", - 0x93: "\u201C", - 0x94: "\u201D", - 0x95: "\u2022", - 0x96: "\u2013", - 0x97: "\u2014", - 0x98: "\u02DC", - 0x99: "\u2122", - 0x9A: "\u0161", - 0x9B: "\u203A", - 0x9C: "\u0153", - 0x9D: "\u009D", - 0x9E: "\u017E", - 0x9F: "\u0178", -} - -tokenTypes = { - "Doctype": 0, - "Characters": 1, - "SpaceCharacters": 2, - "StartTag": 3, - "EndTag": 4, - "EmptyTag": 5, - "Comment": 6, - "ParseError": 7 -} - -tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], - tokenTypes["EmptyTag"]]) - - -prefixes = {v: k for k, v in namespaces.items()} -prefixes["http://www.w3.org/1998/Math/MathML"] = "math" - - -class DataLossWarning(UserWarning): - """Raised when the current tree is unable to represent the input data""" - pass - - -class _ReparseException(Exception): - pass diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index ab3e1a5a9ed7d7f8fa8f031a46a9b1d532a62928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmd1j<>g`kf@*ciWDxxrL?8o3AjbiSi&=m~3PUi1CZpdI z6I@c1SrOxsS{74Wl3$dYRFs*Xn35V_oRM0TnU)q)oCIU}WG2NFXO^Vu79=KTC#I(s z#}s51=*O3(=B4Bp>1UMW=9uPWCh4bT=9B=<)sK(Q%*!l^kJl@xyv1RYo1apelWGTY LMKKeQU||3Nvs^ZK diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-310.pyc deleted file mode 100644 index 13375363d01e050d6f7d359c96e47877c9ef32ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1331 zcmZuxOK%%D5GMB_tz@|g&^D+6A9!eC2x#q7FNIMgh?@XK;R1CZz(VbsyQCz>+=od@ zsT3JVkz9N3H97V#@!C^{Wlng#3k*w_5^} zyCC*!P=W}mNlkNFM|o7oc}$6jM68oK%~Kc?k?3CC&-*Y=MejMuvxh|VMfRMCOs0

This is a doc

') - - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parse(doc, **kwargs) - - -def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML fragment as a string or file-like object into a tree - - :arg doc: the fragment to parse as a string or file-like object - - :arg container: the container context to parse the fragment in - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import parseFragment - >>> parseFragment('this is a fragment') - - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, **kwargs) - - -def method_decorator_metaclass(function): - class Decorated(type): - def __new__(meta, classname, bases, classDict): - for attributeName, attribute in classDict.items(): - if isinstance(attribute, types.FunctionType): - attribute = function(attribute) - - classDict[attributeName] = attribute - return type.__new__(meta, classname, bases, classDict) - return Decorated - - -class HTMLParser(object): - """HTML parser - - Generates a tree structure from a stream of (possibly malformed) HTML. - - """ - - def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): - """ - :arg tree: a treebuilder class controlling the type of tree that will be - returned. Built in treebuilders can be accessed through - html5lib.treebuilders.getTreeBuilder(treeType) - - :arg strict: raise an exception when a parse error is encountered - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :arg debug: whether or not to enable debug mode which logs things - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() # generates parser with etree builder - >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict - - """ - - # Raise an exception on the first error encountered - self.strict = strict - - if tree is None: - tree = treebuilders.getTreeBuilder("etree") - self.tree = tree(namespaceHTMLElements) - self.errors = [] - - self.phases = {name: cls(self, self.tree) for name, cls in - getPhases(debug).items()} - - def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): - - self.innerHTMLMode = innerHTML - self.container = container - self.scripting = scripting - self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) - self.reset() - - try: - self.mainLoop() - except _ReparseException: - self.reset() - self.mainLoop() - - def reset(self): - self.tree.reset() - self.firstStartTag = False - self.errors = [] - self.log = [] # only used with debug mode - # "quirks" / "limited quirks" / "no quirks" - self.compatMode = "no quirks" - - if self.innerHTMLMode: - self.innerHTML = self.container.lower() - - if self.innerHTML in cdataElements: - self.tokenizer.state = self.tokenizer.rcdataState - elif self.innerHTML in rcdataElements: - self.tokenizer.state = self.tokenizer.rawtextState - elif self.innerHTML == 'plaintext': - self.tokenizer.state = self.tokenizer.plaintextState - else: - # state already is data state - # self.tokenizer.state = self.tokenizer.dataState - pass - self.phase = self.phases["beforeHtml"] - self.phase.insertHtmlElement() - self.resetInsertionMode() - else: - self.innerHTML = False # pylint:disable=redefined-variable-type - self.phase = self.phases["initial"] - - self.lastPhase = None - - self.beforeRCDataPhase = None - - self.framesetOK = True - - @property - def documentEncoding(self): - """Name of the character encoding that was used to decode the input stream, or - :obj:`None` if that is not determined yet - - """ - if not hasattr(self, 'tokenizer'): - return None - return self.tokenizer.stream.charEncoding[0].name - - def isHTMLIntegrationPoint(self, element): - if (element.name == "annotation-xml" and - element.namespace == namespaces["mathml"]): - return ("encoding" in element.attributes and - element.attributes["encoding"].translate( - asciiUpper2Lower) in - ("text/html", "application/xhtml+xml")) - else: - return (element.namespace, element.name) in htmlIntegrationPointElements - - def isMathMLTextIntegrationPoint(self, element): - return (element.namespace, element.name) in mathmlTextIntegrationPointElements - - def mainLoop(self): - CharactersToken = tokenTypes["Characters"] - SpaceCharactersToken = tokenTypes["SpaceCharacters"] - StartTagToken = tokenTypes["StartTag"] - EndTagToken = tokenTypes["EndTag"] - CommentToken = tokenTypes["Comment"] - DoctypeToken = tokenTypes["Doctype"] - ParseErrorToken = tokenTypes["ParseError"] - - for token in self.tokenizer: - prev_token = None - new_token = token - while new_token is not None: - prev_token = new_token - currentNode = self.tree.openElements[-1] if self.tree.openElements else None - currentNodeNamespace = currentNode.namespace if currentNode else None - currentNodeName = currentNode.name if currentNode else None - - type = new_token["type"] - - if type == ParseErrorToken: - self.parseError(new_token["data"], new_token.get("datavars", {})) - new_token = None - else: - if (len(self.tree.openElements) == 0 or - currentNodeNamespace == self.tree.defaultNamespace or - (self.isMathMLTextIntegrationPoint(currentNode) and - ((type == StartTagToken and - token["name"] not in frozenset(["mglyph", "malignmark"])) or - type in (CharactersToken, SpaceCharactersToken))) or - (currentNodeNamespace == namespaces["mathml"] and - currentNodeName == "annotation-xml" and - type == StartTagToken and - token["name"] == "svg") or - (self.isHTMLIntegrationPoint(currentNode) and - type in (StartTagToken, CharactersToken, SpaceCharactersToken))): - phase = self.phase - else: - phase = self.phases["inForeignContent"] - - if type == CharactersToken: - new_token = phase.processCharacters(new_token) - elif type == SpaceCharactersToken: - new_token = phase.processSpaceCharacters(new_token) - elif type == StartTagToken: - new_token = phase.processStartTag(new_token) - elif type == EndTagToken: - new_token = phase.processEndTag(new_token) - elif type == CommentToken: - new_token = phase.processComment(new_token) - elif type == DoctypeToken: - new_token = phase.processDoctype(new_token) - - if (type == StartTagToken and prev_token["selfClosing"] and - not prev_token["selfClosingAcknowledged"]): - self.parseError("non-void-element-with-trailing-solidus", - {"name": prev_token["name"]}) - - # When the loop finishes it's EOF - reprocess = True - phases = [] - while reprocess: - phases.append(self.phase) - reprocess = self.phase.processEOF() - if reprocess: - assert self.phase not in phases - - def parse(self, stream, *args, **kwargs): - """Parse a HTML document into a well-formed tree - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element). - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parse('

This is a doc

') - - - """ - self._parse(stream, False, None, *args, **kwargs) - return self.tree.getDocument() - - def parseFragment(self, stream, *args, **kwargs): - """Parse a HTML fragment into a well-formed tree fragment - - :arg container: name of the element we're setting the innerHTML - property if set to None, default to 'div' - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parseFragment('this is a fragment') - - - """ - self._parse(stream, True, *args, **kwargs) - return self.tree.getFragment() - - def parseError(self, errorcode="XXX-undefined-error", datavars=None): - # XXX The idea is to make errorcode mandatory. - if datavars is None: - datavars = {} - self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) - if self.strict: - raise ParseError(E[errorcode] % datavars) - - def adjustMathMLAttributes(self, token): - adjust_attributes(token, adjustMathMLAttributes) - - def adjustSVGAttributes(self, token): - adjust_attributes(token, adjustSVGAttributes) - - def adjustForeignAttributes(self, token): - adjust_attributes(token, adjustForeignAttributesMap) - - def reparseTokenNormal(self, token): - # pylint:disable=unused-argument - self.parser.phase() - - def resetInsertionMode(self): - # The name of this method is mostly historical. (It's also used in the - # specification.) - last = False - newModes = { - "select": "inSelect", - "td": "inCell", - "th": "inCell", - "tr": "inRow", - "tbody": "inTableBody", - "thead": "inTableBody", - "tfoot": "inTableBody", - "caption": "inCaption", - "colgroup": "inColumnGroup", - "table": "inTable", - "head": "inBody", - "body": "inBody", - "frameset": "inFrameset", - "html": "beforeHead" - } - for node in self.tree.openElements[::-1]: - nodeName = node.name - new_phase = None - if node == self.tree.openElements[0]: - assert self.innerHTML - last = True - nodeName = self.innerHTML - # Check for conditions that should only happen in the innerHTML - # case - if nodeName in ("select", "colgroup", "head", "html"): - assert self.innerHTML - - if not last and node.namespace != self.tree.defaultNamespace: - continue - - if nodeName in newModes: - new_phase = self.phases[newModes[nodeName]] - break - elif last: - new_phase = self.phases["inBody"] - break - - self.phase = new_phase - - def parseRCDataRawtext(self, token, contentType): - # Generic RCDATA/RAWTEXT Parsing algorithm - assert contentType in ("RAWTEXT", "RCDATA") - - self.tree.insertElement(token) - - if contentType == "RAWTEXT": - self.tokenizer.state = self.tokenizer.rawtextState - else: - self.tokenizer.state = self.tokenizer.rcdataState - - self.originalPhase = self.phase - - self.phase = self.phases["text"] - - -@_utils.memoize -def getPhases(debug): - def log(function): - """Logger that records which phase processes each token""" - type_names = {value: key for key, value in tokenTypes.items()} - - def wrapped(self, *args, **kwargs): - if function.__name__.startswith("process") and len(args) > 0: - token = args[0] - info = {"type": type_names[token['type']]} - if token['type'] in tagTokenTypes: - info["name"] = token['name'] - - self.parser.log.append((self.parser.tokenizer.state.__name__, - self.parser.phase.__class__.__name__, - self.__class__.__name__, - function.__name__, - info)) - return function(self, *args, **kwargs) - else: - return function(self, *args, **kwargs) - return wrapped - - def getMetaclass(use_metaclass, metaclass_func): - if use_metaclass: - return method_decorator_metaclass(metaclass_func) - else: - return type - - # pylint:disable=unused-argument - class Phase(with_metaclass(getMetaclass(debug, log))): - """Base class for helper object that implements each phase of processing - """ - __slots__ = ("parser", "tree", "__startTagCache", "__endTagCache") - - def __init__(self, parser, tree): - self.parser = parser - self.tree = tree - self.__startTagCache = {} - self.__endTagCache = {} - - def processEOF(self): - raise NotImplementedError - - def processComment(self, token): - # For most phases the following is correct. Where it's not it will be - # overridden. - self.tree.insertComment(token, self.tree.openElements[-1]) - - def processDoctype(self, token): - self.parser.parseError("unexpected-doctype") - - def processCharacters(self, token): - self.tree.insertText(token["data"]) - - def processSpaceCharacters(self, token): - self.tree.insertText(token["data"]) - - def processStartTag(self, token): - # Note the caching is done here rather than BoundMethodDispatcher as doing it there - # requires a circular reference to the Phase, and this ends up with a significant - # (CPython 2.7, 3.8) GC cost when parsing many short inputs - name = token["name"] - # In Py2, using `in` is quicker in general than try/except KeyError - # In Py3, `in` is quicker when there are few cache hits (typically short inputs) - if name in self.__startTagCache: - func = self.__startTagCache[name] - else: - func = self.__startTagCache[name] = self.startTagHandler[name] - # bound the cache size in case we get loads of unknown tags - while len(self.__startTagCache) > len(self.startTagHandler) * 1.1: - # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7 - self.__startTagCache.pop(next(iter(self.__startTagCache))) - return func(token) - - def startTagHtml(self, token): - if not self.parser.firstStartTag and token["name"] == "html": - self.parser.parseError("non-html-root") - # XXX Need a check here to see if the first start tag token emitted is - # this token... If it's not, invoke self.parser.parseError(). - for attr, value in token["data"].items(): - if attr not in self.tree.openElements[0].attributes: - self.tree.openElements[0].attributes[attr] = value - self.parser.firstStartTag = False - - def processEndTag(self, token): - # Note the caching is done here rather than BoundMethodDispatcher as doing it there - # requires a circular reference to the Phase, and this ends up with a significant - # (CPython 2.7, 3.8) GC cost when parsing many short inputs - name = token["name"] - # In Py2, using `in` is quicker in general than try/except KeyError - # In Py3, `in` is quicker when there are few cache hits (typically short inputs) - if name in self.__endTagCache: - func = self.__endTagCache[name] - else: - func = self.__endTagCache[name] = self.endTagHandler[name] - # bound the cache size in case we get loads of unknown tags - while len(self.__endTagCache) > len(self.endTagHandler) * 1.1: - # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7 - self.__endTagCache.pop(next(iter(self.__endTagCache))) - return func(token) - - class InitialPhase(Phase): - __slots__ = tuple() - - def processSpaceCharacters(self, token): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - correct = token["correct"] - - if (name != "html" or publicId is not None or - systemId is not None and systemId != "about:legacy-compat"): - self.parser.parseError("unknown-doctype") - - if publicId is None: - publicId = "" - - self.tree.insertDoctype(token) - - if publicId != "": - publicId = publicId.translate(asciiUpper2Lower) - - if (not correct or token["name"] != "html" or - publicId.startswith( - ("+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//")) or - publicId in ("-//w3o//dtd w3 html strict 3.0//en//", - "-/w3c/dtd html 4.0 transitional/en", - "html") or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is None or - systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): - self.parser.compatMode = "quirks" - elif (publicId.startswith( - ("-//w3c//dtd xhtml 1.0 frameset//", - "-//w3c//dtd xhtml 1.0 transitional//")) or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is not None): - self.parser.compatMode = "limited quirks" - - self.parser.phase = self.parser.phases["beforeHtml"] - - def anythingElse(self): - self.parser.compatMode = "quirks" - self.parser.phase = self.parser.phases["beforeHtml"] - - def processCharacters(self, token): - self.parser.parseError("expected-doctype-but-got-chars") - self.anythingElse() - return token - - def processStartTag(self, token): - self.parser.parseError("expected-doctype-but-got-start-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEndTag(self, token): - self.parser.parseError("expected-doctype-but-got-end-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEOF(self): - self.parser.parseError("expected-doctype-but-got-eof") - self.anythingElse() - return True - - class BeforeHtmlPhase(Phase): - __slots__ = tuple() - - # helper methods - def insertHtmlElement(self): - self.tree.insertRoot(impliedTagToken("html", "StartTag")) - self.parser.phase = self.parser.phases["beforeHead"] - - # other - def processEOF(self): - self.insertHtmlElement() - return True - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.insertHtmlElement() - return token - - def processStartTag(self, token): - if token["name"] == "html": - self.parser.firstStartTag = True - self.insertHtmlElement() - return token - - def processEndTag(self, token): - if token["name"] not in ("head", "body", "html", "br"): - self.parser.parseError("unexpected-end-tag-before-html", - {"name": token["name"]}) - else: - self.insertHtmlElement() - return token - - class BeforeHeadPhase(Phase): - __slots__ = tuple() - - def processEOF(self): - self.startTagHead(impliedTagToken("head", "StartTag")) - return True - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.tree.insertElement(token) - self.tree.headPointer = self.tree.openElements[-1] - self.parser.phase = self.parser.phases["inHead"] - - def startTagOther(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagImplyHead(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagOther(self, token): - self.parser.parseError("end-tag-after-implied-root", - {"name": token["name"]}) - - startTagHandler = _utils.MethodDispatcher([ - ("html", startTagHtml), - ("head", startTagHead) - ]) - startTagHandler.default = startTagOther - - endTagHandler = _utils.MethodDispatcher([ - (("head", "body", "html", "br"), endTagImplyHead) - ]) - endTagHandler.default = endTagOther - - class InHeadPhase(Phase): - __slots__ = tuple() - - # the real thing - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.parser.parseError("two-heads-are-not-better-than-one") - - def startTagBaseLinkCommand(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagMeta(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - attributes = token["data"] - if self.parser.tokenizer.stream.charEncoding[1] == "tentative": - if "charset" in attributes: - self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) - elif ("content" in attributes and - "http-equiv" in attributes and - attributes["http-equiv"].lower() == "content-type"): - # Encoding it as UTF-8 here is a hack, as really we should pass - # the abstract Unicode string, and just use the - # ContentAttrParser on that, but using UTF-8 allows all chars - # to be encoded and as a ASCII-superset works. - data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) - parser = _inputstream.ContentAttrParser(data) - codec = parser.parse() - self.parser.tokenizer.stream.changeEncoding(codec) - - def startTagTitle(self, token): - self.parser.parseRCDataRawtext(token, "RCDATA") - - def startTagNoFramesStyle(self, token): - # Need to decide whether to implement the scripting-disabled case - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagNoscript(self, token): - if self.parser.scripting: - self.parser.parseRCDataRawtext(token, "RAWTEXT") - else: - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inHeadNoscript"] - - def startTagScript(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState - self.parser.originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["text"] - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHead(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "head", "Expected head got %s" % node.name - self.parser.phase = self.parser.phases["afterHead"] - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.endTagHead(impliedTagToken("head")) - - startTagHandler = _utils.MethodDispatcher([ - ("html", startTagHtml), - ("title", startTagTitle), - (("noframes", "style"), startTagNoFramesStyle), - ("noscript", startTagNoscript), - ("script", startTagScript), - (("base", "basefont", "bgsound", "command", "link"), - startTagBaseLinkCommand), - ("meta", startTagMeta), - ("head", startTagHead) - ]) - startTagHandler.default = startTagOther - - endTagHandler = _utils.MethodDispatcher([ - ("head", endTagHead), - (("br", "html", "body"), endTagHtmlBodyBr) - ]) - endTagHandler.default = endTagOther - - class InHeadNoscriptPhase(Phase): - __slots__ = tuple() - - def processEOF(self): - self.parser.parseError("eof-in-head-noscript") - self.anythingElse() - return True - - def processComment(self, token): - return self.parser.phases["inHead"].processComment(token) - - def processCharacters(self, token): - self.parser.parseError("char-in-head-noscript") - self.anythingElse() - return token - - def processSpaceCharacters(self, token): - return self.parser.phases["inHead"].processSpaceCharacters(token) - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBaseLinkCommand(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagHeadNoscript(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagNoscript(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "noscript", "Expected noscript got %s" % node.name - self.parser.phase = self.parser.phases["inHead"] - - def endTagBr(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - # Caller must raise parse error first! - self.endTagNoscript(impliedTagToken("noscript")) - - startTagHandler = _utils.MethodDispatcher([ - ("html", startTagHtml), - (("basefont", "bgsound", "link", "meta", "noframes", "style"), startTagBaseLinkCommand), - (("head", "noscript"), startTagHeadNoscript), - ]) - startTagHandler.default = startTagOther - - endTagHandler = _utils.MethodDispatcher([ - ("noscript", endTagNoscript), - ("br", endTagBr), - ]) - endTagHandler.default = endTagOther - - class AfterHeadPhase(Phase): - __slots__ = tuple() - - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBody(self, token): - self.parser.framesetOK = False - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inBody"] - - def startTagFrameset(self, token): - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inFrameset"] - - def startTagFromHead(self, token): - self.parser.parseError("unexpected-start-tag-out-of-my-head", - {"name": token["name"]}) - self.tree.openElements.append(self.tree.headPointer) - self.parser.phases["inHead"].processStartTag(token) - for node in self.tree.openElements[::-1]: - if node.name == "head": - self.tree.openElements.remove(node) - break - - def startTagHead(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.tree.insertElement(impliedTagToken("body", "StartTag")) - self.parser.phase = self.parser.phases["inBody"] - self.parser.framesetOK = True - - startTagHandler = _utils.MethodDispatcher([ - ("html", startTagHtml), - ("body", startTagBody), - ("frameset", startTagFrameset), - (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", - "style", "title"), - startTagFromHead), - ("head", startTagHead) - ]) - startTagHandler.default = startTagOther - endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), - endTagHtmlBodyBr)]) - endTagHandler.default = endTagOther - - class InBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody - # the really-really-really-very crazy mode - __slots__ = ("processSpaceCharacters",) - - def __init__(self, *args, **kwargs): - super(InBodyPhase, self).__init__(*args, **kwargs) - # Set this to the default handler - self.processSpaceCharacters = self.processSpaceCharactersNonPre - - def isMatchingFormattingElement(self, node1, node2): - return (node1.name == node2.name and - node1.namespace == node2.namespace and - node1.attributes == node2.attributes) - - # helper - def addFormattingElement(self, token): - self.tree.insertElement(token) - element = self.tree.openElements[-1] - - matchingElements = [] - for node in self.tree.activeFormattingElements[::-1]: - if node is Marker: - break - elif self.isMatchingFormattingElement(node, element): - matchingElements.append(node) - - assert len(matchingElements) <= 3 - if len(matchingElements) == 3: - self.tree.activeFormattingElements.remove(matchingElements[-1]) - self.tree.activeFormattingElements.append(element) - - # the real deal - def processEOF(self): - allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", - "tfoot", "th", "thead", "tr", "body", - "html")) - for node in self.tree.openElements[::-1]: - if node.name not in allowed_elements: - self.parser.parseError("expected-closing-tag-but-got-eof") - break - # Stop parsing - - def processSpaceCharactersDropNewline(self, token): - # Sometimes (start of
, , and 

tqIG{8C3$!uwa3xYG%VBgLZGbW!aoBCF88&wX_|tBy)4_SOsQF$)s{~ zY1sMsY1_#2bB2bQ1+&fUko_csE%@~S4zzX04W0&h+`{3CFKn2v4q#oV=@k5K9CNEq z+E1Bn*<%UEnx!-@82S&zwMbvqom<_2v8giF9bS_+7%ERp3f-R}wjA6s1DFQ&_xk=9 zlOL=!c5(((f1RAj<;1$y)TL1~4#~0L6!4kYay$A)l@kjo`wT*G!DrG=I@KK&OWBCl z9L-&=Ki8@}nko%xwMSfcb6!fPDy|VcgxMZ;D?cc3UO*Z$;A10D`4^3~BKqDx!ziN}O6@KnATAg&!70-HL_A@u(;+7hK=$ z^ov5Y74Sunw}3+p26XfbH!XUZkpz%~uczZ7+MO=o@`7E1MPOo7_-q+0nh+SjQ?**l l%E7B*Ls&u_f{p(J^x5$>*DvvQSbQNrAfsp$W$~Sze*wufTM+;N diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-310.pyc deleted file mode 100644 index f6dcae603189e1d1d92ccbf93324652f9702d08a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871 zcmZWn!H&}~5FN*98oFH;&|bK3LV_IFp12@{R$2rXw3muY6v;|rxAl@V#da!Kdh7no z{!*@-ICJB~jI%8TMw;>1GoCkZ?B@7*1SsF0JuaUxfbX<9ln^)PsP;J;36fP%vy|0A z8q_@H4BmqbB)9QE<;>HIgk;q135(8xQpKD3d@yrcPHeN zUZ7f{yI~s;$Yu(+>@s0pWSiEMDhayKs%mD2m~#u}9xlHY7q7C9RvDX3ozY*iw`!eP z*OG_=PVkJJ(UdaE8n1c;mu`Qc|i7-ZlXtgyX6dn~*gz&*J9vx!($bZA+nB|8_={@F#ZG%6k!?|*~b9caj2kydUUaNoMkA%3( z72*i1S>iKh*N^tR_u>eLuJf;G7rhnD;^jkZD_*u zvn`R1A!acjbAL)8SbEmF)?jHv?HJ-~D8GxE;!2gyrydmb82vb3_g%fAx3P5R6i)eX Dbh5!V diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-310.pyc deleted file mode 100644 index 138e02eacd10e481856d08b9b7b3b1d7cea1eead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1869 zcmZt{OKTfPcxHC?Az6;q_|ceN_RvsNuzhNwt`h>b69Pp&IB8)~S+93S(%Sp-%t(H8 z1rE*62&sK*|3WXN#}-15g}wHaztBti&90m%CId73ee=ENdu%p8-$bx}{A@LRHiyu^ z8kt=bkO#2kmvAt|aEub{;e>c3F+2k!Mwk)P#Pm#z9wA1V`5ZBmn}^m5LNvOP+pFk{@0BgI7!%hy=T;F2B$l80Ks>>_|X zfGu4(IPx$<9%0xsv^&p{M{7qsvv#1g9!4?fJ-_!jJ>;R1?*9H(!d2jg!$3%`?(KHB zzukG$@xqM+r|=Xn?irrD6R#+py&wI21a>m!v=iz9JYE z0Qm;P5I;Fr+kyv*OE++9N19D{x;6tbaAh_UA>VY>kWXP(Wk)=9r2@g^1~*UPrJ{6D z^Iu~i;X)+uc)J}cEbvR%aFmYkM`@&dzjUr8AR|=rxL;beebE5MUy*3R=f9Kf&E8YV zh3xGq5uNsS__!xkCXxdY4FX7%9C8u$`#pJZ4Sf?G^dzKjEf2z@V8CTBkMa$F%u|+$ zjiE~7FXHH6qhF;$ZbVfoe4Pe=nuhiKOgLa&Z>b;mmea)N3-z0=Uq=w?(zsr_e07u| zZ222doh0$t%9^uu2hT2Mw-(ZnoFW*iZ57jU|YF6kAN zF5sUsYl72XfNBHw^9KVCXK=dt61zDe^oe@zB!Qi zUVBqZ6n5eC$rfU*2^2}{77m*Sj<9G{+_y9gGz;V{al#gAsWAe$t+lL7^{|CnNBVTe zJMH_+g2k#uIXnA!*>#M?m zJLA$~%U4+QgO%Suq!al5e2>qNf9P1*3giSc3v~Yjbi1He7^CBMLAAEyHbc-TA9p<` z7u?rl7QalWkhsj4dU>$el(uIw1%7F3mJ>thKHkP*x9Ev?;@ zfzb|`VbDeCHS$cV%C(MDwbP9bgc$@KXvWzI7o`cklE~7?v%Iu|JcmB%G=(nc(v%A3 zh1aZ_qo0jZR@#~lU0<5jXs9fEp9}-(>k$1aM1LBPU%g#JznFw(`6gM%&ZQ@`Dw*ev-4uLPZ131Agd>ig4UaBZ#Tst;{_!Y?rxe@w zVIuo}H7Y9qXJXRBOH_gBv8N}4tS5?gqcv9z!*0jc>iZ)#f@<@H{+kFr&xM{jC3=^% W4=FC4t=h5sI^|NESVAqbV*C$Ms@Y@! diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-310.pyc deleted file mode 100644 index 01efcbdc0d0e317ee596a167977ab7a9b35dd95f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2577 zcmZ`*&2JM&6rb4-d+peX2@n!Ws})rh+?M3h9-3BFt0WXC;t~ke%4oCM89STohchz{ zN$N<@P;sj`lv7oS9JzDqt-bWv`*P$2{SV;M_hudAqIRvBeQ$m^5nGAv*+84jic3k^D+6t_QtTuZ zuaZ=~s^-hUk9lK2JCAF8?1*|}-w;+|)%%21d3m#bXnJ)vwnCb<7od$a&3qzQms#9X z+>erOCRFaQXeW|UmgbFK8ig6-ejF(-f><_bUQv8k`D(ArUr-c4b89`2{Dpyxkyq0o z;j$ZqT;{c%EMm(sPk5^E=!9Nh+z3Pvf;^d%5N#NJFc$d84`JfOql|b4qn^pi4@jG$ z_xCHFg`VFhp8bGW#4CX}PF}hc#UOOQb1edGuG-+P%C>mwN+o!Zxa~~1T!>7_YSo43 zO52T;+m2Eu-5}i?U?0QcY#h5Hh$M$~cWv!!DY;M(j%7T(wl-IszY&_+(qcmTc*wKB zD57Ye92$>}K0Tt8^o>68O-8|1WB<`2n4~x;b_=Tuk!aRJAUdwhdLrZt+KGbxmoIPa z7JR!G3GOF>3OAy(E2yh1*-Q$feZhRx`deh2n+3P}->fk}{ z_2?3O?6(yqG))L=o zNtKCYT|}J#QcHr3QM=ue>&Mi!XuTyN;VwcJZ3P`JTivKT@9*%GWnz9qCGn?mv_9X~ z_bumRxbL~{o|pjblQ1OaP{XOx{fQ#DbH{#!n6SrB1qd5P2t(H3?(UHeIiQMcQn)j6 zM3=}zdVBA{=tKU^kOQ-CGGm8`Ux7D)x8QBT+wNP8^oX2QX5UiQp&@6lk{>9n+FPc) zh%_L!Mn2Jqt&xQRVzAN-Q8t`gEY68D zq>;krp9e@ud-Dr&+uigzSW^XC|NfuIJRNFzs$~_C`E4Mph|KRADYX1q>=J*C#NpW> z4$rOii@zyVtvZT%~a z{|NZR4&1bO|Lq+QsjO*B9E=KZCpBlX#+Cv5&-bCis`?QH6nJ@F%exKoPH6nQVSd<{ zAF$)Idf`r!Ws`1-C0qAP&a~3?kp!=wTDz?SmkpI zNl}BZD7RRkg51I{RLsDFn8wx8a?0S$rTw{8Xa_DY`T-OpY&M*^fpm)Vr6D!za-YkgosH(h_g=lr|bbIS@6kcJuBlo1@2~c2%iqxJr zu>u7rh@*WjbVc7kcQf5evpeaa#-adi1iCMqCAntKI4!0rB;ri*}G=U-3QtZzK8gqgl! uB}c9muPwJWvnbUnMl8~{p+&j#Md9F=*lr~J<0Gd?&8Qg-2z-@Jng0OaQlo(Y diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-310.pyc deleted file mode 100644 index 93b910cc7a1ce23716ba5d30371886497adab4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2730 zcmZ`*&2Jk;6rY`4uQ!fEoHR`vRNAQY0~gx#TToR{(GLWwB18&QmeFeMStr}rpEAn zd2*@SZZh^44JJPagKH@2GAhA@6|=-@SqX3P#BSLZ6I|G_lT=z2i+#X^BPx%XsDzb! z?jyV93U`e)tIuG|nzo(|Ix3BaS?EW}AeEW+L^O(2l=gLF*pIrY2>m$9LK(#BnMF31 zb~=FyyEMV%$1%8uqRyfUS<4cv#f8ZdED#8_2j9uZ0DYR8lgG1BWy%oh+ zXXnjN!XzDqYB?Qba3hG9vtV5<_hgzZXB**imTrdqWtGV=NV?=v`4KNv$TPKy>LJ*1 z*sit9$Lt=v!Mq?pQ=!*_F5*R`|TUysI9V8 zCLI~A2OwB&gfi;&+Nx9bZbzNA0_~>*~pUkQXF+wdWJH! zQc^`sof&My%QzCD^oWTCRQ!Qw)hy4dTaM+TZCK9potd2QGdcD@R90Z)q8KVAIuF^H zeaoH@iRap&YL|mbobD3ab;ge1n_Rw*vAx995g;w}oh1-Ewx8JQ=$I4DTNNNHKwbcX z7YO?aSLgTi1IUfh6#2eCkC8fzia(eKd-Q8q{JG1C z*9I6x%bmY>W(!73yDo)e`4Oj-BiB*X@2JMMbjLPvIH(HZ(Gq;bWCJYOBWn%p2?uPQ zAl4v%l@b^IDrCoC=Pe<%H#ve6`2*|}%Dl91aY3tet~JY)l5FiPNr)Y0HlSW-my7 z#_b03-JE5G;e^XxR`q7;HUY-!HHib1cdB z0_a*{^ImCF1Q!LuUC8RN|G2Q5F?RVHpO<*7fk2XdjLDx~ft{VeCKFf+qQ?bxTwo#F z^Zn5T76B%|!Pth)S4H5_8ebQ7bDK5-eBSJ3A22@_^L|(87m9uEhs_Vr5jWqL^B4PE zgzneE?x(^I_&tAqDe>6n0j%+7fz<^TvOVk{CDtUw!8{=lnFn#k@(@)NRdNXx9%3Fx z+QSWIVp*Of4P}JM0Fw&{eJ&8hLddtExTURue2r`m>1qIBs1!Ofi@L~)N}%un=vpUE zyPI3XG()1$<+&~+pm^9X2FA8I!!c4oAEuqv-4{wy_8|P5Yqg+6_ zh;j+#vUVx8fZ`iKBDIIw?gyAEjpb>$rEOfZx{5yv^ok<|gAV-S!&tldJ>BH;L)zde z+5`568=K34Jc{8R=#G<)k{Eqzd$^v)(qC=?Oe+U*M4Ki!aG`JVC2XPkX*kmyYl2n(rs6 z7{=7E`~KE2hzm{C_eI+Eee<@-1GFi+g(PiY;+3L*7m}VTSw%$;wxW^8=sxml-c0=+ wqgicMX|dig8%iuD>4uSX?MS+BG?Qd%kT08DdslNe-=%+Bim(f;&KK=}0r204LI3~& diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-310.pyc b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-310.pyc deleted file mode 100644 index 90be09a358f36b764175321bb8f167a231cf69cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20035 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 tag into head of document""" - def __init__(self, source, encoding): - """Creates a Filter - - :arg source: the source token stream - - :arg encoding: the encoding to set - - """ - base.Filter.__init__(self, source) - self.encoding = encoding - - def __iter__(self): - state = "pre_head" - meta_found = (self.encoding is None) - pending = [] - - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag": - if token["name"].lower() == "head": - state = "in_head" - - elif type == "EmptyTag": - if token["name"].lower() == "meta": - # replace charset with actual encoding - has_http_equiv_content_type = False - for (namespace, name), value in token["data"].items(): - if namespace is not None: - continue - elif name.lower() == 'charset': - token["data"][(namespace, name)] = self.encoding - meta_found = True - break - elif name == 'http-equiv' and value.lower() == 'content-type': - has_http_equiv_content_type = True - else: - if has_http_equiv_content_type and (None, "content") in token["data"]: - token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding - meta_found = True - - elif token["name"].lower() == "head" and not meta_found: - # insert meta into empty head - yield {"type": "StartTag", "name": "head", - "data": token["data"]} - yield {"type": "EmptyTag", "name": "meta", - "data": {(None, "charset"): self.encoding}} - yield {"type": "EndTag", "name": "head"} - meta_found = True - continue - - elif type == "EndTag": - if token["name"].lower() == "head" and pending: - # insert meta into head (if necessary) and flush pending queue - yield pending.pop(0) - if not meta_found: - yield {"type": "EmptyTag", "name": "meta", - "data": {(None, "charset"): self.encoding}} - while pending: - yield pending.pop(0) - meta_found = True - state = "post_head" - - if state == "in_head": - pending.append(token) - else: - yield token diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py deleted file mode 100644 index fcc07ee..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import text_type - -from . import base -from ..constants import namespaces, voidElements - -from ..constants import spaceCharacters -spaceCharacters = "".join(spaceCharacters) - - -class Filter(base.Filter): - """Lints the token stream for errors - - If it finds any errors, it'll raise an ``AssertionError``. - - """ - def __init__(self, source, require_matching_tags=True): - """Creates a Filter - - :arg source: the source token stream - - :arg require_matching_tags: whether or not to require matching tags - - """ - super(Filter, self).__init__(source) - self.require_matching_tags = require_matching_tags - - def __iter__(self): - open_elements = [] - for token in base.Filter.__iter__(self): - type = token["type"] - if type in ("StartTag", "EmptyTag"): - namespace = token["namespace"] - name = token["name"] - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - assert isinstance(token["data"], dict) - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - assert type == "EmptyTag" - else: - assert type == "StartTag" - if type == "StartTag" and self.require_matching_tags: - open_elements.append((namespace, name)) - for (namespace, name), value in token["data"].items(): - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - assert isinstance(value, text_type) - - elif type == "EndTag": - namespace = token["namespace"] - name = token["name"] - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} - elif self.require_matching_tags: - start = open_elements.pop() - assert start == (namespace, name) - - elif type == "Comment": - data = token["data"] - assert isinstance(data, text_type) - - elif type in ("Characters", "SpaceCharacters"): - data = token["data"] - assert isinstance(data, text_type) - assert data != "" - if type == "SpaceCharacters": - assert data.strip(spaceCharacters) == "" - - elif type == "Doctype": - name = token["name"] - assert name is None or isinstance(name, text_type) - assert token["publicId"] is None or isinstance(name, text_type) - assert token["systemId"] is None or isinstance(name, text_type) - - elif type == "Entity": - assert isinstance(token["name"], text_type) - - elif type == "SerializerError": - assert isinstance(token["data"], text_type) - - else: - assert False, "Unknown token type: %(type)s" % {"type": type} - - yield token diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py deleted file mode 100644 index 4a86501..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py +++ /dev/null @@ -1,207 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - - -class Filter(base.Filter): - """Removes optional tags from the token stream""" - def slider(self): - previous1 = previous2 = None - for token in self.source: - if previous1 is not None: - yield previous2, previous1, token - previous2 = previous1 - previous1 = token - if previous1 is not None: - yield previous2, previous1, None - - def __iter__(self): - for previous, token, next in self.slider(): - type = token["type"] - if type == "StartTag": - if (token["data"] or - not self.is_optional_start(token["name"], previous, next)): - yield token - elif type == "EndTag": - if not self.is_optional_end(token["name"], next): - yield token - else: - yield token - - def is_optional_start(self, tagname, previous, next): - type = next and next["type"] or None - if tagname in 'html': - # An html element's start tag may be omitted if the first thing - # inside the html element is not a space character or a comment. - return type not in ("Comment", "SpaceCharacters") - elif tagname == 'head': - # A head element's start tag may be omitted if the first thing - # inside the head element is an element. - # XXX: we also omit the start tag if the head element is empty - if type in ("StartTag", "EmptyTag"): - return True - elif type == "EndTag": - return next["name"] == "head" - elif tagname == 'body': - # A body element's start tag may be omitted if the first thing - # inside the body element is not a space character or a comment, - # except if the first thing inside the body element is a script - # or style element and the node immediately preceding the body - # element is a head element whose end tag has been omitted. - if type in ("Comment", "SpaceCharacters"): - return False - elif type == "StartTag": - # XXX: we do not look at the preceding event, so we never omit - # the body element's start tag if it's followed by a script or - # a style element. - return next["name"] not in ('script', 'style') - else: - return True - elif tagname == 'colgroup': - # A colgroup element's start tag may be omitted if the first thing - # inside the colgroup element is a col element, and if the element - # is not immediately preceded by another colgroup element whose - # end tag has been omitted. - if type in ("StartTag", "EmptyTag"): - # XXX: we do not look at the preceding event, so instead we never - # omit the colgroup element's end tag when it is immediately - # followed by another colgroup element. See is_optional_end. - return next["name"] == "col" - else: - return False - elif tagname == 'tbody': - # A tbody element's start tag may be omitted if the first thing - # inside the tbody element is a tr element, and if the element is - # not immediately preceded by a tbody, thead, or tfoot element - # whose end tag has been omitted. - if type == "StartTag": - # omit the thead and tfoot elements' end tag when they are - # immediately followed by a tbody element. See is_optional_end. - if previous and previous['type'] == 'EndTag' and \ - previous['name'] in ('tbody', 'thead', 'tfoot'): - return False - return next["name"] == 'tr' - else: - return False - return False - - def is_optional_end(self, tagname, next): - type = next and next["type"] or None - if tagname in ('html', 'head', 'body'): - # An html element's end tag may be omitted if the html element - # is not immediately followed by a space character or a comment. - return type not in ("Comment", "SpaceCharacters") - elif tagname in ('li', 'optgroup', 'tr'): - # A li element's end tag may be omitted if the li element is - # immediately followed by another li element or if there is - # no more content in the parent element. - # An optgroup element's end tag may be omitted if the optgroup - # element is immediately followed by another optgroup element, - # or if there is no more content in the parent element. - # A tr element's end tag may be omitted if the tr element is - # immediately followed by another tr element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] == tagname - else: - return type == "EndTag" or type is None - elif tagname in ('dt', 'dd'): - # A dt element's end tag may be omitted if the dt element is - # immediately followed by another dt element or a dd element. - # A dd element's end tag may be omitted if the dd element is - # immediately followed by another dd element or a dt element, - # or if there is no more content in the parent element. - if type == "StartTag": - return next["name"] in ('dt', 'dd') - elif tagname == 'dd': - return type == "EndTag" or type is None - else: - return False - elif tagname == 'p': - # A p element's end tag may be omitted if the p element is - # immediately followed by an address, article, aside, - # blockquote, datagrid, dialog, dir, div, dl, fieldset, - # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, - # nav, ol, p, pre, section, table, or ul, element, or if - # there is no more content in the parent element. - if type in ("StartTag", "EmptyTag"): - return next["name"] in ('address', 'article', 'aside', - 'blockquote', 'datagrid', 'dialog', - 'dir', 'div', 'dl', 'fieldset', 'footer', - 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', - 'header', 'hr', 'menu', 'nav', 'ol', - 'p', 'pre', 'section', 'table', 'ul') - else: - return type == "EndTag" or type is None - elif tagname == 'option': - # An option element's end tag may be omitted if the option - # element is immediately followed by another option element, - # or if it is immediately followed by an optgroup - # element, or if there is no more content in the parent - # element. - if type == "StartTag": - return next["name"] in ('option', 'optgroup') - else: - return type == "EndTag" or type is None - elif tagname in ('rt', 'rp'): - # An rt element's end tag may be omitted if the rt element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - # An rp element's end tag may be omitted if the rp element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] in ('rt', 'rp') - else: - return type == "EndTag" or type is None - elif tagname == 'colgroup': - # A colgroup element's end tag may be omitted if the colgroup - # element is not immediately followed by a space character or - # a comment. - if type in ("Comment", "SpaceCharacters"): - return False - elif type == "StartTag": - # XXX: we also look for an immediately following colgroup - # element. See is_optional_start. - return next["name"] != 'colgroup' - else: - return True - elif tagname in ('thead', 'tbody'): - # A thead element's end tag may be omitted if the thead element - # is immediately followed by a tbody or tfoot element. - # A tbody element's end tag may be omitted if the tbody element - # is immediately followed by a tbody or tfoot element, or if - # there is no more content in the parent element. - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == "StartTag": - return next["name"] in ['tbody', 'tfoot'] - elif tagname == 'tbody': - return type == "EndTag" or type is None - else: - return False - elif tagname == 'tfoot': - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == "StartTag": - return next["name"] == 'tbody' - else: - return type == "EndTag" or type is None - elif tagname in ('td', 'th'): - # A td element's end tag may be omitted if the td element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - # A th element's end tag may be omitted if the th element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] in ('td', 'th') - else: - return type == "EndTag" or type is None - return False diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py deleted file mode 100644 index aa7431d..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py +++ /dev/null @@ -1,916 +0,0 @@ -"""Deprecated from html5lib 1.1. - -See `here `_ for -information about its deprecation; `Bleach `_ -is recommended as a replacement. Please let us know in the aforementioned issue -if Bleach is unsuitable for your needs. - -""" -from __future__ import absolute_import, division, unicode_literals - -import re -import warnings -from xml.sax.saxutils import escape, unescape - -from pip._vendor.six.moves import urllib_parse as urlparse - -from . import base -from ..constants import namespaces, prefixes - -__all__ = ["Filter"] - - -_deprecation_msg = ( - "html5lib's sanitizer is deprecated; see " + - "https://github.com/html5lib/html5lib-python/issues/443 and please let " + - "us know if Bleach is unsuitable for your needs" -) - -warnings.warn(_deprecation_msg, DeprecationWarning) - -allowed_elements = frozenset(( - (namespaces['html'], 'a'), - (namespaces['html'], 'abbr'), - (namespaces['html'], 'acronym'), - (namespaces['html'], 'address'), - (namespaces['html'], 'area'), - (namespaces['html'], 'article'), - (namespaces['html'], 'aside'), - (namespaces['html'], 'audio'), - (namespaces['html'], 'b'), - (namespaces['html'], 'big'), - (namespaces['html'], 'blockquote'), - (namespaces['html'], 'br'), - (namespaces['html'], 'button'), - (namespaces['html'], 'canvas'), - (namespaces['html'], 'caption'), - (namespaces['html'], 'center'), - (namespaces['html'], 'cite'), - (namespaces['html'], 'code'), - (namespaces['html'], 'col'), - (namespaces['html'], 'colgroup'), - (namespaces['html'], 'command'), - (namespaces['html'], 'datagrid'), - (namespaces['html'], 'datalist'), - (namespaces['html'], 'dd'), - (namespaces['html'], 'del'), - (namespaces['html'], 'details'), - (namespaces['html'], 'dfn'), - (namespaces['html'], 'dialog'), - (namespaces['html'], 'dir'), - (namespaces['html'], 'div'), - (namespaces['html'], 'dl'), - (namespaces['html'], 'dt'), - (namespaces['html'], 'em'), - (namespaces['html'], 'event-source'), - (namespaces['html'], 'fieldset'), - (namespaces['html'], 'figcaption'), - (namespaces['html'], 'figure'), - (namespaces['html'], 'footer'), - (namespaces['html'], 'font'), - (namespaces['html'], 'form'), - (namespaces['html'], 'header'), - (namespaces['html'], 'h1'), - (namespaces['html'], 'h2'), - (namespaces['html'], 'h3'), - (namespaces['html'], 'h4'), - (namespaces['html'], 'h5'), - (namespaces['html'], 'h6'), - (namespaces['html'], 'hr'), - (namespaces['html'], 'i'), - (namespaces['html'], 'img'), - (namespaces['html'], 'input'), - (namespaces['html'], 'ins'), - (namespaces['html'], 'keygen'), - (namespaces['html'], 'kbd'), - (namespaces['html'], 'label'), - (namespaces['html'], 'legend'), - (namespaces['html'], 'li'), - (namespaces['html'], 'm'), - (namespaces['html'], 'map'), - (namespaces['html'], 'menu'), - (namespaces['html'], 'meter'), - (namespaces['html'], 'multicol'), - (namespaces['html'], 'nav'), - (namespaces['html'], 'nextid'), - (namespaces['html'], 'ol'), - (namespaces['html'], 'output'), - (namespaces['html'], 'optgroup'), - (namespaces['html'], 'option'), - (namespaces['html'], 'p'), - (namespaces['html'], 'pre'), - (namespaces['html'], 'progress'), - (namespaces['html'], 'q'), - (namespaces['html'], 's'), - (namespaces['html'], 'samp'), - (namespaces['html'], 'section'), - (namespaces['html'], 'select'), - (namespaces['html'], 'small'), - (namespaces['html'], 'sound'), - (namespaces['html'], 'source'), - (namespaces['html'], 'spacer'), - (namespaces['html'], 'span'), - (namespaces['html'], 'strike'), - (namespaces['html'], 'strong'), - (namespaces['html'], 'sub'), - (namespaces['html'], 'sup'), - (namespaces['html'], 'table'), - (namespaces['html'], 'tbody'), - (namespaces['html'], 'td'), - (namespaces['html'], 'textarea'), - (namespaces['html'], 'time'), - (namespaces['html'], 'tfoot'), - (namespaces['html'], 'th'), - (namespaces['html'], 'thead'), - (namespaces['html'], 'tr'), - (namespaces['html'], 'tt'), - (namespaces['html'], 'u'), - (namespaces['html'], 'ul'), - (namespaces['html'], 'var'), - (namespaces['html'], 'video'), - (namespaces['mathml'], 'maction'), - (namespaces['mathml'], 'math'), - (namespaces['mathml'], 'merror'), - (namespaces['mathml'], 'mfrac'), - (namespaces['mathml'], 'mi'), - (namespaces['mathml'], 'mmultiscripts'), - (namespaces['mathml'], 'mn'), - (namespaces['mathml'], 'mo'), - (namespaces['mathml'], 'mover'), - (namespaces['mathml'], 'mpadded'), - (namespaces['mathml'], 'mphantom'), - (namespaces['mathml'], 'mprescripts'), - (namespaces['mathml'], 'mroot'), - (namespaces['mathml'], 'mrow'), - (namespaces['mathml'], 'mspace'), - (namespaces['mathml'], 'msqrt'), - (namespaces['mathml'], 'mstyle'), - (namespaces['mathml'], 'msub'), - (namespaces['mathml'], 'msubsup'), - (namespaces['mathml'], 'msup'), - (namespaces['mathml'], 'mtable'), - (namespaces['mathml'], 'mtd'), - (namespaces['mathml'], 'mtext'), - (namespaces['mathml'], 'mtr'), - (namespaces['mathml'], 'munder'), - (namespaces['mathml'], 'munderover'), - (namespaces['mathml'], 'none'), - (namespaces['svg'], 'a'), - (namespaces['svg'], 'animate'), - (namespaces['svg'], 'animateColor'), - (namespaces['svg'], 'animateMotion'), - (namespaces['svg'], 'animateTransform'), - (namespaces['svg'], 'clipPath'), - (namespaces['svg'], 'circle'), - (namespaces['svg'], 'defs'), - (namespaces['svg'], 'desc'), - (namespaces['svg'], 'ellipse'), - (namespaces['svg'], 'font-face'), - (namespaces['svg'], 'font-face-name'), - (namespaces['svg'], 'font-face-src'), - (namespaces['svg'], 'g'), - (namespaces['svg'], 'glyph'), - (namespaces['svg'], 'hkern'), - (namespaces['svg'], 'linearGradient'), - (namespaces['svg'], 'line'), - (namespaces['svg'], 'marker'), - (namespaces['svg'], 'metadata'), - (namespaces['svg'], 'missing-glyph'), - (namespaces['svg'], 'mpath'), - (namespaces['svg'], 'path'), - (namespaces['svg'], 'polygon'), - (namespaces['svg'], 'polyline'), - (namespaces['svg'], 'radialGradient'), - (namespaces['svg'], 'rect'), - (namespaces['svg'], 'set'), - (namespaces['svg'], 'stop'), - (namespaces['svg'], 'svg'), - (namespaces['svg'], 'switch'), - (namespaces['svg'], 'text'), - (namespaces['svg'], 'title'), - (namespaces['svg'], 'tspan'), - (namespaces['svg'], 'use'), -)) - -allowed_attributes = frozenset(( - # HTML attributes - (None, 'abbr'), - (None, 'accept'), - (None, 'accept-charset'), - (None, 'accesskey'), - (None, 'action'), - (None, 'align'), - (None, 'alt'), - (None, 'autocomplete'), - (None, 'autofocus'), - (None, 'axis'), - (None, 'background'), - (None, 'balance'), - (None, 'bgcolor'), - (None, 'bgproperties'), - (None, 'border'), - (None, 'bordercolor'), - (None, 'bordercolordark'), - (None, 'bordercolorlight'), - (None, 'bottompadding'), - (None, 'cellpadding'), - (None, 'cellspacing'), - (None, 'ch'), - (None, 'challenge'), - (None, 'char'), - (None, 'charoff'), - (None, 'choff'), - (None, 'charset'), - (None, 'checked'), - (None, 'cite'), - (None, 'class'), - (None, 'clear'), - (None, 'color'), - (None, 'cols'), - (None, 'colspan'), - (None, 'compact'), - (None, 'contenteditable'), - (None, 'controls'), - (None, 'coords'), - (None, 'data'), - (None, 'datafld'), - (None, 'datapagesize'), - (None, 'datasrc'), - (None, 'datetime'), - (None, 'default'), - (None, 'delay'), - (None, 'dir'), - (None, 'disabled'), - (None, 'draggable'), - (None, 'dynsrc'), - (None, 'enctype'), - (None, 'end'), - (None, 'face'), - (None, 'for'), - (None, 'form'), - (None, 'frame'), - (None, 'galleryimg'), - (None, 'gutter'), - (None, 'headers'), - (None, 'height'), - (None, 'hidefocus'), - (None, 'hidden'), - (None, 'high'), - (None, 'href'), - (None, 'hreflang'), - (None, 'hspace'), - (None, 'icon'), - (None, 'id'), - (None, 'inputmode'), - (None, 'ismap'), - (None, 'keytype'), - (None, 'label'), - (None, 'leftspacing'), - (None, 'lang'), - (None, 'list'), - (None, 'longdesc'), - (None, 'loop'), - (None, 'loopcount'), - (None, 'loopend'), - (None, 'loopstart'), - (None, 'low'), - (None, 'lowsrc'), - (None, 'max'), - (None, 'maxlength'), - (None, 'media'), - (None, 'method'), - (None, 'min'), - (None, 'multiple'), - (None, 'name'), - (None, 'nohref'), - (None, 'noshade'), - (None, 'nowrap'), - (None, 'open'), - (None, 'optimum'), - (None, 'pattern'), - (None, 'ping'), - (None, 'point-size'), - (None, 'poster'), - (None, 'pqg'), - (None, 'preload'), - (None, 'prompt'), - (None, 'radiogroup'), - (None, 'readonly'), - (None, 'rel'), - (None, 'repeat-max'), - (None, 'repeat-min'), - (None, 'replace'), - (None, 'required'), - (None, 'rev'), - (None, 'rightspacing'), - (None, 'rows'), - (None, 'rowspan'), - (None, 'rules'), - (None, 'scope'), - (None, 'selected'), - (None, 'shape'), - (None, 'size'), - (None, 'span'), - (None, 'src'), - (None, 'start'), - (None, 'step'), - (None, 'style'), - (None, 'summary'), - (None, 'suppress'), - (None, 'tabindex'), - (None, 'target'), - (None, 'template'), - (None, 'title'), - (None, 'toppadding'), - (None, 'type'), - (None, 'unselectable'), - (None, 'usemap'), - (None, 'urn'), - (None, 'valign'), - (None, 'value'), - (None, 'variable'), - (None, 'volume'), - (None, 'vspace'), - (None, 'vrml'), - (None, 'width'), - (None, 'wrap'), - (namespaces['xml'], 'lang'), - # MathML attributes - (None, 'actiontype'), - (None, 'align'), - (None, 'columnalign'), - (None, 'columnalign'), - (None, 'columnalign'), - (None, 'columnlines'), - (None, 'columnspacing'), - (None, 'columnspan'), - (None, 'depth'), - (None, 'display'), - (None, 'displaystyle'), - (None, 'equalcolumns'), - (None, 'equalrows'), - (None, 'fence'), - (None, 'fontstyle'), - (None, 'fontweight'), - (None, 'frame'), - (None, 'height'), - (None, 'linethickness'), - (None, 'lspace'), - (None, 'mathbackground'), - (None, 'mathcolor'), - (None, 'mathvariant'), - (None, 'mathvariant'), - (None, 'maxsize'), - (None, 'minsize'), - (None, 'other'), - (None, 'rowalign'), - (None, 'rowalign'), - (None, 'rowalign'), - (None, 'rowlines'), - (None, 'rowspacing'), - (None, 'rowspan'), - (None, 'rspace'), - (None, 'scriptlevel'), - (None, 'selection'), - (None, 'separator'), - (None, 'stretchy'), - (None, 'width'), - (None, 'width'), - (namespaces['xlink'], 'href'), - (namespaces['xlink'], 'show'), - (namespaces['xlink'], 'type'), - # SVG attributes - (None, 'accent-height'), - (None, 'accumulate'), - (None, 'additive'), - (None, 'alphabetic'), - (None, 'arabic-form'), - (None, 'ascent'), - (None, 'attributeName'), - (None, 'attributeType'), - (None, 'baseProfile'), - (None, 'bbox'), - (None, 'begin'), - (None, 'by'), - (None, 'calcMode'), - (None, 'cap-height'), - (None, 'class'), - (None, 'clip-path'), - (None, 'color'), - (None, 'color-rendering'), - (None, 'content'), - (None, 'cx'), - (None, 'cy'), - (None, 'd'), - (None, 'dx'), - (None, 'dy'), - (None, 'descent'), - (None, 'display'), - (None, 'dur'), - (None, 'end'), - (None, 'fill'), - (None, 'fill-opacity'), - (None, 'fill-rule'), - (None, 'font-family'), - (None, 'font-size'), - (None, 'font-stretch'), - (None, 'font-style'), - (None, 'font-variant'), - (None, 'font-weight'), - (None, 'from'), - (None, 'fx'), - (None, 'fy'), - (None, 'g1'), - (None, 'g2'), - (None, 'glyph-name'), - (None, 'gradientUnits'), - (None, 'hanging'), - (None, 'height'), - (None, 'horiz-adv-x'), - (None, 'horiz-origin-x'), - (None, 'id'), - (None, 'ideographic'), - (None, 'k'), - (None, 'keyPoints'), - (None, 'keySplines'), - (None, 'keyTimes'), - (None, 'lang'), - (None, 'marker-end'), - (None, 'marker-mid'), - (None, 'marker-start'), - (None, 'markerHeight'), - (None, 'markerUnits'), - (None, 'markerWidth'), - (None, 'mathematical'), - (None, 'max'), - (None, 'min'), - (None, 'name'), - (None, 'offset'), - (None, 'opacity'), - (None, 'orient'), - (None, 'origin'), - (None, 'overline-position'), - (None, 'overline-thickness'), - (None, 'panose-1'), - (None, 'path'), - (None, 'pathLength'), - (None, 'points'), - (None, 'preserveAspectRatio'), - (None, 'r'), - (None, 'refX'), - (None, 'refY'), - (None, 'repeatCount'), - (None, 'repeatDur'), - (None, 'requiredExtensions'), - (None, 'requiredFeatures'), - (None, 'restart'), - (None, 'rotate'), - (None, 'rx'), - (None, 'ry'), - (None, 'slope'), - (None, 'stemh'), - (None, 'stemv'), - (None, 'stop-color'), - (None, 'stop-opacity'), - (None, 'strikethrough-position'), - (None, 'strikethrough-thickness'), - (None, 'stroke'), - (None, 'stroke-dasharray'), - (None, 'stroke-dashoffset'), - (None, 'stroke-linecap'), - (None, 'stroke-linejoin'), - (None, 'stroke-miterlimit'), - (None, 'stroke-opacity'), - (None, 'stroke-width'), - (None, 'systemLanguage'), - (None, 'target'), - (None, 'text-anchor'), - (None, 'to'), - (None, 'transform'), - (None, 'type'), - (None, 'u1'), - (None, 'u2'), - (None, 'underline-position'), - (None, 'underline-thickness'), - (None, 'unicode'), - (None, 'unicode-range'), - (None, 'units-per-em'), - (None, 'values'), - (None, 'version'), - (None, 'viewBox'), - (None, 'visibility'), - (None, 'width'), - (None, 'widths'), - (None, 'x'), - (None, 'x-height'), - (None, 'x1'), - (None, 'x2'), - (namespaces['xlink'], 'actuate'), - (namespaces['xlink'], 'arcrole'), - (namespaces['xlink'], 'href'), - (namespaces['xlink'], 'role'), - (namespaces['xlink'], 'show'), - (namespaces['xlink'], 'title'), - (namespaces['xlink'], 'type'), - (namespaces['xml'], 'base'), - (namespaces['xml'], 'lang'), - (namespaces['xml'], 'space'), - (None, 'y'), - (None, 'y1'), - (None, 'y2'), - (None, 'zoomAndPan'), -)) - -attr_val_is_uri = frozenset(( - (None, 'href'), - (None, 'src'), - (None, 'cite'), - (None, 'action'), - (None, 'longdesc'), - (None, 'poster'), - (None, 'background'), - (None, 'datasrc'), - (None, 'dynsrc'), - (None, 'lowsrc'), - (None, 'ping'), - (namespaces['xlink'], 'href'), - (namespaces['xml'], 'base'), -)) - -svg_attr_val_allows_ref = frozenset(( - (None, 'clip-path'), - (None, 'color-profile'), - (None, 'cursor'), - (None, 'fill'), - (None, 'filter'), - (None, 'marker'), - (None, 'marker-start'), - (None, 'marker-mid'), - (None, 'marker-end'), - (None, 'mask'), - (None, 'stroke'), -)) - -svg_allow_local_href = frozenset(( - (None, 'altGlyph'), - (None, 'animate'), - (None, 'animateColor'), - (None, 'animateMotion'), - (None, 'animateTransform'), - (None, 'cursor'), - (None, 'feImage'), - (None, 'filter'), - (None, 'linearGradient'), - (None, 'pattern'), - (None, 'radialGradient'), - (None, 'textpath'), - (None, 'tref'), - (None, 'set'), - (None, 'use') -)) - -allowed_css_properties = frozenset(( - 'azimuth', - 'background-color', - 'border-bottom-color', - 'border-collapse', - 'border-color', - 'border-left-color', - 'border-right-color', - 'border-top-color', - 'clear', - 'color', - 'cursor', - 'direction', - 'display', - 'elevation', - 'float', - 'font', - 'font-family', - 'font-size', - 'font-style', - 'font-variant', - 'font-weight', - 'height', - 'letter-spacing', - 'line-height', - 'overflow', - 'pause', - 'pause-after', - 'pause-before', - 'pitch', - 'pitch-range', - 'richness', - 'speak', - 'speak-header', - 'speak-numeral', - 'speak-punctuation', - 'speech-rate', - 'stress', - 'text-align', - 'text-decoration', - 'text-indent', - 'unicode-bidi', - 'vertical-align', - 'voice-family', - 'volume', - 'white-space', - 'width', -)) - -allowed_css_keywords = frozenset(( - 'auto', - 'aqua', - 'black', - 'block', - 'blue', - 'bold', - 'both', - 'bottom', - 'brown', - 'center', - 'collapse', - 'dashed', - 'dotted', - 'fuchsia', - 'gray', - 'green', - '!important', - 'italic', - 'left', - 'lime', - 'maroon', - 'medium', - 'none', - 'navy', - 'normal', - 'nowrap', - 'olive', - 'pointer', - 'purple', - 'red', - 'right', - 'solid', - 'silver', - 'teal', - 'top', - 'transparent', - 'underline', - 'white', - 'yellow', -)) - -allowed_svg_properties = frozenset(( - 'fill', - 'fill-opacity', - 'fill-rule', - 'stroke', - 'stroke-width', - 'stroke-linecap', - 'stroke-linejoin', - 'stroke-opacity', -)) - -allowed_protocols = frozenset(( - 'ed2k', - 'ftp', - 'http', - 'https', - 'irc', - 'mailto', - 'news', - 'gopher', - 'nntp', - 'telnet', - 'webcal', - 'xmpp', - 'callto', - 'feed', - 'urn', - 'aim', - 'rsync', - 'tag', - 'ssh', - 'sftp', - 'rtsp', - 'afs', - 'data', -)) - -allowed_content_types = frozenset(( - 'image/png', - 'image/jpeg', - 'image/gif', - 'image/webp', - 'image/bmp', - 'text/plain', -)) - - -data_content_type = re.compile(r''' - ^ - # Match a content type / - (?P[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) - # Match any character set and encoding - (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) - |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) - # Assume the rest is data - ,.* - $ - ''', - re.VERBOSE) - - -class Filter(base.Filter): - """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" - def __init__(self, - source, - allowed_elements=allowed_elements, - allowed_attributes=allowed_attributes, - allowed_css_properties=allowed_css_properties, - allowed_css_keywords=allowed_css_keywords, - allowed_svg_properties=allowed_svg_properties, - allowed_protocols=allowed_protocols, - allowed_content_types=allowed_content_types, - attr_val_is_uri=attr_val_is_uri, - svg_attr_val_allows_ref=svg_attr_val_allows_ref, - svg_allow_local_href=svg_allow_local_href): - """Creates a Filter - - :arg allowed_elements: set of elements to allow--everything else will - be escaped - - :arg allowed_attributes: set of attributes to allow in - elements--everything else will be stripped - - :arg allowed_css_properties: set of CSS properties to allow--everything - else will be stripped - - :arg allowed_css_keywords: set of CSS keywords to allow--everything - else will be stripped - - :arg allowed_svg_properties: set of SVG properties to allow--everything - else will be removed - - :arg allowed_protocols: set of allowed protocols for URIs - - :arg allowed_content_types: set of allowed content types for ``data`` URIs. - - :arg attr_val_is_uri: set of attributes that have URI values--values - that have a scheme not listed in ``allowed_protocols`` are removed - - :arg svg_attr_val_allows_ref: set of SVG attributes that can have - references - - :arg svg_allow_local_href: set of SVG elements that can have local - hrefs--these are removed - - """ - super(Filter, self).__init__(source) - - warnings.warn(_deprecation_msg, DeprecationWarning) - - self.allowed_elements = allowed_elements - self.allowed_attributes = allowed_attributes - self.allowed_css_properties = allowed_css_properties - self.allowed_css_keywords = allowed_css_keywords - self.allowed_svg_properties = allowed_svg_properties - self.allowed_protocols = allowed_protocols - self.allowed_content_types = allowed_content_types - self.attr_val_is_uri = attr_val_is_uri - self.svg_attr_val_allows_ref = svg_attr_val_allows_ref - self.svg_allow_local_href = svg_allow_local_href - - def __iter__(self): - for token in base.Filter.__iter__(self): - token = self.sanitize_token(token) - if token: - yield token - - # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and - # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes - # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and - # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI - # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are - # allowed. - # - # sanitize_html('') - # => <script> do_nasty_stuff() </script> - # sanitize_html('Click here for $100') - # => Click here for $100 - def sanitize_token(self, token): - - # accommodate filters which use token_type differently - token_type = token["type"] - if token_type in ("StartTag", "EndTag", "EmptyTag"): - name = token["name"] - namespace = token["namespace"] - if ((namespace, name) in self.allowed_elements or - (namespace is None and - (namespaces["html"], name) in self.allowed_elements)): - return self.allowed_token(token) - else: - return self.disallowed_token(token) - elif token_type == "Comment": - pass - else: - return token - - def allowed_token(self, token): - if "data" in token: - attrs = token["data"] - attr_names = set(attrs.keys()) - - # Remove forbidden attributes - for to_remove in (attr_names - self.allowed_attributes): - del token["data"][to_remove] - attr_names.remove(to_remove) - - # Remove attributes with disallowed URL values - for attr in (attr_names & self.attr_val_is_uri): - assert attr in attrs - # I don't have a clue where this regexp comes from or why it matches those - # characters, nor why we call unescape. I just know it's always been here. - # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all - # this will do is remove *more* than it otherwise would. - val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', - unescape(attrs[attr])).lower() - # remove replacement characters from unescaped characters - val_unescaped = val_unescaped.replace("\ufffd", "") - try: - uri = urlparse.urlparse(val_unescaped) - except ValueError: - uri = None - del attrs[attr] - if uri and uri.scheme: - if uri.scheme not in self.allowed_protocols: - del attrs[attr] - if uri.scheme == 'data': - m = data_content_type.match(uri.path) - if not m: - del attrs[attr] - elif m.group('content_type') not in self.allowed_content_types: - del attrs[attr] - - for attr in self.svg_attr_val_allows_ref: - if attr in attrs: - attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', - ' ', - unescape(attrs[attr])) - if (token["name"] in self.svg_allow_local_href and - (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', - attrs[(namespaces['xlink'], 'href')])): - del attrs[(namespaces['xlink'], 'href')] - if (None, 'style') in attrs: - attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) - token["data"] = attrs - return token - - def disallowed_token(self, token): - token_type = token["type"] - if token_type == "EndTag": - token["data"] = "" % token["name"] - elif token["data"]: - assert token_type in ("StartTag", "EmptyTag") - attrs = [] - for (ns, name), v in token["data"].items(): - attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) - token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) - else: - token["data"] = "<%s>" % token["name"] - if token.get("selfClosing"): - token["data"] = token["data"][:-1] + "/>" - - token["type"] = "Characters" - - del token["name"] - return token - - def sanitize_css(self, style): - # disallow urls - style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) - - # gauntlet - if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): - return '' - if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): - return '' - - clean = [] - for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): - if not value: - continue - if prop.lower() in self.allowed_css_properties: - clean.append(prop + ': ' + value + ';') - elif prop.split('-')[0].lower() in ['background', 'border', 'margin', - 'padding']: - for keyword in value.split(): - if keyword not in self.allowed_css_keywords and \ - not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa - break - else: - clean.append(prop + ': ' + value + ';') - elif prop.lower() in self.allowed_svg_properties: - clean.append(prop + ': ' + value + ';') - - return ' '.join(clean) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py deleted file mode 100644 index 0d12584..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re - -from . import base -from ..constants import rcdataElements, spaceCharacters -spaceCharacters = "".join(spaceCharacters) - -SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) - - -class Filter(base.Filter): - """Collapses whitespace except in pre, textarea, and script elements""" - spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) - - def __iter__(self): - preserve = 0 - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag" \ - and (preserve or token["name"] in self.spacePreserveElements): - preserve += 1 - - elif type == "EndTag" and preserve: - preserve -= 1 - - elif not preserve and type == "SpaceCharacters" and token["data"]: - # Test on token["data"] above to not introduce spaces where there were not - token["data"] = " " - - elif not preserve and type == "Characters": - token["data"] = collapse_spaces(token["data"]) - - yield token - - -def collapse_spaces(text): - return SPACES_REGEX.sub(' ', text) diff --git a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/html5parser.py b/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/html5parser.py deleted file mode 100644 index d06784f..0000000 --- a/sbsheriff/Lib/site-packages/pip/_vendor/html5lib/html5parser.py +++ /dev/null @@ -1,2795 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import with_metaclass, viewkeys - -import types - -from . import _inputstream -from . import _tokenizer - -from . import treebuilders -from .treebuilders.base import Marker - -from . import _utils -from .constants import ( - spaceCharacters, asciiUpper2Lower, - specialElements, headingElements, cdataElements, rcdataElements, - tokenTypes, tagTokenTypes, - namespaces, - htmlIntegrationPointElements, mathmlTextIntegrationPointElements, - adjustForeignAttributes as adjustForeignAttributesMap, - adjustMathMLAttributes, adjustSVGAttributes, - E, - _ReparseException -) - - -def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML document as a string or file-like object into a tree - - :arg doc: the document to parse as a string or file-like object - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import parse - >>> parse('