From 4204ed019e33cc5bd0887a74d321c3bc9ec83bd6 Mon Sep 17 00:00:00 2001 From: Vladimir Mashyanov <88646034+VL1507@users.noreply.github.com> Date: Thu, 6 Mar 2025 00:58:36 +1000 Subject: [PATCH 1/5] Delete venv directory venv should not be on github --- venv/Include/site/python3.9/pygame/_camera.h | 27 - venv/Include/site/python3.9/pygame/_pygame.h | 350 - venv/Include/site/python3.9/pygame/_surface.h | 31 - venv/Include/site/python3.9/pygame/camera.h | 205 - .../site/python3.9/pygame/fastevents.h | 48 - venv/Include/site/python3.9/pygame/font.h | 15 - venv/Include/site/python3.9/pygame/freetype.h | 123 - .../site/python3.9/pygame/include/_pygame.h | 649 -- .../site/python3.9/pygame/include/bitmask.h | 149 - .../site/python3.9/pygame/include/pgcompat.h | 180 - .../site/python3.9/pygame/include/pgimport.h | 80 - .../python3.9/pygame/include/pgplatform.h | 91 - .../site/python3.9/pygame/include/pygame.h | 34 - .../pygame/include/pygame_bufferproxy.h | 59 - .../python3.9/pygame/include/pygame_font.h | 53 - .../pygame/include/pygame_freetype.h | 43 - .../python3.9/pygame/include/pygame_mask.h | 47 - .../python3.9/pygame/include/pygame_mixer.h | 82 - .../site/python3.9/pygame/include/sse2neon.h | 3676 -------- venv/Include/site/python3.9/pygame/mask.h | 7 - venv/Include/site/python3.9/pygame/mixer.h | 14 - venv/Include/site/python3.9/pygame/palette.h | 123 - .../site/python3.9/pygame/pgarrinter.h | 26 - .../site/python3.9/pygame/pgbufferproxy.h | 7 - venv/Include/site/python3.9/pygame/pgcompat.h | 207 - venv/Include/site/python3.9/pygame/pgimport.h | 13 - venv/Include/site/python3.9/pygame/pgopengl.h | 18 - .../site/python3.9/pygame/pgplatform.h | 38 - venv/Include/site/python3.9/pygame/pygame.h | 32 - venv/Include/site/python3.9/pygame/scrap.h | 148 - venv/Include/site/python3.9/pygame/surface.h | 384 - .../site-packages/_distutils_hack/__init__.py | 128 - .../site-packages/_distutils_hack/override.py | 1 - .../site-packages/distutils-precedence.pth | 1 - venv/Lib/site-packages/pip/__init__.py | 14 - venv/Lib/site-packages/pip/__main__.py | 31 - .../pip/__pycache__/__init__.cpython-39.pyc | Bin 589 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 15 - .../__pycache__/__init__.cpython-39.pyc | Bin 638 -> 0 bytes .../__pycache__/build_env.cpython-39.pyc | Bin 8951 -> 0 bytes .../__pycache__/cache.cpython-39.pyc | Bin 7841 -> 0 bytes .../__pycache__/configuration.cpython-39.pyc | Bin 10693 -> 0 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 15642 -> 0 bytes .../__pycache__/pyproject.cpython-39.pyc | Bin 3453 -> 0 bytes .../self_outdated_check.cpython-39.pyc | Bin 4338 -> 0 bytes .../__pycache__/wheel_builder.cpython-39.pyc | Bin 8276 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 286 - venv/Lib/site-packages/pip/_internal/cache.py | 287 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-39.pyc | Bin 271 -> 0 bytes .../__pycache__/autocompletion.cpython-39.pyc | Bin 4969 -> 0 bytes .../__pycache__/base_command.cpython-39.pyc | Bin 5792 -> 0 bytes .../cli/__pycache__/cmdoptions.cpython-39.pyc | Bin 21026 -> 0 bytes .../command_context.cpython-39.pyc | Bin 1220 -> 0 bytes .../cli/__pycache__/main.cpython-39.pyc | Bin 1320 -> 0 bytes .../__pycache__/main_parser.cpython-39.pyc | Bin 2101 -> 0 bytes .../cli/__pycache__/parser.cpython-39.pyc | Bin 9365 -> 0 bytes .../__pycache__/progress_bars.cpython-39.pyc | Bin 7437 -> 0 bytes .../__pycache__/req_command.cpython-39.pyc | Bin 11210 -> 0 bytes .../cli/__pycache__/spinners.cpython-39.pyc | Bin 4608 -> 0 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 350 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 162 - .../pip/_internal/cli/base_command.py | 221 - .../pip/_internal/cli/cmdoptions.py | 1024 -- .../pip/_internal/cli/command_context.py | 30 - .../site-packages/pip/_internal/cli/main.py | 71 - .../pip/_internal/cli/main_parser.py | 89 - .../site-packages/pip/_internal/cli/parser.py | 305 - .../pip/_internal/cli/progress_bars.py | 261 - .../pip/_internal/cli/req_command.py | 461 - .../pip/_internal/cli/spinners.py | 172 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 110 - .../__pycache__/__init__.cpython-39.pyc | Bin 2864 -> 0 bytes .../__pycache__/install.cpython-39.pyc | Bin 16695 -> 0 bytes .../pip/_internal/commands/cache.py | 228 - .../pip/_internal/commands/check.py | 48 - .../pip/_internal/commands/completion.py | 93 - .../pip/_internal/commands/configuration.py | 280 - .../pip/_internal/commands/debug.py | 215 - .../pip/_internal/commands/download.py | 141 - .../pip/_internal/commands/freeze.py | 104 - .../pip/_internal/commands/hash.py | 58 - .../pip/_internal/commands/help.py | 42 - .../pip/_internal/commands/install.py | 740 -- .../pip/_internal/commands/list.py | 319 - .../pip/_internal/commands/search.py | 162 - .../pip/_internal/commands/show.py | 181 - .../pip/_internal/commands/uninstall.py | 92 - .../pip/_internal/commands/wheel.py | 178 - .../pip/_internal/configuration.py | 403 - .../pip/_internal/distributions/__init__.py | 20 - .../__pycache__/__init__.cpython-39.pyc | Bin 767 -> 0 bytes .../__pycache__/base.cpython-39.pyc | Bin 1823 -> 0 bytes .../__pycache__/installed.cpython-39.pyc | Bin 1168 -> 0 bytes .../__pycache__/sdist.cpython-39.pyc | Bin 3431 -> 0 bytes .../__pycache__/wheel.cpython-39.pyc | Bin 1512 -> 0 bytes .../pip/_internal/distributions/base.py | 39 - .../pip/_internal/distributions/installed.py | 22 - .../pip/_internal/distributions/sdist.py | 95 - .../pip/_internal/distributions/wheel.py | 34 - .../site-packages/pip/_internal/exceptions.py | 397 - .../pip/_internal/index/__init__.py | 2 - .../index/__pycache__/__init__.cpython-39.pyc | Bin 225 -> 0 bytes .../__pycache__/collector.cpython-39.pyc | Bin 15081 -> 0 bytes .../__pycache__/package_finder.cpython-39.pyc | Bin 26608 -> 0 bytes .../index/__pycache__/sources.cpython-39.pyc | Bin 7190 -> 0 bytes .../pip/_internal/index/collector.py | 556 -- .../pip/_internal/index/package_finder.py | 1012 -- .../pip/_internal/index/sources.py | 224 - .../pip/_internal/locations/__init__.py | 184 - .../__pycache__/__init__.cpython-39.pyc | Bin 3681 -> 0 bytes .../__pycache__/_distutils.cpython-39.pyc | Bin 3878 -> 0 bytes .../__pycache__/_sysconfig.cpython-39.pyc | Bin 4496 -> 0 bytes .../locations/__pycache__/base.cpython-39.pyc | Bin 1209 -> 0 bytes .../pip/_internal/locations/_distutils.py | 150 - .../pip/_internal/locations/_sysconfig.py | 180 - .../pip/_internal/locations/base.py | 48 - venv/Lib/site-packages/pip/_internal/main.py | 13 - .../pip/_internal/metadata/__init__.py | 43 - .../__pycache__/__init__.cpython-39.pyc | Bin 1724 -> 0 bytes .../metadata/__pycache__/base.cpython-39.pyc | Bin 5298 -> 0 bytes .../__pycache__/pkg_resources.cpython-39.pyc | Bin 4252 -> 0 bytes .../pip/_internal/metadata/base.py | 142 - .../pip/_internal/metadata/pkg_resources.py | 126 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-39.pyc | Bin 259 -> 0 bytes .../__pycache__/candidate.cpython-39.pyc | Bin 1372 -> 0 bytes .../__pycache__/direct_url.cpython-39.pyc | Bin 6285 -> 0 bytes .../__pycache__/format_control.cpython-39.pyc | Bin 2529 -> 0 bytes .../models/__pycache__/index.cpython-39.pyc | Bin 1182 -> 0 bytes .../models/__pycache__/link.cpython-39.pyc | Bin 7186 -> 0 bytes .../models/__pycache__/scheme.cpython-39.pyc | Bin 937 -> 0 bytes .../__pycache__/search_scope.cpython-39.pyc | Bin 3338 -> 0 bytes .../selection_prefs.cpython-39.pyc | Bin 1572 -> 0 bytes .../__pycache__/target_python.cpython-39.pyc | Bin 3269 -> 0 bytes .../models/__pycache__/wheel.cpython-39.pyc | Bin 4184 -> 0 bytes .../pip/_internal/models/candidate.py | 34 - .../pip/_internal/models/direct_url.py | 233 - .../pip/_internal/models/format_control.py | 86 - .../pip/_internal/models/index.py | 34 - .../pip/_internal/models/link.py | 248 - .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 131 - .../pip/_internal/models/selection_prefs.py | 47 - .../pip/_internal/models/target_python.py | 114 - .../pip/_internal/models/wheel.py | 95 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-39.pyc | Bin 247 -> 0 bytes .../network/__pycache__/auth.cpython-39.pyc | Bin 7044 -> 0 bytes .../network/__pycache__/cache.cpython-39.pyc | Bin 2726 -> 0 bytes .../__pycache__/download.cpython-39.pyc | Bin 5086 -> 0 bytes .../__pycache__/lazy_wheel.cpython-39.pyc | Bin 7911 -> 0 bytes .../__pycache__/session.cpython-39.pyc | Bin 9494 -> 0 bytes .../network/__pycache__/utils.cpython-39.pyc | Bin 1313 -> 0 bytes .../pip/_internal/network/auth.py | 312 - .../pip/_internal/network/cache.py | 76 - .../pip/_internal/network/download.py | 196 - .../pip/_internal/network/lazy_wheel.py | 224 - .../pip/_internal/network/session.py | 449 - .../pip/_internal/network/utils.py | 95 - .../pip/_internal/network/xmlrpc.py | 49 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 195 -> 0 bytes .../__pycache__/check.cpython-39.pyc | Bin 3691 -> 0 bytes .../__pycache__/prepare.cpython-39.pyc | Bin 14231 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-39.pyc | Bin 201 -> 0 bytes .../build/__pycache__/metadata.cpython-39.pyc | Bin 1147 -> 0 bytes .../metadata_legacy.cpython-39.pyc | Bin 1921 -> 0 bytes .../build/__pycache__/wheel.cpython-39.pyc | Bin 1126 -> 0 bytes .../__pycache__/wheel_legacy.cpython-39.pyc | Bin 2520 -> 0 bytes .../_internal/operations/build/metadata.py | 35 - .../operations/build/metadata_legacy.py | 74 - .../pip/_internal/operations/build/wheel.py | 38 - .../operations/build/wheel_legacy.py | 110 - .../pip/_internal/operations/check.py | 153 - .../pip/_internal/operations/freeze.py | 264 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-39.pyc | Bin 259 -> 0 bytes .../editable_legacy.cpython-39.pyc | Bin 1302 -> 0 bytes .../install/__pycache__/legacy.cpython-39.pyc | Bin 3190 -> 0 bytes .../install/__pycache__/wheel.cpython-39.pyc | Bin 20812 -> 0 bytes .../operations/install/editable_legacy.py | 47 - .../_internal/operations/install/legacy.py | 125 - .../pip/_internal/operations/install/wheel.py | 819 -- .../pip/_internal/operations/prepare.py | 655 -- .../site-packages/pip/_internal/pyproject.py | 183 - .../pip/_internal/req/__init__.py | 98 - .../req/__pycache__/__init__.cpython-39.pyc | Bin 2342 -> 0 bytes .../__pycache__/constructors.cpython-39.pyc | Bin 11002 -> 0 bytes .../req/__pycache__/req_file.cpython-39.pyc | Bin 12435 -> 0 bytes .../__pycache__/req_install.cpython-39.pyc | Bin 21033 -> 0 bytes .../req/__pycache__/req_set.cpython-39.pyc | Bin 5679 -> 0 bytes .../__pycache__/req_tracker.cpython-39.pyc | Bin 4024 -> 0 bytes .../__pycache__/req_uninstall.cpython-39.pyc | Bin 17460 -> 0 bytes .../pip/_internal/req/constructors.py | 486 - .../pip/_internal/req/req_file.py | 551 -- .../pip/_internal/req/req_install.py | 892 -- .../pip/_internal/req/req_set.py | 199 - .../pip/_internal/req/req_tracker.py | 140 - .../pip/_internal/req/req_uninstall.py | 640 -- .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 195 -> 0 bytes .../__pycache__/base.cpython-39.pyc | Bin 938 -> 0 bytes .../pip/_internal/resolution/base.py | 16 - .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 462 - .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 206 -> 0 bytes .../__pycache__/base.cpython-39.pyc | Bin 6308 -> 0 bytes .../__pycache__/candidates.cpython-39.pyc | Bin 17888 -> 0 bytes .../__pycache__/factory.cpython-39.pyc | Bin 16355 -> 0 bytes .../found_candidates.cpython-39.pyc | Bin 4654 -> 0 bytes .../__pycache__/provider.cpython-39.pyc | Bin 6574 -> 0 bytes .../__pycache__/reporter.cpython-39.pyc | Bin 3138 -> 0 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 7043 -> 0 bytes .../__pycache__/resolver.cpython-39.pyc | Bin 8050 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 165 - .../resolution/resolvelib/candidates.py | 604 -- .../resolution/resolvelib/factory.py | 661 -- .../resolution/resolvelib/found_candidates.py | 145 - .../resolution/resolvelib/provider.py | 175 - .../resolution/resolvelib/reporter.py | 78 - .../resolution/resolvelib/requirements.py | 198 - .../resolution/resolvelib/resolver.py | 305 - .../pip/_internal/self_outdated_check.py | 187 - .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-39.pyc | Bin 190 -> 0 bytes .../utils/__pycache__/appdirs.cpython-39.pyc | Bin 1255 -> 0 bytes .../utils/__pycache__/compat.cpython-39.pyc | Bin 1457 -> 0 bytes .../compatibility_tags.cpython-39.pyc | Bin 3833 -> 0 bytes .../__pycache__/deprecation.cpython-39.pyc | Bin 2756 -> 0 bytes .../direct_url_helpers.cpython-39.pyc | Bin 2510 -> 0 bytes .../__pycache__/distutils_args.cpython-39.pyc | Bin 1055 -> 0 bytes .../utils/__pycache__/encoding.cpython-39.pyc | Bin 1220 -> 0 bytes .../__pycache__/filesystem.cpython-39.pyc | Bin 4929 -> 0 bytes .../__pycache__/filetypes.cpython-39.pyc | Bin 802 -> 0 bytes .../utils/__pycache__/glibc.cpython-39.pyc | Bin 1612 -> 0 bytes .../utils/__pycache__/hashes.cpython-39.pyc | Bin 4994 -> 0 bytes .../inject_securetransport.cpython-39.pyc | Bin 963 -> 0 bytes .../utils/__pycache__/logging.cpython-39.pyc | Bin 8914 -> 0 bytes .../utils/__pycache__/misc.cpython-39.pyc | Bin 21518 -> 0 bytes .../utils/__pycache__/models.cpython-39.pyc | Bin 1894 -> 0 bytes .../__pycache__/packaging.cpython-39.pyc | Bin 2518 -> 0 bytes .../__pycache__/pkg_resources.cpython-39.pyc | Bin 1716 -> 0 bytes .../setuptools_build.cpython-39.pyc | Bin 2960 -> 0 bytes .../__pycache__/subprocess.cpython-39.pyc | Bin 5683 -> 0 bytes .../utils/__pycache__/temp_dir.cpython-39.pyc | Bin 6834 -> 0 bytes .../__pycache__/unpacking.cpython-39.pyc | Bin 6455 -> 0 bytes .../utils/__pycache__/urls.cpython-39.pyc | Bin 1346 -> 0 bytes .../__pycache__/virtualenv.cpython-39.pyc | Bin 3213 -> 0 bytes .../utils/__pycache__/wheel.cpython-39.pyc | Bin 5964 -> 0 bytes .../pip/_internal/utils/appdirs.py | 38 - .../pip/_internal/utils/compat.py | 65 - .../pip/_internal/utils/compatibility_tags.py | 174 - .../pip/_internal/utils/datetime.py | 12 - .../pip/_internal/utils/deprecation.py | 102 - .../pip/_internal/utils/direct_url_helpers.py | 117 - .../pip/_internal/utils/distutils_args.py | 43 - .../pip/_internal/utils/encoding.py | 37 - .../pip/_internal/utils/entrypoints.py | 28 - .../pip/_internal/utils/filesystem.py | 193 - .../pip/_internal/utils/filetypes.py | 28 - .../pip/_internal/utils/glibc.py | 92 - .../pip/_internal/utils/hashes.py | 165 - .../_internal/utils/inject_securetransport.py | 36 - .../pip/_internal/utils/logging.py | 387 - .../site-packages/pip/_internal/utils/misc.py | 821 -- .../pip/_internal/utils/models.py | 47 - .../pip/_internal/utils/packaging.py | 89 - .../pip/_internal/utils/parallel.py | 101 - .../pip/_internal/utils/pkg_resources.py | 40 - .../pip/_internal/utils/setuptools_build.py | 173 - .../pip/_internal/utils/subprocess.py | 281 - .../pip/_internal/utils/temp_dir.py | 260 - .../pip/_internal/utils/unpacking.py | 267 - .../site-packages/pip/_internal/utils/urls.py | 49 - .../pip/_internal/utils/virtualenv.py | 111 - .../pip/_internal/utils/wheel.py | 189 - .../pip/_internal/vcs/__init__.py | 14 - .../vcs/__pycache__/__init__.cpython-39.pyc | Bin 483 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-39.pyc | Bin 2999 -> 0 bytes .../vcs/__pycache__/git.cpython-39.pyc | Bin 9975 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-39.pyc | Bin 4620 -> 0 bytes .../vcs/__pycache__/subversion.cpython-39.pyc | Bin 7954 -> 0 bytes .../__pycache__/versioncontrol.cpython-39.pyc | Bin 19099 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 96 - .../site-packages/pip/_internal/vcs/git.py | 450 - .../pip/_internal/vcs/mercurial.py | 158 - .../pip/_internal/vcs/subversion.py | 329 - .../pip/_internal/vcs/versioncontrol.py | 715 -- .../pip/_internal/wheel_builder.py | 360 - .../Lib/site-packages/pip/_vendor/__init__.py | 113 - .../__pycache__/__init__.cpython-39.pyc | Bin 2945 -> 0 bytes .../__pycache__/appdirs.cpython-39.pyc | Bin 21398 -> 0 bytes .../__pycache__/pyparsing.cpython-39.pyc | Bin 240434 -> 0 bytes .../_vendor/__pycache__/six.cpython-39.pyc | Bin 26944 -> 0 bytes venv/Lib/site-packages/pip/_vendor/appdirs.py | 633 -- .../pip/_vendor/cachecontrol/__init__.py | 11 - .../__pycache__/__init__.cpython-39.pyc | Bin 548 -> 0 bytes .../__pycache__/adapter.cpython-39.pyc | Bin 3074 -> 0 bytes .../__pycache__/cache.cpython-39.pyc | Bin 1821 -> 0 bytes .../__pycache__/compat.cpython-39.pyc | Bin 745 -> 0 bytes .../__pycache__/controller.cpython-39.pyc | Bin 7762 -> 0 bytes .../__pycache__/filewrapper.cpython-39.pyc | Bin 2170 -> 0 bytes .../__pycache__/serialize.cpython-39.pyc | Bin 4221 -> 0 bytes .../__pycache__/wrapper.cpython-39.pyc | Bin 672 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 - .../pip/_vendor/cachecontrol/adapter.py | 133 - .../pip/_vendor/cachecontrol/cache.py | 39 - .../_vendor/cachecontrol/caches/__init__.py | 2 - .../__pycache__/__init__.cpython-39.pyc | Bin 292 -> 0 bytes .../__pycache__/file_cache.cpython-39.pyc | Bin 3308 -> 0 bytes .../__pycache__/redis_cache.cpython-39.pyc | Bin 1564 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 - .../cachecontrol/caches/redis_cache.py | 33 - .../pip/_vendor/cachecontrol/compat.py | 29 - .../pip/_vendor/cachecontrol/controller.py | 376 - .../pip/_vendor/cachecontrol/filewrapper.py | 80 - .../pip/_vendor/cachecontrol/heuristics.py | 135 - .../pip/_vendor/cachecontrol/serialize.py | 188 - .../pip/_vendor/cachecontrol/wrapper.py | 29 - .../pip/_vendor/certifi/__init__.py | 3 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-39.pyc | Bin 274 -> 0 bytes .../certifi/__pycache__/core.cpython-39.pyc | Bin 1542 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4325 --------- .../site-packages/pip/_vendor/certifi/core.py | 76 - .../pip/_vendor/chardet/__init__.py | 83 - .../__pycache__/__init__.cpython-39.pyc | Bin 1898 -> 0 bytes .../__pycache__/big5freq.cpython-39.pyc | Bin 27177 -> 0 bytes .../__pycache__/big5prober.cpython-39.pyc | Bin 1132 -> 0 bytes .../chardistribution.cpython-39.pyc | Bin 6218 -> 0 bytes .../charsetgroupprober.cpython-39.pyc | Bin 2259 -> 0 bytes .../__pycache__/charsetprober.cpython-39.pyc | Bin 3481 -> 0 bytes .../codingstatemachine.cpython-39.pyc | Bin 2908 -> 0 bytes .../__pycache__/cp949prober.cpython-39.pyc | Bin 1139 -> 0 bytes .../chardet/__pycache__/enums.cpython-39.pyc | Bin 2646 -> 0 bytes .../__pycache__/escprober.cpython-39.pyc | Bin 2631 -> 0 bytes .../chardet/__pycache__/escsm.cpython-39.pyc | Bin 7080 -> 0 bytes .../__pycache__/eucjpprober.cpython-39.pyc | Bin 2445 -> 0 bytes .../__pycache__/euckrfreq.cpython-39.pyc | Bin 12061 -> 0 bytes .../__pycache__/euckrprober.cpython-39.pyc | Bin 1140 -> 0 bytes .../__pycache__/euctwfreq.cpython-39.pyc | Bin 27181 -> 0 bytes .../__pycache__/euctwprober.cpython-39.pyc | Bin 1140 -> 0 bytes .../__pycache__/gb2312freq.cpython-39.pyc | Bin 19105 -> 0 bytes .../__pycache__/gb2312prober.cpython-39.pyc | Bin 1148 -> 0 bytes .../__pycache__/hebrewprober.cpython-39.pyc | Bin 3017 -> 0 bytes .../__pycache__/jisfreq.cpython-39.pyc | Bin 22133 -> 0 bytes .../chardet/__pycache__/jpcntx.cpython-39.pyc | Bin 37606 -> 0 bytes .../langbulgarianmodel.cpython-39.pyc | Bin 21808 -> 0 bytes .../__pycache__/langgreekmodel.cpython-39.pyc | Bin 20484 -> 0 bytes .../langhebrewmodel.cpython-39.pyc | Bin 20552 -> 0 bytes .../langrussianmodel.cpython-39.pyc | Bin 26356 -> 0 bytes .../__pycache__/langthaimodel.cpython-39.pyc | Bin 20728 -> 0 bytes .../langturkishmodel.cpython-39.pyc | Bin 20568 -> 0 bytes .../__pycache__/latin1prober.cpython-39.pyc | Bin 2953 -> 0 bytes .../mbcharsetprober.cpython-39.pyc | Bin 2260 -> 0 bytes .../mbcsgroupprober.cpython-39.pyc | Bin 1129 -> 0 bytes .../chardet/__pycache__/mbcssm.cpython-39.pyc | Bin 15716 -> 0 bytes .../sbcharsetprober.cpython-39.pyc | Bin 3113 -> 0 bytes .../sbcsgroupprober.cpython-39.pyc | Bin 1698 -> 0 bytes .../__pycache__/sjisprober.cpython-39.pyc | Bin 2481 -> 0 bytes .../universaldetector.cpython-39.pyc | Bin 5829 -> 0 bytes .../__pycache__/utf8prober.cpython-39.pyc | Bin 1990 -> 0 bytes .../__pycache__/version.cpython-39.pyc | Bin 437 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 233 - .../pip/_vendor/chardet/charsetgroupprober.py | 107 - .../pip/_vendor/chardet/charsetprober.py | 145 - .../pip/_vendor/chardet/cli/__init__.py | 1 - .../pip/_vendor/chardet/cli/chardetect.py | 84 - .../pip/_vendor/chardet/codingstatemachine.py | 88 - .../pip/_vendor/chardet/compat.py | 36 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 76 - .../pip/_vendor/chardet/escprober.py | 101 - .../pip/_vendor/chardet/escsm.py | 246 - .../pip/_vendor/chardet/eucjpprober.py | 92 - .../pip/_vendor/chardet/euckrfreq.py | 195 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 387 - .../pip/_vendor/chardet/euctwprober.py | 46 - .../pip/_vendor/chardet/gb2312freq.py | 283 - .../pip/_vendor/chardet/gb2312prober.py | 46 - .../pip/_vendor/chardet/hebrewprober.py | 292 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/jpcntx.py | 233 - .../pip/_vendor/chardet/langbulgarianmodel.py | 4650 --------- .../pip/_vendor/chardet/langgreekmodel.py | 4398 --------- .../pip/_vendor/chardet/langhebrewmodel.py | 4383 --------- .../pip/_vendor/chardet/langhungarianmodel.py | 4650 --------- .../pip/_vendor/chardet/langrussianmodel.py | 5718 ----------- .../pip/_vendor/chardet/langthaimodel.py | 4383 --------- .../pip/_vendor/chardet/langturkishmodel.py | 4383 --------- .../pip/_vendor/chardet/latin1prober.py | 145 - .../pip/_vendor/chardet/mbcharsetprober.py | 91 - .../pip/_vendor/chardet/mbcsgroupprober.py | 54 - .../pip/_vendor/chardet/mbcssm.py | 572 -- .../pip/_vendor/chardet/metadata/__init__.py | 0 .../pip/_vendor/chardet/metadata/languages.py | 310 - .../pip/_vendor/chardet/sbcharsetprober.py | 145 - .../pip/_vendor/chardet/sbcsgroupprober.py | 83 - .../pip/_vendor/chardet/sjisprober.py | 92 - .../pip/_vendor/chardet/universaldetector.py | 286 - .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 6 - .../__pycache__/__init__.cpython-39.pyc | Bin 442 -> 0 bytes .../colorama/__pycache__/ansi.cpython-39.pyc | Bin 3227 -> 0 bytes .../__pycache__/ansitowin32.cpython-39.pyc | Bin 7693 -> 0 bytes .../__pycache__/initialise.cpython-39.pyc | Bin 1709 -> 0 bytes .../colorama/__pycache__/win32.cpython-39.pyc | Bin 3941 -> 0 bytes .../__pycache__/winterm.cpython-39.pyc | Bin 4663 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 258 - .../pip/_vendor/colorama/initialise.py | 80 - .../pip/_vendor/colorama/win32.py | 152 - .../pip/_vendor/colorama/winterm.py | 169 - .../pip/_vendor/distlib/__init__.py | 23 - .../__pycache__/__init__.cpython-39.pyc | Bin 1055 -> 0 bytes .../distlib/__pycache__/compat.cpython-39.pyc | Bin 32157 -> 0 bytes .../__pycache__/resources.cpython-39.pyc | Bin 11021 -> 0 bytes .../__pycache__/scripts.cpython-39.pyc | Bin 10929 -> 0 bytes .../distlib/__pycache__/util.cpython-39.pyc | Bin 48201 -> 0 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 - .../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 | 1120 --- .../pip/_vendor/distlib/database.py | 1339 --- .../pip/_vendor/distlib/index.py | 516 - .../pip/_vendor/distlib/locators.py | 1302 --- .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/markers.py | 131 - .../pip/_vendor/distlib/metadata.py | 1056 --- .../pip/_vendor/distlib/resources.py | 355 - .../pip/_vendor/distlib/scripts.py | 419 - .../site-packages/pip/_vendor/distlib/t32.exe | Bin 96768 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 105984 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 1761 ---- .../pip/_vendor/distlib/version.py | 736 -- .../site-packages/pip/_vendor/distlib/w32.exe | Bin 90112 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 99840 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 1018 -- venv/Lib/site-packages/pip/_vendor/distro.py | 1230 --- .../pip/_vendor/html5lib/__init__.py | 35 - .../__pycache__/__init__.cpython-39.pyc | Bin 1301 -> 0 bytes .../__pycache__/_ihatexml.cpython-39.pyc | Bin 13770 -> 0 bytes .../__pycache__/_inputstream.cpython-39.pyc | Bin 21629 -> 0 bytes .../__pycache__/_tokenizer.cpython-39.pyc | Bin 39724 -> 0 bytes .../__pycache__/_utils.cpython-39.pyc | Bin 4801 -> 0 bytes .../__pycache__/constants.cpython-39.pyc | Bin 66339 -> 0 bytes .../__pycache__/html5parser.cpython-39.pyc | Bin 91010 -> 0 bytes .../__pycache__/serializer.cpython-39.pyc | Bin 10812 -> 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 - .../_trie/__pycache__/__init__.cpython-39.pyc | Bin 351 -> 0 bytes .../_trie/__pycache__/_base.cpython-39.pyc | Bin 1595 -> 0 bytes .../_trie/__pycache__/py.cpython-39.pyc | Bin 2256 -> 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 ------ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../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 - .../_vendor/html5lib/treeadapters/genshi.py | 54 - .../pip/_vendor/html5lib/treeadapters/sax.py | 50 - .../_vendor/html5lib/treebuilders/__init__.py | 88 - .../__pycache__/__init__.cpython-39.pyc | Bin 3331 -> 0 bytes .../__pycache__/base.cpython-39.pyc | Bin 11315 -> 0 bytes .../__pycache__/etree.cpython-39.pyc | Bin 11820 -> 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-39.pyc | Bin 3997 -> 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 - .../pip/_vendor/idna/__init__.py | 2 - .../idna/__pycache__/__init__.cpython-39.pyc | Bin 256 -> 0 bytes .../idna/__pycache__/core.cpython-39.pyc | Bin 9084 -> 0 bytes .../idna/__pycache__/idnadata.cpython-39.pyc | Bin 22137 -> 0 bytes .../idna/__pycache__/intranges.cpython-39.pyc | Bin 1808 -> 0 bytes .../__pycache__/package_data.cpython-39.pyc | Bin 210 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 110 - .../site-packages/pip/_vendor/idna/compat.py | 12 - .../site-packages/pip/_vendor/idna/core.py | 396 - .../pip/_vendor/idna/idnadata.py | 2050 ---- .../pip/_vendor/idna/intranges.py | 53 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8356 ----------------- .../pip/_vendor/msgpack/__init__.py | 54 - .../__pycache__/__init__.cpython-39.pyc | Bin 1413 -> 0 bytes .../__pycache__/_version.cpython-39.pyc | Bin 217 -> 0 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 1851 -> 0 bytes .../msgpack/__pycache__/ext.cpython-39.pyc | Bin 6279 -> 0 bytes .../__pycache__/fallback.cpython-39.pyc | Bin 26725 -> 0 bytes .../pip/_vendor/msgpack/_version.py | 1 - .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 193 - .../pip/_vendor/msgpack/fallback.py | 1087 --- .../pip/_vendor/packaging/__about__.py | 27 - .../pip/_vendor/packaging/__init__.py | 26 - .../__pycache__/__about__.cpython-39.pyc | Bin 688 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 544 -> 0 bytes .../__pycache__/_structures.cpython-39.pyc | Bin 2896 -> 0 bytes .../__pycache__/markers.cpython-39.pyc | Bin 9270 -> 0 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 4143 -> 0 bytes .../__pycache__/specifiers.cpython-39.pyc | Bin 20925 -> 0 bytes .../packaging/__pycache__/tags.cpython-39.pyc | Bin 18542 -> 0 bytes .../__pycache__/utils.cpython-39.pyc | Bin 3610 -> 0 bytes .../__pycache__/version.cpython-39.pyc | Bin 12674 -> 0 bytes .../pip/_vendor/packaging/_structures.py | 86 - .../pip/_vendor/packaging/markers.py | 336 - .../pip/_vendor/packaging/requirements.py | 160 - .../pip/_vendor/packaging/specifiers.py | 864 -- .../pip/_vendor/packaging/tags.py | 866 -- .../pip/_vendor/packaging/utils.py | 138 - .../pip/_vendor/packaging/version.py | 556 -- .../pip/_vendor/pep517/__init__.py | 6 - .../__pycache__/__init__.cpython-39.pyc | Bin 312 -> 0 bytes .../pep517/__pycache__/compat.cpython-39.pyc | Bin 1114 -> 0 bytes .../__pycache__/wrappers.cpython-39.pyc | Bin 10479 -> 0 bytes .../site-packages/pip/_vendor/pep517/build.py | 127 - .../site-packages/pip/_vendor/pep517/check.py | 206 - .../pip/_vendor/pep517/colorlog.py | 115 - .../pip/_vendor/pep517/compat.py | 34 - .../pip/_vendor/pep517/dirtools.py | 44 - .../pip/_vendor/pep517/envbuild.py | 167 - .../pip/_vendor/pep517/in_process/__init__.py | 17 - .../__pycache__/__init__.cpython-39.pyc | Bin 914 -> 0 bytes .../_vendor/pep517/in_process/_in_process.py | 280 - .../site-packages/pip/_vendor/pep517/meta.py | 92 - .../pip/_vendor/pep517/wrappers.py | 318 - .../pip/_vendor/pkg_resources/__init__.py | 3296 ------- .../__pycache__/__init__.cpython-39.pyc | Bin 100330 -> 0 bytes .../__pycache__/py31compat.cpython-39.pyc | Bin 649 -> 0 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/progress/__init__.py | 177 - .../__pycache__/__init__.cpython-39.pyc | Bin 5656 -> 0 bytes .../progress/__pycache__/bar.cpython-39.pyc | Bin 2638 -> 0 bytes .../__pycache__/spinner.cpython-39.pyc | Bin 1389 -> 0 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 - .../pip/_vendor/progress/counter.py | 41 - .../pip/_vendor/progress/spinner.py | 43 - .../site-packages/pip/_vendor/pyparsing.py | 7107 -------------- .../pip/_vendor/requests/__init__.py | 142 - .../__pycache__/__init__.cpython-39.pyc | Bin 3668 -> 0 bytes .../__pycache__/__version__.cpython-39.pyc | Bin 554 -> 0 bytes .../_internal_utils.cpython-39.pyc | Bin 1301 -> 0 bytes .../__pycache__/adapters.cpython-39.pyc | Bin 16972 -> 0 bytes .../requests/__pycache__/api.cpython-39.pyc | Bin 6758 -> 0 bytes .../requests/__pycache__/auth.cpython-39.pyc | Bin 8330 -> 0 bytes .../requests/__pycache__/certs.cpython-39.pyc | Bin 632 -> 0 bytes .../__pycache__/compat.cpython-39.pyc | Bin 1611 -> 0 bytes .../__pycache__/cookies.cpython-39.pyc | Bin 18821 -> 0 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 5244 -> 0 bytes .../requests/__pycache__/hooks.cpython-39.pyc | Bin 989 -> 0 bytes .../__pycache__/models.cpython-39.pyc | Bin 23938 -> 0 bytes .../__pycache__/packages.cpython-39.pyc | Bin 501 -> 0 bytes .../__pycache__/sessions.cpython-39.pyc | Bin 19843 -> 0 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 4238 -> 0 bytes .../__pycache__/structures.cpython-39.pyc | Bin 4459 -> 0 bytes .../requests/__pycache__/utils.cpython-39.pyc | Bin 22616 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 42 - .../pip/_vendor/requests/adapters.py | 533 -- .../site-packages/pip/_vendor/requests/api.py | 161 - .../pip/_vendor/requests/auth.py | 305 - .../pip/_vendor/requests/certs.py | 18 - .../pip/_vendor/requests/compat.py | 76 - .../pip/_vendor/requests/cookies.py | 549 -- .../pip/_vendor/requests/exceptions.py | 123 - .../pip/_vendor/requests/help.py | 119 - .../pip/_vendor/requests/hooks.py | 34 - .../pip/_vendor/requests/models.py | 956 -- .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 781 -- .../pip/_vendor/requests/status_codes.py | 123 - .../pip/_vendor/requests/structures.py | 105 - .../pip/_vendor/requests/utils.py | 992 -- .../pip/_vendor/resolvelib/__init__.py | 26 - .../__pycache__/__init__.cpython-39.pyc | Bin 605 -> 0 bytes .../__pycache__/providers.cpython-39.pyc | Bin 6525 -> 0 bytes .../__pycache__/reporters.cpython-39.pyc | Bin 2301 -> 0 bytes .../__pycache__/resolvers.cpython-39.pyc | Bin 15196 -> 0 bytes .../__pycache__/structs.cpython-39.pyc | Bin 6919 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 200 -> 0 bytes .../collections_abc.cpython-39.pyc | Bin 374 -> 0 bytes .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 124 - .../pip/_vendor/resolvelib/reporters.py | 37 - .../pip/_vendor/resolvelib/resolvers.py | 474 - .../pip/_vendor/resolvelib/structs.py | 153 - venv/Lib/site-packages/pip/_vendor/six.py | 982 -- .../pip/_vendor/tenacity/__init__.py | 523 -- .../__pycache__/__init__.cpython-39.pyc | Bin 14715 -> 0 bytes .../__pycache__/_asyncio.cpython-39.pyc | Bin 2202 -> 0 bytes .../__pycache__/_utils.cpython-39.pyc | Bin 3950 -> 0 bytes .../tenacity/__pycache__/after.cpython-39.pyc | Bin 977 -> 0 bytes .../__pycache__/before.cpython-39.pyc | Bin 873 -> 0 bytes .../__pycache__/before_sleep.cpython-39.pyc | Bin 1221 -> 0 bytes .../tenacity/__pycache__/nap.cpython-39.pyc | Bin 1026 -> 0 bytes .../tenacity/__pycache__/retry.cpython-39.pyc | Bin 7411 -> 0 bytes .../tenacity/__pycache__/stop.cpython-39.pyc | Bin 3787 -> 0 bytes .../tenacity/__pycache__/wait.cpython-39.pyc | Bin 7344 -> 0 bytes .../pip/_vendor/tenacity/_asyncio.py | 81 - .../pip/_vendor/tenacity/_utils.py | 159 - .../pip/_vendor/tenacity/after.py | 40 - .../pip/_vendor/tenacity/before.py | 35 - .../pip/_vendor/tenacity/before_sleep.py | 51 - .../site-packages/pip/_vendor/tenacity/nap.py | 40 - .../pip/_vendor/tenacity/retry.py | 192 - .../pip/_vendor/tenacity/stop.py | 95 - .../pip/_vendor/tenacity/tornadoweb.py | 49 - .../pip/_vendor/tenacity/wait.py | 183 - .../pip/_vendor/urllib3/__init__.py | 85 - .../__pycache__/__init__.cpython-39.pyc | Bin 2188 -> 0 bytes .../__pycache__/_collections.cpython-39.pyc | Bin 10783 -> 0 bytes .../__pycache__/_version.cpython-39.pyc | Bin 212 -> 0 bytes .../__pycache__/connection.cpython-39.pyc | Bin 13368 -> 0 bytes .../__pycache__/connectionpool.cpython-39.pyc | Bin 24467 -> 0 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 11645 -> 0 bytes .../urllib3/__pycache__/fields.cpython-39.pyc | Bin 8160 -> 0 bytes .../__pycache__/filepost.cpython-39.pyc | Bin 2761 -> 0 bytes .../__pycache__/poolmanager.cpython-39.pyc | Bin 15163 -> 0 bytes .../__pycache__/request.cpython-39.pyc | Bin 5624 -> 0 bytes .../__pycache__/response.cpython-39.pyc | Bin 20835 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 337 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 539 -- .../pip/_vendor/urllib3/connectionpool.py | 1067 --- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 198 -> 0 bytes .../_appengine_environ.cpython-39.pyc | Bin 1418 -> 0 bytes .../contrib/__pycache__/socks.cpython-39.pyc | Bin 5634 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 519 - .../contrib/_securetransport/low_level.py | 396 - .../pip/_vendor/urllib3/contrib/appengine.py | 314 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 121 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 509 - .../urllib3/contrib/securetransport.py | 920 -- .../pip/_vendor/urllib3/contrib/socks.py | 216 - .../pip/_vendor/urllib3/exceptions.py | 323 - .../pip/_vendor/urllib3/fields.py | 274 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 5 - .../__pycache__/__init__.cpython-39.pyc | Bin 312 -> 0 bytes .../packages/__pycache__/six.cpython-39.pyc | Bin 26516 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 - .../pip/_vendor/urllib3/packages/six.py | 1021 -- .../packages/ssl_match_hostname/__init__.py | 22 - .../__pycache__/__init__.cpython-39.pyc | Bin 549 -> 0 bytes .../ssl_match_hostname/_implementation.py | 160 - .../pip/_vendor/urllib3/poolmanager.py | 536 -- .../pip/_vendor/urllib3/request.py | 170 - .../pip/_vendor/urllib3/response.py | 821 -- .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-39.pyc | Bin 1108 -> 0 bytes .../__pycache__/connection.cpython-39.pyc | Bin 3462 -> 0 bytes .../util/__pycache__/proxy.cpython-39.pyc | Bin 1344 -> 0 bytes .../util/__pycache__/queue.cpython-39.pyc | Bin 1063 -> 0 bytes .../util/__pycache__/request.cpython-39.pyc | Bin 3451 -> 0 bytes .../util/__pycache__/response.cpython-39.pyc | Bin 2348 -> 0 bytes .../util/__pycache__/retry.cpython-39.pyc | Bin 15965 -> 0 bytes .../util/__pycache__/ssl_.cpython-39.pyc | Bin 11026 -> 0 bytes .../__pycache__/ssltransport.cpython-39.pyc | Bin 7514 -> 0 bytes .../util/__pycache__/timeout.cpython-39.pyc | Bin 8946 -> 0 bytes .../util/__pycache__/url.cpython-39.pyc | Bin 10622 -> 0 bytes .../util/__pycache__/wait.cpython-39.pyc | Bin 3131 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 150 - .../pip/_vendor/urllib3/util/proxy.py | 56 - .../pip/_vendor/urllib3/util/queue.py | 22 - .../pip/_vendor/urllib3/util/request.py | 143 - .../pip/_vendor/urllib3/util/response.py | 107 - .../pip/_vendor/urllib3/util/retry.py | 602 -- .../pip/_vendor/urllib3/util/ssl_.py | 474 - .../pip/_vendor/urllib3/util/ssltransport.py | 221 - .../pip/_vendor/urllib3/util/timeout.py | 268 - .../pip/_vendor/urllib3/util/url.py | 430 - .../pip/_vendor/urllib3/util/wait.py | 153 - venv/Lib/site-packages/pip/_vendor/vendor.txt | 22 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-39.pyc | Bin 9722 -> 0 bytes .../__pycache__/labels.cpython-39.pyc | Bin 3836 -> 0 bytes .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/tests.py | 153 - .../_vendor/webencodings/x_user_defined.py | 325 - venv/Lib/site-packages/pip/py.typed | 4 - .../site-packages/pkg_resources/__init__.py | 3288 ------- .../__pycache__/__init__.cpython-39.pyc | Bin 100438 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 192 -> 0 bytes .../__pycache__/appdirs.cpython-39.pyc | Bin 20509 -> 0 bytes .../__pycache__/pyparsing.cpython-39.pyc | Bin 201346 -> 0 bytes .../pkg_resources/_vendor/appdirs.py | 608 -- .../_vendor/packaging/__about__.py | 27 - .../_vendor/packaging/__init__.py | 26 - .../__pycache__/__about__.cpython-39.pyc | Bin 708 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 554 -> 0 bytes .../__pycache__/_compat.cpython-39.pyc | Bin 1152 -> 0 bytes .../__pycache__/_structures.cpython-39.pyc | Bin 2906 -> 0 bytes .../__pycache__/_typing.cpython-39.pyc | Bin 1497 -> 0 bytes .../__pycache__/markers.cpython-39.pyc | Bin 9313 -> 0 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 4090 -> 0 bytes .../__pycache__/specifiers.cpython-39.pyc | Bin 20589 -> 0 bytes .../__pycache__/utils.cpython-39.pyc | Bin 1659 -> 0 bytes .../__pycache__/version.cpython-39.pyc | Bin 13326 -> 0 bytes .../_vendor/packaging/_compat.py | 38 - .../_vendor/packaging/_structures.py | 86 - .../_vendor/packaging/_typing.py | 48 - .../_vendor/packaging/markers.py | 328 - .../_vendor/packaging/requirements.py | 145 - .../_vendor/packaging/specifiers.py | 863 -- .../pkg_resources/_vendor/packaging/tags.py | 751 -- .../pkg_resources/_vendor/packaging/utils.py | 65 - .../_vendor/packaging/version.py | 535 -- .../pkg_resources/_vendor/pyparsing.py | 5742 ----------- .../pkg_resources/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-39.pyc | Bin 2881 -> 0 bytes .../data/my-test-package-source/setup.py | 6 - .../pygame-2.0.1.dist-info/INSTALLER | 1 - .../pygame-2.0.1.dist-info/METADATA | 203 - .../pygame-2.0.1.dist-info/RECORD | 563 -- .../pygame-2.0.1.dist-info/REQUESTED | 0 .../pygame-2.0.1.dist-info/WHEEL | 5 - .../pygame-2.0.1.dist-info/entry_points.txt | 3 - .../pygame-2.0.1.dist-info/top_level.txt | 1 - venv/Lib/site-packages/pygame/SDL2.dll | Bin 1561088 -> 0 bytes venv/Lib/site-packages/pygame/SDL2_image.dll | Bin 125440 -> 0 bytes venv/Lib/site-packages/pygame/SDL2_mixer.dll | Bin 123904 -> 0 bytes venv/Lib/site-packages/pygame/SDL2_ttf.dll | Bin 33792 -> 0 bytes venv/Lib/site-packages/pygame/__init__.py | 364 - venv/Lib/site-packages/pygame/__init__.pyi | 71 - .../__pycache__/__init__.cpython-39.pyc | Bin 8027 -> 0 bytes .../_camera_opencv_highgui.cpython-39.pyc | Bin 2669 -> 0 bytes .../_camera_vidcapture.cpython-39.pyc | Bin 4077 -> 0 bytes .../__pycache__/_dummybackend.cpython-39.pyc | Bin 1366 -> 0 bytes .../__pycache__/_numpysndarray.cpython-39.pyc | Bin 2069 -> 0 bytes .../_numpysurfarray.cpython-39.pyc | Bin 12186 -> 0 bytes .../pygame/__pycache__/camera.cpython-39.pyc | Bin 2812 -> 0 bytes .../__pycache__/colordict.cpython-39.pyc | Bin 21388 -> 0 bytes .../pygame/__pycache__/compat.cpython-39.pyc | Bin 2301 -> 0 bytes .../pygame/__pycache__/cursors.cpython-39.pyc | Bin 10930 -> 0 bytes .../pygame/__pycache__/draw_py.cpython-39.pyc | Bin 13154 -> 0 bytes .../__pycache__/freetype.cpython-39.pyc | Bin 2311 -> 0 bytes .../pygame/__pycache__/ftfont.cpython-39.pyc | Bin 6662 -> 0 bytes .../pygame/__pycache__/locals.cpython-39.pyc | Bin 7583 -> 0 bytes .../pygame/__pycache__/macosx.cpython-39.pyc | Bin 919 -> 0 bytes .../pygame/__pycache__/midi.cpython-39.pyc | Bin 23037 -> 0 bytes .../pygame/__pycache__/pkgdata.cpython-39.pyc | Bin 2713 -> 0 bytes .../__pycache__/sndarray.cpython-39.pyc | Bin 3253 -> 0 bytes .../pygame/__pycache__/sprite.cpython-39.pyc | Bin 49978 -> 0 bytes .../__pycache__/surfarray.cpython-39.pyc | Bin 11272 -> 0 bytes .../pygame/__pycache__/sysfont.cpython-39.pyc | Bin 10652 -> 0 bytes .../pygame/__pycache__/version.cpython-39.pyc | Bin 2503 -> 0 bytes .../pygame/__pyinstaller/__init__.py | 5 - .../__pycache__/__init__.cpython-39.pyc | Bin 350 -> 0 bytes .../__pycache__/hook-pygame.cpython-39.pyc | Bin 1142 -> 0 bytes .../pygame/__pyinstaller/hook-pygame.py | 44 - .../pygame/_camera_opencv_highgui.py | 85 - .../pygame/_camera_vidcapture.py | 119 - .../Lib/site-packages/pygame/_dummybackend.py | 30 - .../pygame/_freetype.cp39-win_amd64.pyd | Bin 77824 -> 0 bytes .../site-packages/pygame/_numpysndarray.py | 74 - .../site-packages/pygame/_numpysurfarray.py | 352 - .../site-packages/pygame/_sdl2/__init__.py | 3 - .../site-packages/pygame/_sdl2/__init__.pyi | 1 - .../_sdl2/__pycache__/__init__.cpython-39.pyc | Bin 238 -> 0 bytes .../pygame/_sdl2/audio.cp39-win_amd64.pyd | Bin 148992 -> 0 bytes .../_sdl2/controller.cp39-win_amd64.pyd | Bin 61440 -> 0 bytes .../pygame/_sdl2/mixer.cp39-win_amd64.pyd | Bin 128512 -> 0 bytes .../pygame/_sdl2/sdl2.cp39-win_amd64.pyd | Bin 37888 -> 0 bytes .../pygame/_sdl2/touch.cp39-win_amd64.pyd | Bin 13824 -> 0 bytes venv/Lib/site-packages/pygame/_sdl2/touch.pyi | 6 - .../pygame/_sdl2/video.cp39-win_amd64.pyd | Bin 180224 -> 0 bytes .../pygame/_sprite.cp39-win_amd64.pyd | Bin 272896 -> 0 bytes .../pygame/base.cp39-win_amd64.pyd | Bin 30720 -> 0 bytes .../pygame/bufferproxy.cp39-win_amd64.pyd | Bin 18432 -> 0 bytes venv/Lib/site-packages/pygame/bufferproxy.pyi | 13 - venv/Lib/site-packages/pygame/camera.py | 132 - venv/Lib/site-packages/pygame/camera.pyi | 27 - .../pygame/color.cp39-win_amd64.pyd | Bin 35328 -> 0 bytes venv/Lib/site-packages/pygame/color.pyi | 39 - venv/Lib/site-packages/pygame/colordict.py | 686 -- venv/Lib/site-packages/pygame/compat.py | 102 - .../pygame/constants.cp39-win_amd64.pyd | Bin 49152 -> 0 bytes venv/Lib/site-packages/pygame/constants.pyi | 558 -- venv/Lib/site-packages/pygame/cursors.py | 468 - venv/Lib/site-packages/pygame/cursors.pyi | 77 - .../pygame/display.cp39-win_amd64.pyd | Bin 44032 -> 0 bytes venv/Lib/site-packages/pygame/display.pyi | 88 - .../Lib/site-packages/pygame/docs/__init__.py | 12 - .../Lib/site-packages/pygame/docs/__main__.py | 28 - .../docs/__pycache__/__init__.cpython-39.pyc | Bin 368 -> 0 bytes .../docs/__pycache__/__main__.cpython-39.pyc | Bin 895 -> 0 bytes venv/Lib/site-packages/pygame/docs/logos.html | 44 - .../site-packages/pygame/docs/pygame_logo.gif | Bin 25116 -> 0 bytes .../pygame/docs/pygame_powered.gif | Bin 10171 -> 0 bytes .../pygame/docs/pygame_small.gif | Bin 10286 -> 0 bytes .../site-packages/pygame/docs/pygame_tiny.gif | Bin 5485 -> 0 bytes .../pygame/draw.cp39-win_amd64.pyd | Bin 47616 -> 0 bytes venv/Lib/site-packages/pygame/draw.pyi | 90 - venv/Lib/site-packages/pygame/draw_py.py | 589 -- .../pygame/event.cp39-win_amd64.pyd | Bin 37888 -> 0 bytes venv/Lib/site-packages/pygame/event.pyi | 28 - .../site-packages/pygame/examples/README.rst | 145 - .../site-packages/pygame/examples/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 186 -> 0 bytes .../__pycache__/aacircle.cpython-39.pyc | Bin 1109 -> 0 bytes .../__pycache__/aliens.cpython-39.pyc | Bin 10008 -> 0 bytes .../__pycache__/arraydemo.cpython-39.pyc | Bin 2726 -> 0 bytes .../__pycache__/audiocapture.cpython-39.pyc | Bin 1922 -> 0 bytes .../__pycache__/blend_fill.cpython-39.pyc | Bin 2619 -> 0 bytes .../__pycache__/blit_blends.cpython-39.pyc | Bin 3889 -> 0 bytes .../__pycache__/camera.cpython-39.pyc | Bin 2321 -> 0 bytes .../examples/__pycache__/chimp.cpython-39.pyc | Bin 5927 -> 0 bytes .../__pycache__/cursors.cpython-39.pyc | Bin 2493 -> 0 bytes .../__pycache__/dropevent.cpython-39.pyc | Bin 1627 -> 0 bytes .../__pycache__/eventlist.cpython-39.pyc | Bin 4450 -> 0 bytes .../__pycache__/fastevents.cpython-39.pyc | Bin 2057 -> 0 bytes .../__pycache__/font_viewer.cpython-39.pyc | Bin 7531 -> 0 bytes .../examples/__pycache__/fonty.cpython-39.pyc | Bin 1941 -> 0 bytes .../__pycache__/freetype_misc.cpython-39.pyc | Bin 3297 -> 0 bytes .../__pycache__/glcube.cpython-39.pyc | Bin 12694 -> 0 bytes .../headless_no_windows_needed.cpython-39.pyc | Bin 1432 -> 0 bytes .../__pycache__/liquid.cpython-39.pyc | Bin 1823 -> 0 bytes .../examples/__pycache__/mask.cpython-39.pyc | Bin 5814 -> 0 bytes .../examples/__pycache__/midi.cpython-39.pyc | Bin 19612 -> 0 bytes .../__pycache__/moveit.cpython-39.pyc | Bin 2007 -> 0 bytes .../music_drop_fade.cpython-39.pyc | Bin 6573 -> 0 bytes .../__pycache__/overlay.cpython-39.pyc | Bin 1699 -> 0 bytes .../__pycache__/pixelarray.cpython-39.pyc | Bin 2507 -> 0 bytes .../__pycache__/playmus.cpython-39.pyc | Bin 3966 -> 0 bytes .../prevent_display_stretching.cpython-39.pyc | Bin 2062 -> 0 bytes .../__pycache__/resizing_new.cpython-39.pyc | Bin 1021 -> 0 bytes .../__pycache__/scaletest.cpython-39.pyc | Bin 3287 -> 0 bytes .../scrap_clipboard.cpython-39.pyc | Bin 2633 -> 0 bytes .../__pycache__/scroll.cpython-39.pyc | Bin 4517 -> 0 bytes .../__pycache__/setmodescale.cpython-39.pyc | Bin 1811 -> 0 bytes .../examples/__pycache__/sound.cpython-39.pyc | Bin 1242 -> 0 bytes .../sound_array_demos.cpython-39.pyc | Bin 3760 -> 0 bytes .../__pycache__/sprite_texture.cpython-39.pyc | Bin 2663 -> 0 bytes .../examples/__pycache__/stars.cpython-39.pyc | Bin 2729 -> 0 bytes .../__pycache__/testsprite.cpython-39.pyc | Bin 4940 -> 0 bytes .../__pycache__/textinput.cpython-39.pyc | Bin 3117 -> 0 bytes .../__pycache__/vgrade.cpython-39.pyc | Bin 3277 -> 0 bytes .../examples/__pycache__/video.cpython-39.pyc | Bin 3379 -> 0 bytes .../site-packages/pygame/examples/aacircle.py | 41 - .../site-packages/pygame/examples/aliens.py | 410 - .../pygame/examples/arraydemo.py | 129 - .../pygame/examples/audiocapture.py | 80 - .../pygame/examples/blend_fill.py | 115 - .../pygame/examples/blit_blends.py | 198 - .../site-packages/pygame/examples/camera.py | 105 - .../site-packages/pygame/examples/chimp.py | 203 - .../site-packages/pygame/examples/cursors.py | 105 - .../pygame/examples/data/BGR.png | Bin 244 -> 0 bytes .../pygame/examples/data/alien1.gif | Bin 3826 -> 0 bytes .../pygame/examples/data/alien1.jpg | Bin 3103 -> 0 bytes .../pygame/examples/data/alien1.png | Bin 3522 -> 0 bytes .../pygame/examples/data/alien2.gif | Bin 3834 -> 0 bytes .../pygame/examples/data/alien2.png | Bin 3526 -> 0 bytes .../pygame/examples/data/alien3.gif | Bin 3829 -> 0 bytes .../pygame/examples/data/alien3.png | Bin 3518 -> 0 bytes .../pygame/examples/data/arraydemo.bmp | Bin 76854 -> 0 bytes .../pygame/examples/data/asprite.bmp | Bin 578 -> 0 bytes .../pygame/examples/data/background.gif | Bin 9133 -> 0 bytes .../pygame/examples/data/black.ppm | 3076 ------ .../pygame/examples/data/blue.gif | Bin 84 -> 0 bytes .../pygame/examples/data/blue.mpg | Bin 6144 -> 0 bytes .../pygame/examples/data/bomb.gif | Bin 1162 -> 0 bytes .../pygame/examples/data/boom.wav | Bin 12562 -> 0 bytes .../pygame/examples/data/brick.png | Bin 170 -> 0 bytes .../pygame/examples/data/car_door.wav | Bin 3910 -> 0 bytes .../pygame/examples/data/chimp.bmp | Bin 5498 -> 0 bytes .../pygame/examples/data/city.png | Bin 143 -> 0 bytes .../pygame/examples/data/danger.gif | Bin 2761 -> 0 bytes .../pygame/examples/data/explosion1.gif | Bin 6513 -> 0 bytes .../pygame/examples/data/fist.bmp | Bin 4378 -> 0 bytes .../pygame/examples/data/green.pcx | Bin 320 -> 0 bytes .../pygame/examples/data/grey.pgm | 1028 -- .../pygame/examples/data/house_lo.mp3 | Bin 116320 -> 0 bytes .../pygame/examples/data/house_lo.ogg | Bin 31334 -> 0 bytes .../pygame/examples/data/house_lo.wav | Bin 78464 -> 0 bytes .../pygame/examples/data/laplacian.png | Bin 253 -> 0 bytes .../pygame/examples/data/liquid.bmp | Bin 11734 -> 0 bytes .../pygame/examples/data/midikeys.png | Bin 19666 -> 0 bytes .../pygame/examples/data/oldplayer.gif | Bin 1075 -> 0 bytes .../pygame/examples/data/player1.gif | Bin 3470 -> 0 bytes .../pygame/examples/data/punch.wav | Bin 4176 -> 0 bytes .../pygame/examples/data/purple.xpm | 36 - .../pygame/examples/data/red.jpg | Bin 1251 -> 0 bytes .../pygame/examples/data/sans.ttf | Bin 133088 -> 0 bytes .../pygame/examples/data/secosmic_lo.wav | Bin 18700 -> 0 bytes .../pygame/examples/data/shot.gif | Bin 129 -> 0 bytes .../pygame/examples/data/static.png | Bin 1202 -> 0 bytes .../pygame/examples/data/turquoise.tif | Bin 200870 -> 0 bytes .../pygame/examples/data/whiff.wav | Bin 5850 -> 0 bytes .../pygame/examples/data/yellow.tga | Bin 3116 -> 0 bytes .../pygame/examples/data/yuv_1.pgm | 6 - .../pygame/examples/dropevent.py | 76 - .../pygame/examples/eventlist.py | 182 - .../pygame/examples/fastevents.py | 101 - .../pygame/examples/font_viewer.py | 269 - .../site-packages/pygame/examples/fonty.py | 97 - .../pygame/examples/freetype_misc.py | 177 - .../site-packages/pygame/examples/glcube.py | 589 -- .../examples/headless_no_windows_needed.py | 50 - .../site-packages/pygame/examples/liquid.py | 88 - .../Lib/site-packages/pygame/examples/mask.py | 211 - .../Lib/site-packages/pygame/examples/midi.py | 877 -- .../site-packages/pygame/examples/moveit.py | 71 - .../pygame/examples/music_drop_fade.py | 249 - .../site-packages/pygame/examples/overlay.py | 68 - .../pygame/examples/pixelarray.py | 140 - .../site-packages/pygame/examples/playmus.py | 152 - .../examples/prevent_display_stretching.py | 88 - .../pygame/examples/resizing_new.py | 43 - .../pygame/examples/scaletest.py | 157 - .../pygame/examples/scrap_clipboard.py | 94 - .../site-packages/pygame/examples/scroll.py | 191 - .../pygame/examples/setmodescale.py | 60 - .../site-packages/pygame/examples/sound.py | 44 - .../pygame/examples/sound_array_demos.py | 217 - .../pygame/examples/sprite_texture.py | 102 - .../site-packages/pygame/examples/stars.py | 102 - .../pygame/examples/testsprite.py | 262 - .../pygame/examples/textinput.py | 177 - .../site-packages/pygame/examples/vgrade.py | 100 - .../site-packages/pygame/examples/video.py | 160 - .../pygame/fastevent.cp39-win_amd64.pyd | Bin 16384 -> 0 bytes venv/Lib/site-packages/pygame/fastevent.pyi | 10 - .../pygame/font.cp39-win_amd64.pyd | Bin 24576 -> 0 bytes venv/Lib/site-packages/pygame/font.pyi | 58 - .../Lib/site-packages/pygame/freesansbold.ttf | Bin 98600 -> 0 bytes venv/Lib/site-packages/pygame/freetype.py | 78 - venv/Lib/site-packages/pygame/freetype.pyi | 127 - venv/Lib/site-packages/pygame/ftfont.py | 190 - .../pygame/gfxdraw.cp39-win_amd64.pyd | Bin 57856 -> 0 bytes venv/Lib/site-packages/pygame/gfxdraw.pyi | 108 - .../pygame/image.cp39-win_amd64.pyd | Bin 28672 -> 0 bytes venv/Lib/site-packages/pygame/image.pyi | 32 - .../pygame/imageext.cp39-win_amd64.pyd | Bin 20992 -> 0 bytes .../pygame/joystick.cp39-win_amd64.pyd | Bin 20480 -> 0 bytes venv/Lib/site-packages/pygame/joystick.pyi | 25 - .../pygame/key.cp39-win_amd64.pyd | Bin 26624 -> 0 bytes venv/Lib/site-packages/pygame/key.pyi | 28 - venv/Lib/site-packages/pygame/libFLAC-8.dll | Bin 441344 -> 0 bytes .../site-packages/pygame/libfreetype-6.dll | Bin 586240 -> 0 bytes venv/Lib/site-packages/pygame/libjpeg-9.dll | Bin 244224 -> 0 bytes .../Lib/site-packages/pygame/libmodplug-1.dll | Bin 252928 -> 0 bytes venv/Lib/site-packages/pygame/libmpg123-0.dll | Bin 337408 -> 0 bytes venv/Lib/site-packages/pygame/libogg-0.dll | Bin 52224 -> 0 bytes venv/Lib/site-packages/pygame/libopus-0.dll | Bin 124928 -> 0 bytes .../site-packages/pygame/libopusfile-0.dll | Bin 46592 -> 0 bytes venv/Lib/site-packages/pygame/libpng16-16.dll | Bin 210944 -> 0 bytes venv/Lib/site-packages/pygame/libtiff-5.dll | Bin 432640 -> 0 bytes venv/Lib/site-packages/pygame/libvorbis-0.dll | Bin 251904 -> 0 bytes .../site-packages/pygame/libvorbisfile-3.dll | Bin 69632 -> 0 bytes venv/Lib/site-packages/pygame/libwebp-7.dll | Bin 447488 -> 0 bytes venv/Lib/site-packages/pygame/locals.py | 574 -- venv/Lib/site-packages/pygame/macosx.py | 22 - .../pygame/mask.cp39-win_amd64.pyd | Bin 55296 -> 0 bytes venv/Lib/site-packages/pygame/mask.pyi | 82 - .../pygame/math.cp39-win_amd64.pyd | Bin 64000 -> 0 bytes venv/Lib/site-packages/pygame/math.pyi | 262 - venv/Lib/site-packages/pygame/midi.py | 722 -- venv/Lib/site-packages/pygame/midi.pyi | 60 - .../pygame/mixer.cp39-win_amd64.pyd | Bin 37888 -> 0 bytes venv/Lib/site-packages/pygame/mixer.pyi | 84 - .../pygame/mixer_music.cp39-win_amd64.pyd | Bin 19456 -> 0 bytes .../pygame/mouse.cp39-win_amd64.pyd | Bin 19456 -> 0 bytes venv/Lib/site-packages/pygame/mouse.pyi | 35 - venv/Lib/site-packages/pygame/music.pyi | 20 - .../pygame/newbuffer.cp39-win_amd64.pyd | Bin 22016 -> 0 bytes .../pygame/pixelarray.cp39-win_amd64.pyd | Bin 44544 -> 0 bytes venv/Lib/site-packages/pygame/pixelarray.pyi | 38 - .../pygame/pixelcopy.cp39-win_amd64.pyd | Bin 26112 -> 0 bytes venv/Lib/site-packages/pygame/pixelcopy.pyi | 24 - venv/Lib/site-packages/pygame/pkgdata.py | 84 - venv/Lib/site-packages/pygame/portmidi.dll | Bin 41984 -> 0 bytes venv/Lib/site-packages/pygame/py.typed | 0 venv/Lib/site-packages/pygame/pygame.ico | Bin 145516 -> 0 bytes venv/Lib/site-packages/pygame/pygame_icon.bmp | Bin 630 -> 0 bytes .../Lib/site-packages/pygame/pygame_icon.icns | Bin 53627 -> 0 bytes venv/Lib/site-packages/pygame/pygame_icon.svg | 259 - .../Lib/site-packages/pygame/pygame_icon.tiff | Bin 61604 -> 0 bytes .../pygame/pypm.cp39-win_amd64.pyd | Bin 71680 -> 0 bytes .../pygame/rect.cp39-win_amd64.pyd | Bin 36352 -> 0 bytes venv/Lib/site-packages/pygame/rect.pyi | 230 - .../pygame/rwobject.cp39-win_amd64.pyd | Bin 18944 -> 0 bytes .../pygame/scrap.cp39-win_amd64.pyd | Bin 14848 -> 0 bytes venv/Lib/site-packages/pygame/scrap.pyi | 10 - venv/Lib/site-packages/pygame/sndarray.py | 120 - venv/Lib/site-packages/pygame/sndarray.pyi | 10 - venv/Lib/site-packages/pygame/sprite.py | 1745 ---- venv/Lib/site-packages/pygame/sprite.pyi | 154 - .../pygame/surface.cp39-win_amd64.pyd | Bin 220672 -> 0 bytes venv/Lib/site-packages/pygame/surface.pyi | 130 - venv/Lib/site-packages/pygame/surfarray.py | 371 - venv/Lib/site-packages/pygame/surfarray.pyi | 20 - .../pygame/surflock.cp39-win_amd64.pyd | Bin 13824 -> 0 bytes venv/Lib/site-packages/pygame/sysfont.py | 470 - .../site-packages/pygame/tests/__init__.py | 40 - .../site-packages/pygame/tests/__main__.py | 144 - .../tests/__pycache__/__init__.cpython-39.pyc | Bin 1361 -> 0 bytes .../tests/__pycache__/__main__.cpython-39.pyc | Bin 2819 -> 0 bytes .../__pycache__/base_test.cpython-39.pyc | Bin 17041 -> 0 bytes .../__pycache__/blit_test.cpython-39.pyc | Bin 4083 -> 0 bytes .../bufferproxy_test.cpython-39.pyc | Bin 12886 -> 0 bytes .../__pycache__/camera_test.cpython-39.pyc | Bin 460 -> 0 bytes .../__pycache__/cdrom_tags.cpython-39.pyc | Bin 226 -> 0 bytes .../__pycache__/cdrom_test.cpython-39.pyc | Bin 6896 -> 0 bytes .../__pycache__/color_test.cpython-39.pyc | Bin 40502 -> 0 bytes .../__pycache__/compat_test.cpython-39.pyc | Bin 4260 -> 0 bytes .../__pycache__/constants_test.cpython-39.pyc | Bin 8071 -> 0 bytes .../__pycache__/cursors_test.cpython-39.pyc | Bin 3583 -> 0 bytes .../__pycache__/display_test.cpython-39.pyc | Bin 18428 -> 0 bytes .../__pycache__/draw_test.cpython-39.pyc | Bin 141520 -> 0 bytes .../__pycache__/event_test.cpython-39.pyc | Bin 22891 -> 0 bytes .../__pycache__/fastevent_tags.cpython-39.pyc | Bin 200 -> 0 bytes .../__pycache__/fastevent_test.cpython-39.pyc | Bin 3472 -> 0 bytes .../__pycache__/font_tags.cpython-39.pyc | Bin 195 -> 0 bytes .../__pycache__/font_test.cpython-39.pyc | Bin 18640 -> 0 bytes .../__pycache__/freetype_tags.cpython-39.pyc | Bin 375 -> 0 bytes .../__pycache__/freetype_test.cpython-39.pyc | Bin 39083 -> 0 bytes .../__pycache__/ftfont_tags.cpython-39.pyc | Bin 371 -> 0 bytes .../__pycache__/ftfont_test.cpython-39.pyc | Bin 581 -> 0 bytes .../__pycache__/gfxdraw_test.cpython-39.pyc | Bin 21748 -> 0 bytes ...image__save_gl_surface_test.cpython-39.pyc | Bin 1350 -> 0 bytes .../__pycache__/image_tags.cpython-39.pyc | Bin 318 -> 0 bytes .../__pycache__/image_test.cpython-39.pyc | Bin 24907 -> 0 bytes .../__pycache__/imageext_tags.cpython-39.pyc | Bin 324 -> 0 bytes .../__pycache__/imageext_test.cpython-39.pyc | Bin 4311 -> 0 bytes .../__pycache__/joystick_test.cpython-39.pyc | Bin 3764 -> 0 bytes .../tests/__pycache__/key_test.cpython-39.pyc | Bin 3644 -> 0 bytes .../__pycache__/mask_test.cpython-39.pyc | Bin 163079 -> 0 bytes .../__pycache__/math_test.cpython-39.pyc | Bin 67188 -> 0 bytes .../__pycache__/midi_test.cpython-39.pyc | Bin 15160 -> 0 bytes .../mixer_music_tags.cpython-39.pyc | Bin 330 -> 0 bytes .../mixer_music_test.cpython-39.pyc | Bin 9460 -> 0 bytes .../__pycache__/mixer_tags.cpython-39.pyc | Bin 318 -> 0 bytes .../__pycache__/mixer_test.cpython-39.pyc | Bin 29877 -> 0 bytes .../__pycache__/mouse_test.cpython-39.pyc | Bin 9495 -> 0 bytes .../__pycache__/overlay_tags.cpython-39.pyc | Bin 213 -> 0 bytes .../__pycache__/overlay_test.cpython-39.pyc | Bin 902 -> 0 bytes .../pixelarray_test.cpython-39.pyc | Bin 38746 -> 0 bytes .../__pycache__/pixelcopy_test.cpython-39.pyc | Bin 18175 -> 0 bytes .../__pycache__/rect_test.cpython-39.pyc | Bin 66412 -> 0 bytes .../__pycache__/rwobject_test.cpython-39.pyc | Bin 5599 -> 0 bytes .../__pycache__/scrap_tags.cpython-39.pyc | Bin 479 -> 0 bytes .../__pycache__/scrap_test.cpython-39.pyc | Bin 9727 -> 0 bytes .../__pycache__/sndarray_tags.cpython-39.pyc | Bin 381 -> 0 bytes .../__pycache__/sndarray_test.cpython-39.pyc | Bin 5735 -> 0 bytes .../__pycache__/sprite_test.cpython-39.pyc | Bin 36477 -> 0 bytes .../__pycache__/surface_test.cpython-39.pyc | Bin 103442 -> 0 bytes .../__pycache__/surfarray_tags.cpython-39.pyc | Bin 420 -> 0 bytes .../__pycache__/surfarray_test.cpython-39.pyc | Bin 17871 -> 0 bytes .../__pycache__/surflock_test.cpython-39.pyc | Bin 2841 -> 0 bytes .../__pycache__/sysfont_test.cpython-39.pyc | Bin 2031 -> 0 bytes .../__pycache__/test_test_.cpython-39.pyc | Bin 189 -> 0 bytes .../__pycache__/threads_test.cpython-39.pyc | Bin 7043 -> 0 bytes .../__pycache__/time_test.cpython-39.pyc | Bin 7492 -> 0 bytes .../__pycache__/touch_tags.cpython-39.pyc | Bin 211 -> 0 bytes .../__pycache__/touch_test.cpython-39.pyc | Bin 3457 -> 0 bytes .../__pycache__/transform_test.cpython-39.pyc | Bin 26558 -> 0 bytes .../__pycache__/version_test.cpython-39.pyc | Bin 1631 -> 0 bytes .../__pycache__/video_test.cpython-39.pyc | Bin 1039 -> 0 bytes .../site-packages/pygame/tests/base_test.py | 666 -- .../site-packages/pygame/tests/blit_test.py | 157 - .../pygame/tests/bufferproxy_test.py | 509 - .../site-packages/pygame/tests/camera_test.py | 9 - .../site-packages/pygame/tests/cdrom_tags.py | 1 - .../site-packages/pygame/tests/cdrom_test.py | 321 - .../site-packages/pygame/tests/color_test.py | 1290 --- .../site-packages/pygame/tests/compat_test.py | 89 - .../pygame/tests/constants_test.py | 458 - .../pygame/tests/cursors_test.py | 154 - .../pygame/tests/display_test.py | 716 -- .../site-packages/pygame/tests/draw_test.py | 6468 ------------- .../site-packages/pygame/tests/event_test.py | 801 -- .../pygame/tests/fastevent_tags.py | 1 - .../pygame/tests/fastevent_test.py | 158 - .../tests/fixtures/fonts/A_PyGameMono-8.png | Bin 92 -> 0 bytes .../fixtures/fonts/PyGameMono-18-100dpi.bdf | 165 - .../fixtures/fonts/PyGameMono-18-75dpi.bdf | 143 - .../tests/fixtures/fonts/PyGameMono-8.bdf | 103 - .../tests/fixtures/fonts/PyGameMono.otf | Bin 3128 -> 0 bytes .../tests/fixtures/fonts/test_fixed.otf | Bin 58464 -> 0 bytes .../pygame/tests/fixtures/fonts/test_sans.ttf | Bin 133088 -> 0 bytes .../fixtures/fonts/u13079_PyGameMono-8.png | Bin 89 -> 0 bytes .../fixtures/xbm_cursors/white_sizing.xbm | 8 - .../xbm_cursors/white_sizing_mask.xbm | 8 - .../site-packages/pygame/tests/font_tags.py | 1 - .../site-packages/pygame/tests/font_test.py | 640 -- .../pygame/tests/freetype_tags.py | 11 - .../pygame/tests/freetype_test.py | 1821 ---- .../site-packages/pygame/tests/ftfont_tags.py | 11 - .../site-packages/pygame/tests/ftfont_test.py | 19 - .../pygame/tests/gfxdraw_test.py | 877 -- .../tests/image__save_gl_surface_test.py | 46 - .../site-packages/pygame/tests/image_tags.py | 7 - .../site-packages/pygame/tests/image_test.py | 924 -- .../pygame/tests/imageext_tags.py | 7 - .../pygame/tests/imageext_test.py | 102 - .../pygame/tests/joystick_test.py | 161 - .../site-packages/pygame/tests/key_test.py | 112 - .../site-packages/pygame/tests/mask_test.py | 6446 ------------- .../site-packages/pygame/tests/math_test.py | 2145 ----- .../site-packages/pygame/tests/midi_test.py | 475 - .../pygame/tests/mixer_music_tags.py | 7 - .../pygame/tests/mixer_music_test.py | 367 - .../site-packages/pygame/tests/mixer_tags.py | 7 - .../site-packages/pygame/tests/mixer_test.py | 1178 --- .../site-packages/pygame/tests/mouse_test.py | 349 - .../pygame/tests/overlay_tags.py | 2 - .../pygame/tests/overlay_test.py | 37 - .../pygame/tests/pixelarray_test.py | 1640 ---- .../pygame/tests/pixelcopy_test.py | 713 -- .../site-packages/pygame/tests/rect_test.py | 2179 ----- .../pygame/tests/run_tests__tests/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 200 -> 0 bytes .../run_tests__test.cpython-39.pyc | Bin 3380 -> 0 bytes .../tests/run_tests__tests/all_ok/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 207 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1640 -> 0 bytes .../__pycache__/fake_3_test.cpython-39.pyc | Bin 1640 -> 0 bytes .../__pycache__/fake_4_test.cpython-39.pyc | Bin 1640 -> 0 bytes .../__pycache__/fake_5_test.cpython-39.pyc | Bin 1640 -> 0 bytes .../__pycache__/fake_6_test.cpython-39.pyc | Bin 1640 -> 0 bytes ...rtions__ret_code_of_1__test.cpython-39.pyc | Bin 1593 -> 0 bytes .../zero_tests_test.cpython-39.pyc | Bin 763 -> 0 bytes .../run_tests__tests/all_ok/fake_2_test.py | 39 - .../run_tests__tests/all_ok/fake_3_test.py | 39 - .../run_tests__tests/all_ok/fake_4_test.py | 39 - .../run_tests__tests/all_ok/fake_5_test.py | 39 - .../run_tests__tests/all_ok/fake_6_test.py | 39 - .../no_assertions__ret_code_of_1__test.py | 39 - .../all_ok/zero_tests_test.py | 23 - .../run_tests__tests/everything/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 211 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1644 -> 0 bytes .../incomplete_todo_test.cpython-39.pyc | Bin 1673 -> 0 bytes .../__pycache__/magic_tag_test.cpython-39.pyc | Bin 1524 -> 0 bytes .../__pycache__/sleep_test.cpython-39.pyc | Bin 1016 -> 0 bytes .../everything/fake_2_test.py | 39 - .../everything/incomplete_todo_test.py | 39 - .../everything/magic_tag_test.py | 38 - .../run_tests__tests/everything/sleep_test.py | 29 - .../run_tests__tests/exclude/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 208 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1641 -> 0 bytes .../invisible_tag_test.cpython-39.pyc | Bin 1677 -> 0 bytes .../__pycache__/magic_tag_test.cpython-39.pyc | Bin 1521 -> 0 bytes .../run_tests__tests/exclude/fake_2_test.py | 39 - .../exclude/invisible_tag_test.py | 41 - .../exclude/magic_tag_test.py | 38 - .../run_tests__tests/failures1/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 210 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1643 -> 0 bytes .../__pycache__/fake_3_test.cpython-39.pyc | Bin 1643 -> 0 bytes .../__pycache__/fake_4_test.cpython-39.pyc | Bin 1657 -> 0 bytes .../run_tests__tests/failures1/fake_2_test.py | 39 - .../run_tests__tests/failures1/fake_3_test.py | 39 - .../run_tests__tests/failures1/fake_4_test.py | 41 - .../run_tests__tests/incomplete/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 211 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1661 -> 0 bytes .../__pycache__/fake_3_test.cpython-39.pyc | Bin 1644 -> 0 bytes .../incomplete/fake_2_test.py | 39 - .../incomplete/fake_3_test.py | 39 - .../incomplete_todo/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 216 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1669 -> 0 bytes .../__pycache__/fake_3_test.cpython-39.pyc | Bin 1649 -> 0 bytes .../incomplete_todo/fake_2_test.py | 39 - .../incomplete_todo/fake_3_test.py | 39 - .../infinite_loop/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 214 -> 0 bytes .../__pycache__/fake_1_test.cpython-39.pyc | Bin 1637 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1647 -> 0 bytes .../infinite_loop/fake_1_test.py | 40 - .../infinite_loop/fake_2_test.py | 39 - .../run_tests__tests/print_stderr/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 213 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1646 -> 0 bytes .../__pycache__/fake_3_test.cpython-39.pyc | Bin 1710 -> 0 bytes .../__pycache__/fake_4_test.cpython-39.pyc | Bin 1660 -> 0 bytes .../print_stderr/fake_2_test.py | 39 - .../print_stderr/fake_3_test.py | 41 - .../print_stderr/fake_4_test.py | 41 - .../run_tests__tests/print_stdout/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 213 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1646 -> 0 bytes .../__pycache__/fake_3_test.cpython-39.pyc | Bin 1753 -> 0 bytes .../__pycache__/fake_4_test.cpython-39.pyc | Bin 1660 -> 0 bytes .../print_stdout/fake_2_test.py | 39 - .../print_stdout/fake_3_test.py | 42 - .../print_stdout/fake_4_test.py | 41 - .../tests/run_tests__tests/run_tests__test.py | 145 - .../run_tests__tests/timeout/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 208 -> 0 bytes .../__pycache__/fake_2_test.cpython-39.pyc | Bin 1641 -> 0 bytes .../__pycache__/sleep_test.cpython-39.pyc | Bin 1013 -> 0 bytes .../run_tests__tests/timeout/fake_2_test.py | 39 - .../run_tests__tests/timeout/sleep_test.py | 30 - .../pygame/tests/rwobject_test.py | 158 - .../site-packages/pygame/tests/scrap_tags.py | 21 - .../site-packages/pygame/tests/scrap_test.py | 302 - .../pygame/tests/sndarray_tags.py | 12 - .../pygame/tests/sndarray_test.py | 165 - .../site-packages/pygame/tests/sprite_test.py | 1406 --- .../pygame/tests/surface_test.py | 4168 -------- .../pygame/tests/surfarray_tags.py | 16 - .../pygame/tests/surfarray_test.py | 733 -- .../pygame/tests/surflock_test.py | 144 - .../pygame/tests/sysfont_test.py | 48 - .../site-packages/pygame/tests/test_test_.py | 2 - .../pygame/tests/test_utils/__init__.py | 260 - .../__pycache__/__init__.cpython-39.pyc | Bin 7150 -> 0 bytes .../__pycache__/arrinter.cpython-39.pyc | Bin 13261 -> 0 bytes .../__pycache__/async_sub.cpython-39.pyc | Bin 7378 -> 0 bytes .../__pycache__/buftools.cpython-39.pyc | Bin 17202 -> 0 bytes .../__pycache__/endian.cpython-39.pyc | Bin 670 -> 0 bytes .../test_utils/__pycache__/png.cpython-39.pyc | Bin 122994 -> 0 bytes .../__pycache__/run_tests.cpython-39.pyc | Bin 8954 -> 0 bytes .../__pycache__/test_machinery.cpython-39.pyc | Bin 2822 -> 0 bytes .../__pycache__/test_runner.cpython-39.pyc | Bin 6968 -> 0 bytes .../pygame/tests/test_utils/arrinter.py | 451 - .../pygame/tests/test_utils/async_sub.py | 313 - .../pygame/tests/test_utils/buftools.py | 613 -- .../pygame/tests/test_utils/endian.py | 20 - .../pygame/tests/test_utils/png.py | 4005 -------- .../pygame/tests/test_utils/run_tests.py | 355 - .../pygame/tests/test_utils/test_machinery.py | 89 - .../pygame/tests/test_utils/test_runner.py | 333 - .../pygame/tests/threads_test.py | 244 - .../site-packages/pygame/tests/time_test.py | 343 - .../site-packages/pygame/tests/touch_tags.py | 1 - .../site-packages/pygame/tests/touch_test.py | 99 - .../pygame/tests/transform_test.py | 1300 --- .../pygame/tests/version_test.py | 47 - .../site-packages/pygame/tests/video_test.py | 25 - .../site-packages/pygame/threads/__init__.py | 285 - .../__pycache__/__init__.cpython-39.pyc | Bin 6661 -> 0 bytes .../pygame/time.cp39-win_amd64.pyd | Bin 18944 -> 0 bytes venv/Lib/site-packages/pygame/time.pyi | 16 - .../pygame/transform.cp39-win_amd64.pyd | Bin 52224 -> 0 bytes venv/Lib/site-packages/pygame/transform.pyi | 50 - venv/Lib/site-packages/pygame/version.py | 64 - venv/Lib/site-packages/pygame/version.pyi | 15 - venv/Lib/site-packages/pygame/zlib1.dll | Bin 108544 -> 0 bytes venv/Lib/site-packages/setuptools/__init__.py | 241 - .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_distutils/__init__.py | 15 - .../setuptools/_distutils/_msvccompiler.py | 561 -- .../setuptools/_distutils/archive_util.py | 256 - .../setuptools/_distutils/bcppcompiler.py | 393 - .../setuptools/_distutils/ccompiler.py | 1123 --- .../setuptools/_distutils/cmd.py | 403 - .../setuptools/_distutils/command/__init__.py | 31 - .../setuptools/_distutils/command/bdist.py | 143 - .../_distutils/command/bdist_dumb.py | 123 - .../_distutils/command/bdist_msi.py | 749 -- .../_distutils/command/bdist_rpm.py | 579 -- .../_distutils/command/bdist_wininst.py | 377 - .../setuptools/_distutils/command/build.py | 157 - .../_distutils/command/build_clib.py | 209 - .../_distutils/command/build_ext.py | 755 -- .../setuptools/_distutils/command/build_py.py | 416 - .../_distutils/command/build_scripts.py | 160 - .../setuptools/_distutils/command/check.py | 148 - .../setuptools/_distutils/command/clean.py | 76 - .../setuptools/_distutils/command/config.py | 344 - .../setuptools/_distutils/command/install.py | 677 -- .../_distutils/command/install_data.py | 79 - .../_distutils/command/install_egg_info.py | 77 - .../_distutils/command/install_headers.py | 47 - .../_distutils/command/install_lib.py | 217 - .../_distutils/command/install_scripts.py | 60 - .../_distutils/command/py37compat.py | 30 - .../setuptools/_distutils/command/register.py | 304 - .../setuptools/_distutils/command/sdist.py | 494 - .../setuptools/_distutils/command/upload.py | 214 - .../setuptools/_distutils/config.py | 130 - .../setuptools/_distutils/core.py | 234 - .../setuptools/_distutils/cygwinccompiler.py | 403 - .../setuptools/_distutils/debug.py | 5 - .../setuptools/_distutils/dep_util.py | 92 - .../setuptools/_distutils/dir_util.py | 210 - .../setuptools/_distutils/dist.py | 1257 --- .../setuptools/_distutils/errors.py | 97 - .../setuptools/_distutils/extension.py | 240 - .../setuptools/_distutils/fancy_getopt.py | 457 - .../setuptools/_distutils/file_util.py | 238 - .../setuptools/_distutils/filelist.py | 327 - .../setuptools/_distutils/log.py | 77 - .../setuptools/_distutils/msvc9compiler.py | 788 -- .../setuptools/_distutils/msvccompiler.py | 643 -- .../setuptools/_distutils/py35compat.py | 19 - .../setuptools/_distutils/py38compat.py | 7 - .../setuptools/_distutils/spawn.py | 129 - .../setuptools/_distutils/sysconfig.py | 573 -- .../setuptools/_distutils/text_file.py | 286 - .../setuptools/_distutils/unixccompiler.py | 328 - .../setuptools/_distutils/util.py | 561 -- .../setuptools/_distutils/version.py | 347 - .../setuptools/_distutils/versionpredicate.py | 166 - venv/Lib/site-packages/setuptools/_imp.py | 82 - .../setuptools/_vendor/__init__.py | 0 .../_vendor/more_itertools/__init__.py | 4 - .../setuptools/_vendor/more_itertools/more.py | 3825 -------- .../_vendor/more_itertools/recipes.py | 620 -- .../setuptools/_vendor/ordered_set.py | 488 - .../setuptools/_vendor/packaging/__about__.py | 27 - .../setuptools/_vendor/packaging/__init__.py | 26 - .../setuptools/_vendor/packaging/_compat.py | 38 - .../_vendor/packaging/_structures.py | 86 - .../setuptools/_vendor/packaging/_typing.py | 48 - .../setuptools/_vendor/packaging/markers.py | 328 - .../_vendor/packaging/requirements.py | 145 - .../_vendor/packaging/specifiers.py | 863 -- .../setuptools/_vendor/packaging/tags.py | 751 -- .../setuptools/_vendor/packaging/utils.py | 65 - .../setuptools/_vendor/packaging/version.py | 535 -- .../setuptools/_vendor/pyparsing.py | 5742 ----------- .../site-packages/setuptools/archive_util.py | 205 - .../site-packages/setuptools/build_meta.py | 281 - venv/Lib/site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes venv/Lib/site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes venv/Lib/site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 8 - .../site-packages/setuptools/command/alias.py | 78 - .../setuptools/command/bdist_egg.py | 456 - .../setuptools/command/bdist_rpm.py | 31 - .../setuptools/command/build_clib.py | 101 - .../setuptools/command/build_ext.py | 322 - .../setuptools/command/build_py.py | 252 - .../setuptools/command/develop.py | 216 - .../setuptools/command/dist_info.py | 36 - .../setuptools/command/easy_install.py | 2290 ----- .../setuptools/command/egg_info.py | 734 -- .../setuptools/command/install.py | 125 - .../setuptools/command/install_egg_info.py | 62 - .../setuptools/command/install_lib.py | 122 - .../setuptools/command/install_scripts.py | 69 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 134 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 64 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 189 - .../setuptools/command/setopt.py | 148 - .../site-packages/setuptools/command/test.py | 274 - .../setuptools/command/upload.py | 17 - .../setuptools/command/upload_docs.py | 202 - venv/Lib/site-packages/setuptools/config.py | 715 -- venv/Lib/site-packages/setuptools/dep_util.py | 25 - venv/Lib/site-packages/setuptools/depends.py | 175 - venv/Lib/site-packages/setuptools/dist.py | 1115 --- venv/Lib/site-packages/setuptools/errors.py | 16 - .../Lib/site-packages/setuptools/extension.py | 55 - .../setuptools/extern/__init__.py | 73 - venv/Lib/site-packages/setuptools/glob.py | 167 - venv/Lib/site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes venv/Lib/site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes venv/Lib/site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/installer.py | 97 - venv/Lib/site-packages/setuptools/launch.py | 36 - .../site-packages/setuptools/lib2to3_ex.py | 68 - venv/Lib/site-packages/setuptools/monkey.py | 177 - venv/Lib/site-packages/setuptools/msvc.py | 1805 ---- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1128 --- .../site-packages/setuptools/py34compat.py | 13 - venv/Lib/site-packages/setuptools/sandbox.py | 496 - .../setuptools/script (dev).tmpl | 6 - venv/Lib/site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/unicode_utils.py | 42 - venv/Lib/site-packages/setuptools/version.py | 6 - venv/Lib/site-packages/setuptools/wheel.py | 213 - .../setuptools/windows_support.py | 29 - venv/Scripts/Activate.ps1 | 60 - venv/Scripts/activate | 83 - venv/Scripts/activate.bat | 40 - venv/Scripts/deactivate.bat | 19 - venv/Scripts/pip.exe | Bin 106379 -> 0 bytes venv/Scripts/pip3.9.exe | Bin 106379 -> 0 bytes venv/Scripts/pip3.exe | Bin 106379 -> 0 bytes venv/Scripts/python.exe | Bin 543464 -> 0 bytes venv/Scripts/pythonw.exe | Bin 542440 -> 0 bytes venv/pyvenv.cfg | 8 - 1418 files changed, 285450 deletions(-) delete mode 100644 venv/Include/site/python3.9/pygame/_camera.h delete mode 100644 venv/Include/site/python3.9/pygame/_pygame.h delete mode 100644 venv/Include/site/python3.9/pygame/_surface.h delete mode 100644 venv/Include/site/python3.9/pygame/camera.h delete mode 100644 venv/Include/site/python3.9/pygame/fastevents.h delete mode 100644 venv/Include/site/python3.9/pygame/font.h delete mode 100644 venv/Include/site/python3.9/pygame/freetype.h delete mode 100644 venv/Include/site/python3.9/pygame/include/_pygame.h delete mode 100644 venv/Include/site/python3.9/pygame/include/bitmask.h delete mode 100644 venv/Include/site/python3.9/pygame/include/pgcompat.h delete mode 100644 venv/Include/site/python3.9/pygame/include/pgimport.h delete mode 100644 venv/Include/site/python3.9/pygame/include/pgplatform.h delete mode 100644 venv/Include/site/python3.9/pygame/include/pygame.h delete mode 100644 venv/Include/site/python3.9/pygame/include/pygame_bufferproxy.h delete mode 100644 venv/Include/site/python3.9/pygame/include/pygame_font.h delete mode 100644 venv/Include/site/python3.9/pygame/include/pygame_freetype.h delete mode 100644 venv/Include/site/python3.9/pygame/include/pygame_mask.h delete mode 100644 venv/Include/site/python3.9/pygame/include/pygame_mixer.h delete mode 100644 venv/Include/site/python3.9/pygame/include/sse2neon.h delete mode 100644 venv/Include/site/python3.9/pygame/mask.h delete mode 100644 venv/Include/site/python3.9/pygame/mixer.h delete mode 100644 venv/Include/site/python3.9/pygame/palette.h delete mode 100644 venv/Include/site/python3.9/pygame/pgarrinter.h delete mode 100644 venv/Include/site/python3.9/pygame/pgbufferproxy.h delete mode 100644 venv/Include/site/python3.9/pygame/pgcompat.h delete mode 100644 venv/Include/site/python3.9/pygame/pgimport.h delete mode 100644 venv/Include/site/python3.9/pygame/pgopengl.h delete mode 100644 venv/Include/site/python3.9/pygame/pgplatform.h delete mode 100644 venv/Include/site/python3.9/pygame/pygame.h delete mode 100644 venv/Include/site/python3.9/pygame/scrap.h delete mode 100644 venv/Include/site/python3.9/pygame/surface.h delete mode 100644 venv/Lib/site-packages/_distutils_hack/__init__.py delete mode 100644 venv/Lib/site-packages/_distutils_hack/override.py delete mode 100644 venv/Lib/site-packages/distutils-precedence.pth delete mode 100644 venv/Lib/site-packages/pip/__init__.py delete mode 100644 venv/Lib/site-packages/pip/__main__.py delete mode 100644 venv/Lib/site-packages/pip/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/build_env.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cache.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/base_command.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/command_context.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/main.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/parser.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/req_command.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/spinners.py delete mode 100644 venv/Lib/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/cache.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/check.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/completion.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/configuration.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/debug.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/download.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/freeze.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/hash.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/help.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/install.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/list.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/search.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/show.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 venv/Lib/site-packages/pip/_internal/commands/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/configuration.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/installed.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 venv/Lib/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/exceptions.py delete mode 100644 venv/Lib/site-packages/pip/_internal/index/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/index/collector.py delete mode 100644 venv/Lib/site-packages/pip/_internal/index/package_finder.py delete mode 100644 venv/Lib/site-packages/pip/_internal/index/sources.py delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 venv/Lib/site-packages/pip/_internal/locations/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/main.py delete mode 100644 venv/Lib/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/metadata/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/models/candidate.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/direct_url.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/format_control.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/index.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/link.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/scheme.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/search_scope.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/target_python.py delete mode 100644 venv/Lib/site-packages/pip/_internal/models/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/network/auth.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/cache.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/download.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/session.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/utils.py delete mode 100644 venv/Lib/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/check.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/freeze.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/prepare.py delete mode 100644 venv/Lib/site-packages/pip/_internal/pyproject.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/req/constructors.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_file.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_install.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_set.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_tracker.py delete mode 100644 venv/Lib/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 venv/Lib/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/compat.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/datetime.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/distutils_args.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/glibc.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/hashes.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/logging.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/misc.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/models.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/packaging.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/parallel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/urls.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/git.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 venv/Lib/site-packages/pip/_internal/wheel_builder.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/appdirs.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/appdirs.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/core.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/database.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/index.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/util.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distro.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/constants.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/codec.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/core.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/_version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/build.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/check.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/meta.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/bar.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/counter.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/progress/spinner.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pyparsing.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/api.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/auth.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/certs.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/help.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/models.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/packages.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/structures.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/requests/utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/six.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/vendor.txt delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 venv/Lib/site-packages/pip/py.typed delete mode 100644 venv/Lib/site-packages/pkg_resources/__init__.py delete mode 100644 venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_typing.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_typing.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py delete mode 100644 venv/Lib/site-packages/pkg_resources/extern/__init__.py delete mode 100644 venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py delete mode 100644 venv/Lib/site-packages/pygame-2.0.1.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/pygame-2.0.1.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/pygame-2.0.1.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/pygame-2.0.1.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/pygame-2.0.1.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/pygame-2.0.1.dist-info/entry_points.txt delete mode 100644 venv/Lib/site-packages/pygame-2.0.1.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/pygame/SDL2.dll delete mode 100644 venv/Lib/site-packages/pygame/SDL2_image.dll delete mode 100644 venv/Lib/site-packages/pygame/SDL2_mixer.dll delete mode 100644 venv/Lib/site-packages/pygame/SDL2_ttf.dll delete mode 100644 venv/Lib/site-packages/pygame/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/__init__.pyi delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/_camera_opencv_highgui.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/_camera_vidcapture.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/_dummybackend.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/_numpysndarray.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/_numpysurfarray.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/camera.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/colordict.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/compat.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/cursors.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/draw_py.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/freetype.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/ftfont.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/locals.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/macosx.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/midi.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/pkgdata.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/sndarray.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/sprite.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/surfarray.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/sysfont.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pycache__/version.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pyinstaller/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/__pyinstaller/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pyinstaller/__pycache__/hook-pygame.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/__pyinstaller/hook-pygame.py delete mode 100644 venv/Lib/site-packages/pygame/_camera_opencv_highgui.py delete mode 100644 venv/Lib/site-packages/pygame/_camera_vidcapture.py delete mode 100644 venv/Lib/site-packages/pygame/_dummybackend.py delete mode 100644 venv/Lib/site-packages/pygame/_freetype.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/_numpysndarray.py delete mode 100644 venv/Lib/site-packages/pygame/_numpysurfarray.py delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/__init__.pyi delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/audio.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/controller.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/mixer.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/sdl2.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/touch.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/touch.pyi delete mode 100644 venv/Lib/site-packages/pygame/_sdl2/video.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/_sprite.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/base.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/bufferproxy.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/bufferproxy.pyi delete mode 100644 venv/Lib/site-packages/pygame/camera.py delete mode 100644 venv/Lib/site-packages/pygame/camera.pyi delete mode 100644 venv/Lib/site-packages/pygame/color.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/color.pyi delete mode 100644 venv/Lib/site-packages/pygame/colordict.py delete mode 100644 venv/Lib/site-packages/pygame/compat.py delete mode 100644 venv/Lib/site-packages/pygame/constants.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/constants.pyi delete mode 100644 venv/Lib/site-packages/pygame/cursors.py delete mode 100644 venv/Lib/site-packages/pygame/cursors.pyi delete mode 100644 venv/Lib/site-packages/pygame/display.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/display.pyi delete mode 100644 venv/Lib/site-packages/pygame/docs/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/docs/__main__.py delete mode 100644 venv/Lib/site-packages/pygame/docs/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/docs/__pycache__/__main__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/docs/logos.html delete mode 100644 venv/Lib/site-packages/pygame/docs/pygame_logo.gif delete mode 100644 venv/Lib/site-packages/pygame/docs/pygame_powered.gif delete mode 100644 venv/Lib/site-packages/pygame/docs/pygame_small.gif delete mode 100644 venv/Lib/site-packages/pygame/docs/pygame_tiny.gif delete mode 100644 venv/Lib/site-packages/pygame/draw.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/draw.pyi delete mode 100644 venv/Lib/site-packages/pygame/draw_py.py delete mode 100644 venv/Lib/site-packages/pygame/event.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/event.pyi delete mode 100644 venv/Lib/site-packages/pygame/examples/README.rst delete mode 100644 venv/Lib/site-packages/pygame/examples/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/aacircle.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/aliens.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/arraydemo.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/audiocapture.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/blend_fill.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/blit_blends.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/camera.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/chimp.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/cursors.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/dropevent.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/eventlist.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/fastevents.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/font_viewer.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/fonty.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/freetype_misc.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/glcube.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/headless_no_windows_needed.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/liquid.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/mask.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/midi.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/moveit.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/music_drop_fade.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/overlay.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/pixelarray.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/playmus.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/prevent_display_stretching.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/resizing_new.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/scaletest.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/scrap_clipboard.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/scroll.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/setmodescale.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/sound.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/sound_array_demos.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/sprite_texture.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/stars.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/testsprite.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/textinput.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/vgrade.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/__pycache__/video.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/examples/aacircle.py delete mode 100644 venv/Lib/site-packages/pygame/examples/aliens.py delete mode 100644 venv/Lib/site-packages/pygame/examples/arraydemo.py delete mode 100644 venv/Lib/site-packages/pygame/examples/audiocapture.py delete mode 100644 venv/Lib/site-packages/pygame/examples/blend_fill.py delete mode 100644 venv/Lib/site-packages/pygame/examples/blit_blends.py delete mode 100644 venv/Lib/site-packages/pygame/examples/camera.py delete mode 100644 venv/Lib/site-packages/pygame/examples/chimp.py delete mode 100644 venv/Lib/site-packages/pygame/examples/cursors.py delete mode 100644 venv/Lib/site-packages/pygame/examples/data/BGR.png delete mode 100644 venv/Lib/site-packages/pygame/examples/data/alien1.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/alien1.jpg delete mode 100644 venv/Lib/site-packages/pygame/examples/data/alien1.png delete mode 100644 venv/Lib/site-packages/pygame/examples/data/alien2.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/alien2.png delete mode 100644 venv/Lib/site-packages/pygame/examples/data/alien3.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/alien3.png delete mode 100644 venv/Lib/site-packages/pygame/examples/data/arraydemo.bmp delete mode 100644 venv/Lib/site-packages/pygame/examples/data/asprite.bmp delete mode 100644 venv/Lib/site-packages/pygame/examples/data/background.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/black.ppm delete mode 100644 venv/Lib/site-packages/pygame/examples/data/blue.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/blue.mpg delete mode 100644 venv/Lib/site-packages/pygame/examples/data/bomb.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/boom.wav delete mode 100644 venv/Lib/site-packages/pygame/examples/data/brick.png delete mode 100644 venv/Lib/site-packages/pygame/examples/data/car_door.wav delete mode 100644 venv/Lib/site-packages/pygame/examples/data/chimp.bmp delete mode 100644 venv/Lib/site-packages/pygame/examples/data/city.png delete mode 100644 venv/Lib/site-packages/pygame/examples/data/danger.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/explosion1.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/fist.bmp delete mode 100644 venv/Lib/site-packages/pygame/examples/data/green.pcx delete mode 100644 venv/Lib/site-packages/pygame/examples/data/grey.pgm delete mode 100644 venv/Lib/site-packages/pygame/examples/data/house_lo.mp3 delete mode 100644 venv/Lib/site-packages/pygame/examples/data/house_lo.ogg delete mode 100644 venv/Lib/site-packages/pygame/examples/data/house_lo.wav delete mode 100644 venv/Lib/site-packages/pygame/examples/data/laplacian.png delete mode 100644 venv/Lib/site-packages/pygame/examples/data/liquid.bmp delete mode 100644 venv/Lib/site-packages/pygame/examples/data/midikeys.png delete mode 100644 venv/Lib/site-packages/pygame/examples/data/oldplayer.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/player1.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/punch.wav delete mode 100644 venv/Lib/site-packages/pygame/examples/data/purple.xpm delete mode 100644 venv/Lib/site-packages/pygame/examples/data/red.jpg delete mode 100644 venv/Lib/site-packages/pygame/examples/data/sans.ttf delete mode 100644 venv/Lib/site-packages/pygame/examples/data/secosmic_lo.wav delete mode 100644 venv/Lib/site-packages/pygame/examples/data/shot.gif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/static.png delete mode 100644 venv/Lib/site-packages/pygame/examples/data/turquoise.tif delete mode 100644 venv/Lib/site-packages/pygame/examples/data/whiff.wav delete mode 100644 venv/Lib/site-packages/pygame/examples/data/yellow.tga delete mode 100644 venv/Lib/site-packages/pygame/examples/data/yuv_1.pgm delete mode 100644 venv/Lib/site-packages/pygame/examples/dropevent.py delete mode 100644 venv/Lib/site-packages/pygame/examples/eventlist.py delete mode 100644 venv/Lib/site-packages/pygame/examples/fastevents.py delete mode 100644 venv/Lib/site-packages/pygame/examples/font_viewer.py delete mode 100644 venv/Lib/site-packages/pygame/examples/fonty.py delete mode 100644 venv/Lib/site-packages/pygame/examples/freetype_misc.py delete mode 100644 venv/Lib/site-packages/pygame/examples/glcube.py delete mode 100644 venv/Lib/site-packages/pygame/examples/headless_no_windows_needed.py delete mode 100644 venv/Lib/site-packages/pygame/examples/liquid.py delete mode 100644 venv/Lib/site-packages/pygame/examples/mask.py delete mode 100644 venv/Lib/site-packages/pygame/examples/midi.py delete mode 100644 venv/Lib/site-packages/pygame/examples/moveit.py delete mode 100644 venv/Lib/site-packages/pygame/examples/music_drop_fade.py delete mode 100644 venv/Lib/site-packages/pygame/examples/overlay.py delete mode 100644 venv/Lib/site-packages/pygame/examples/pixelarray.py delete mode 100644 venv/Lib/site-packages/pygame/examples/playmus.py delete mode 100644 venv/Lib/site-packages/pygame/examples/prevent_display_stretching.py delete mode 100644 venv/Lib/site-packages/pygame/examples/resizing_new.py delete mode 100644 venv/Lib/site-packages/pygame/examples/scaletest.py delete mode 100644 venv/Lib/site-packages/pygame/examples/scrap_clipboard.py delete mode 100644 venv/Lib/site-packages/pygame/examples/scroll.py delete mode 100644 venv/Lib/site-packages/pygame/examples/setmodescale.py delete mode 100644 venv/Lib/site-packages/pygame/examples/sound.py delete mode 100644 venv/Lib/site-packages/pygame/examples/sound_array_demos.py delete mode 100644 venv/Lib/site-packages/pygame/examples/sprite_texture.py delete mode 100644 venv/Lib/site-packages/pygame/examples/stars.py delete mode 100644 venv/Lib/site-packages/pygame/examples/testsprite.py delete mode 100644 venv/Lib/site-packages/pygame/examples/textinput.py delete mode 100644 venv/Lib/site-packages/pygame/examples/vgrade.py delete mode 100644 venv/Lib/site-packages/pygame/examples/video.py delete mode 100644 venv/Lib/site-packages/pygame/fastevent.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/fastevent.pyi delete mode 100644 venv/Lib/site-packages/pygame/font.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/font.pyi delete mode 100644 venv/Lib/site-packages/pygame/freesansbold.ttf delete mode 100644 venv/Lib/site-packages/pygame/freetype.py delete mode 100644 venv/Lib/site-packages/pygame/freetype.pyi delete mode 100644 venv/Lib/site-packages/pygame/ftfont.py delete mode 100644 venv/Lib/site-packages/pygame/gfxdraw.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/gfxdraw.pyi delete mode 100644 venv/Lib/site-packages/pygame/image.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/image.pyi delete mode 100644 venv/Lib/site-packages/pygame/imageext.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/joystick.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/joystick.pyi delete mode 100644 venv/Lib/site-packages/pygame/key.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/key.pyi delete mode 100644 venv/Lib/site-packages/pygame/libFLAC-8.dll delete mode 100644 venv/Lib/site-packages/pygame/libfreetype-6.dll delete mode 100644 venv/Lib/site-packages/pygame/libjpeg-9.dll delete mode 100644 venv/Lib/site-packages/pygame/libmodplug-1.dll delete mode 100644 venv/Lib/site-packages/pygame/libmpg123-0.dll delete mode 100644 venv/Lib/site-packages/pygame/libogg-0.dll delete mode 100644 venv/Lib/site-packages/pygame/libopus-0.dll delete mode 100644 venv/Lib/site-packages/pygame/libopusfile-0.dll delete mode 100644 venv/Lib/site-packages/pygame/libpng16-16.dll delete mode 100644 venv/Lib/site-packages/pygame/libtiff-5.dll delete mode 100644 venv/Lib/site-packages/pygame/libvorbis-0.dll delete mode 100644 venv/Lib/site-packages/pygame/libvorbisfile-3.dll delete mode 100644 venv/Lib/site-packages/pygame/libwebp-7.dll delete mode 100644 venv/Lib/site-packages/pygame/locals.py delete mode 100644 venv/Lib/site-packages/pygame/macosx.py delete mode 100644 venv/Lib/site-packages/pygame/mask.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/mask.pyi delete mode 100644 venv/Lib/site-packages/pygame/math.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/math.pyi delete mode 100644 venv/Lib/site-packages/pygame/midi.py delete mode 100644 venv/Lib/site-packages/pygame/midi.pyi delete mode 100644 venv/Lib/site-packages/pygame/mixer.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/mixer.pyi delete mode 100644 venv/Lib/site-packages/pygame/mixer_music.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/mouse.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/mouse.pyi delete mode 100644 venv/Lib/site-packages/pygame/music.pyi delete mode 100644 venv/Lib/site-packages/pygame/newbuffer.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/pixelarray.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/pixelarray.pyi delete mode 100644 venv/Lib/site-packages/pygame/pixelcopy.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/pixelcopy.pyi delete mode 100644 venv/Lib/site-packages/pygame/pkgdata.py delete mode 100644 venv/Lib/site-packages/pygame/portmidi.dll delete mode 100644 venv/Lib/site-packages/pygame/py.typed delete mode 100644 venv/Lib/site-packages/pygame/pygame.ico delete mode 100644 venv/Lib/site-packages/pygame/pygame_icon.bmp delete mode 100644 venv/Lib/site-packages/pygame/pygame_icon.icns delete mode 100644 venv/Lib/site-packages/pygame/pygame_icon.svg delete mode 100644 venv/Lib/site-packages/pygame/pygame_icon.tiff delete mode 100644 venv/Lib/site-packages/pygame/pypm.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/rect.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/rect.pyi delete mode 100644 venv/Lib/site-packages/pygame/rwobject.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/scrap.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/scrap.pyi delete mode 100644 venv/Lib/site-packages/pygame/sndarray.py delete mode 100644 venv/Lib/site-packages/pygame/sndarray.pyi delete mode 100644 venv/Lib/site-packages/pygame/sprite.py delete mode 100644 venv/Lib/site-packages/pygame/sprite.pyi delete mode 100644 venv/Lib/site-packages/pygame/surface.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/surface.pyi delete mode 100644 venv/Lib/site-packages/pygame/surfarray.py delete mode 100644 venv/Lib/site-packages/pygame/surfarray.pyi delete mode 100644 venv/Lib/site-packages/pygame/surflock.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/sysfont.py delete mode 100644 venv/Lib/site-packages/pygame/tests/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/__main__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/__main__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/base_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/blit_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/bufferproxy_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/camera_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/cdrom_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/cdrom_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/color_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/compat_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/constants_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/cursors_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/display_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/draw_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/event_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/fastevent_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/fastevent_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/font_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/font_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/freetype_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/freetype_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/ftfont_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/ftfont_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/gfxdraw_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/image__save_gl_surface_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/image_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/image_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/imageext_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/imageext_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/joystick_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/key_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mask_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/math_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/midi_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mixer_music_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mixer_music_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mixer_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mixer_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/mouse_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/overlay_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/overlay_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/pixelarray_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/pixelcopy_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/rect_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/rwobject_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/scrap_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/scrap_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/sndarray_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/sndarray_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/sprite_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/surface_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/surfarray_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/surfarray_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/surflock_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/sysfont_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/test_test_.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/threads_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/time_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/touch_tags.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/touch_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/transform_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/version_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/__pycache__/video_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/base_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/blit_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/bufferproxy_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/camera_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/cdrom_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/cdrom_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/color_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/compat_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/constants_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/cursors_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/display_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/draw_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/event_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/fastevent_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/fastevent_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/A_PyGameMono-8.png delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/PyGameMono-18-100dpi.bdf delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/PyGameMono-18-75dpi.bdf delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/PyGameMono-8.bdf delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/PyGameMono.otf delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/test_fixed.otf delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/test_sans.ttf delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/fonts/u13079_PyGameMono-8.png delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing.xbm delete mode 100644 venv/Lib/site-packages/pygame/tests/fixtures/xbm_cursors/white_sizing_mask.xbm delete mode 100644 venv/Lib/site-packages/pygame/tests/font_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/font_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/freetype_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/freetype_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/ftfont_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/ftfont_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/gfxdraw_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/image__save_gl_surface_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/image_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/image_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/imageext_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/imageext_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/joystick_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/key_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/mask_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/math_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/midi_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/mixer_music_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/mixer_music_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/mixer_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/mixer_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/mouse_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/overlay_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/overlay_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/pixelarray_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/pixelcopy_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/rect_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/__pycache__/run_tests__test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_3_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_4_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_5_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/fake_6_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/no_assertions__ret_code_of_1__test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/__pycache__/zero_tests_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_3_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_4_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_5_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/fake_6_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/no_assertions__ret_code_of_1__test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/all_ok/zero_tests_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/incomplete_todo_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/magic_tag_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/__pycache__/sleep_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/incomplete_todo_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/magic_tag_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/everything/sleep_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/invisible_tag_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/__pycache__/magic_tag_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/invisible_tag_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/exclude/magic_tag_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/fake_3_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/__pycache__/fake_4_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_3_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/failures1/fake_4_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/__pycache__/fake_3_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete/fake_3_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_3_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/incomplete_todo/fake_3_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_1_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/fake_1_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/infinite_loop/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_3_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_4_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_3_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stderr/fake_4_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_3_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_4_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/fake_3_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/print_stdout/fake_4_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/run_tests__test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/fake_2_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/__pycache__/sleep_test.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/fake_2_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/run_tests__tests/timeout/sleep_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/rwobject_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/scrap_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/scrap_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/sndarray_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/sndarray_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/sprite_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/surface_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/surfarray_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/surfarray_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/surflock_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/sysfont_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_test_.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/arrinter.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/async_sub.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/buftools.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/endian.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/png.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/run_tests.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/test_machinery.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/__pycache__/test_runner.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/arrinter.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/async_sub.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/buftools.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/endian.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/png.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/run_tests.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/test_machinery.py delete mode 100644 venv/Lib/site-packages/pygame/tests/test_utils/test_runner.py delete mode 100644 venv/Lib/site-packages/pygame/tests/threads_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/time_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/touch_tags.py delete mode 100644 venv/Lib/site-packages/pygame/tests/touch_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/transform_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/version_test.py delete mode 100644 venv/Lib/site-packages/pygame/tests/video_test.py delete mode 100644 venv/Lib/site-packages/pygame/threads/__init__.py delete mode 100644 venv/Lib/site-packages/pygame/threads/__pycache__/__init__.cpython-39.pyc delete mode 100644 venv/Lib/site-packages/pygame/time.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/time.pyi delete mode 100644 venv/Lib/site-packages/pygame/transform.cp39-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/pygame/transform.pyi delete mode 100644 venv/Lib/site-packages/pygame/version.py delete mode 100644 venv/Lib/site-packages/pygame/version.pyi delete mode 100644 venv/Lib/site-packages/pygame/zlib1.dll delete mode 100644 venv/Lib/site-packages/setuptools/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_deprecation_warning.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/archive_util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/ccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/cmd.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_py.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/check.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/clean.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/config.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_data.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/py37compat.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/register.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/sdist.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/upload.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/config.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/core.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/debug.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/dep_util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/dir_util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/dist.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/errors.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/extension.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/file_util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/filelist.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/log.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/py35compat.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/py38compat.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/spawn.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/sysconfig.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/text_file.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/util.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/version.py delete mode 100644 venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py delete mode 100644 venv/Lib/site-packages/setuptools/_imp.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/ordered_set.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_typing.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 venv/Lib/site-packages/setuptools/_vendor/pyparsing.py delete mode 100644 venv/Lib/site-packages/setuptools/archive_util.py delete mode 100644 venv/Lib/site-packages/setuptools/build_meta.py delete mode 100644 venv/Lib/site-packages/setuptools/cli-32.exe delete mode 100644 venv/Lib/site-packages/setuptools/cli-64.exe delete mode 100644 venv/Lib/site-packages/setuptools/cli.exe delete mode 100644 venv/Lib/site-packages/setuptools/command/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/command/alias.py delete mode 100644 venv/Lib/site-packages/setuptools/command/bdist_egg.py delete mode 100644 venv/Lib/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 venv/Lib/site-packages/setuptools/command/build_clib.py delete mode 100644 venv/Lib/site-packages/setuptools/command/build_ext.py delete mode 100644 venv/Lib/site-packages/setuptools/command/build_py.py delete mode 100644 venv/Lib/site-packages/setuptools/command/develop.py delete mode 100644 venv/Lib/site-packages/setuptools/command/dist_info.py delete mode 100644 venv/Lib/site-packages/setuptools/command/easy_install.py delete mode 100644 venv/Lib/site-packages/setuptools/command/egg_info.py delete mode 100644 venv/Lib/site-packages/setuptools/command/install.py delete mode 100644 venv/Lib/site-packages/setuptools/command/install_egg_info.py delete mode 100644 venv/Lib/site-packages/setuptools/command/install_lib.py delete mode 100644 venv/Lib/site-packages/setuptools/command/install_scripts.py delete mode 100644 venv/Lib/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 venv/Lib/site-packages/setuptools/command/py36compat.py delete mode 100644 venv/Lib/site-packages/setuptools/command/register.py delete mode 100644 venv/Lib/site-packages/setuptools/command/rotate.py delete mode 100644 venv/Lib/site-packages/setuptools/command/saveopts.py delete mode 100644 venv/Lib/site-packages/setuptools/command/sdist.py delete mode 100644 venv/Lib/site-packages/setuptools/command/setopt.py delete mode 100644 venv/Lib/site-packages/setuptools/command/test.py delete mode 100644 venv/Lib/site-packages/setuptools/command/upload.py delete mode 100644 venv/Lib/site-packages/setuptools/command/upload_docs.py delete mode 100644 venv/Lib/site-packages/setuptools/config.py delete mode 100644 venv/Lib/site-packages/setuptools/dep_util.py delete mode 100644 venv/Lib/site-packages/setuptools/depends.py delete mode 100644 venv/Lib/site-packages/setuptools/dist.py delete mode 100644 venv/Lib/site-packages/setuptools/errors.py delete mode 100644 venv/Lib/site-packages/setuptools/extension.py delete mode 100644 venv/Lib/site-packages/setuptools/extern/__init__.py delete mode 100644 venv/Lib/site-packages/setuptools/glob.py delete mode 100644 venv/Lib/site-packages/setuptools/gui-32.exe delete mode 100644 venv/Lib/site-packages/setuptools/gui-64.exe delete mode 100644 venv/Lib/site-packages/setuptools/gui.exe delete mode 100644 venv/Lib/site-packages/setuptools/installer.py delete mode 100644 venv/Lib/site-packages/setuptools/launch.py delete mode 100644 venv/Lib/site-packages/setuptools/lib2to3_ex.py delete mode 100644 venv/Lib/site-packages/setuptools/monkey.py delete mode 100644 venv/Lib/site-packages/setuptools/msvc.py delete mode 100644 venv/Lib/site-packages/setuptools/namespaces.py delete mode 100644 venv/Lib/site-packages/setuptools/package_index.py delete mode 100644 venv/Lib/site-packages/setuptools/py34compat.py delete mode 100644 venv/Lib/site-packages/setuptools/sandbox.py delete mode 100644 venv/Lib/site-packages/setuptools/script (dev).tmpl delete mode 100644 venv/Lib/site-packages/setuptools/script.tmpl delete mode 100644 venv/Lib/site-packages/setuptools/unicode_utils.py delete mode 100644 venv/Lib/site-packages/setuptools/version.py delete mode 100644 venv/Lib/site-packages/setuptools/wheel.py delete mode 100644 venv/Lib/site-packages/setuptools/windows_support.py delete mode 100644 venv/Scripts/Activate.ps1 delete mode 100644 venv/Scripts/activate delete mode 100644 venv/Scripts/activate.bat delete mode 100644 venv/Scripts/deactivate.bat delete mode 100644 venv/Scripts/pip.exe delete mode 100644 venv/Scripts/pip3.9.exe delete mode 100644 venv/Scripts/pip3.exe delete mode 100644 venv/Scripts/python.exe delete mode 100644 venv/Scripts/pythonw.exe delete mode 100644 venv/pyvenv.cfg diff --git a/venv/Include/site/python3.9/pygame/_camera.h b/venv/Include/site/python3.9/pygame/_camera.h deleted file mode 100644 index 68ae989..0000000 --- a/venv/Include/site/python3.9/pygame/_camera.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - pygame - Python Game Library - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -#ifndef _CAMERA_H -#define _CAMERA_H - -#include "_pygame.h" -#include "camera.h" - -#endif - diff --git a/venv/Include/site/python3.9/pygame/_pygame.h b/venv/Include/site/python3.9/pygame/_pygame.h deleted file mode 100644 index 95f5127..0000000 --- a/venv/Include/site/python3.9/pygame/_pygame.h +++ /dev/null @@ -1,350 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -/* This will use PYGAMEAPI_EXTERN_SLOTS instead - * of PYGAMEAPI_DEFINE_SLOTS for base modules. - */ -#ifndef _PYGAME_INTERNAL_H -#define _PYGAME_INTERNAL_H - -#include "pgplatform.h" -/* - If PY_SSIZE_T_CLEAN is defined before including Python.h, length is a - Py_ssize_t rather than an int for all # variants of formats (s#, y#, etc.) -*/ -#define PY_SSIZE_T_CLEAN -#include -#include - -/* IS_SDLv1 is 1 if SDL 1.x.x, 0 otherwise */ -/* IS_SDLv2 is 1 if at least SDL 2.0.0, 0 otherwise */ -#if (SDL_VERSION_ATLEAST(2, 0, 0)) -#define IS_SDLv2 1 -#define IS_SDLv1 0 -#else -#define IS_SDLv2 0 -#define IS_SDLv1 1 -#endif - -/*#if IS_SDLv1 && PG_MAJOR_VERSION >= 2 -#error pygame 2 requires SDL 2 -#endif*/ - -#if IS_SDLv2 -/* SDL 1.2 constants removed from SDL 2 */ -typedef enum { - SDL_HWSURFACE = 0, - SDL_RESIZABLE = SDL_WINDOW_RESIZABLE, - SDL_ASYNCBLIT = 0, - SDL_OPENGL = SDL_WINDOW_OPENGL, - SDL_OPENGLBLIT = 0, - SDL_ANYFORMAT = 0, - SDL_HWPALETTE = 0, - SDL_DOUBLEBUF = 0, - SDL_FULLSCREEN = SDL_WINDOW_FULLSCREEN, - SDL_HWACCEL = 0, - SDL_SRCCOLORKEY = 0, - SDL_RLEACCELOK = 0, - SDL_SRCALPHA = 0, - SDL_NOFRAME = SDL_WINDOW_BORDERLESS, - SDL_GL_SWAP_CONTROL = 0, - TIMER_RESOLUTION = 0 -} PygameVideoFlags; - -/* the wheel button constants were removed from SDL 2 */ -typedef enum { - PGM_BUTTON_LEFT = SDL_BUTTON_LEFT, - PGM_BUTTON_RIGHT = SDL_BUTTON_RIGHT, - PGM_BUTTON_MIDDLE = SDL_BUTTON_MIDDLE, - PGM_BUTTON_WHEELUP = 4, - PGM_BUTTON_WHEELDOWN = 5, - PGM_BUTTON_X1 = SDL_BUTTON_X1 + 2, - PGM_BUTTON_X2 = SDL_BUTTON_X2 + 2, - PGM_BUTTON_KEEP = 0x80 -} PygameMouseFlags; - -typedef enum { - /* Any SDL_* events here are for backward compatibility. */ - SDL_NOEVENT = 0, - - SDL_ACTIVEEVENT = SDL_USEREVENT, - SDL_VIDEORESIZE, - SDL_VIDEOEXPOSE, - - PGE_MIDIIN, - PGE_MIDIOUT, - PGE_KEYREPEAT, /* Special internal pygame event, for managing key-presses */ - - /* DO NOT CHANGE THE ORDER OF EVENTS HERE */ - PGE_WINDOWSHOWN, - PGE_WINDOWHIDDEN, - PGE_WINDOWEXPOSED, - PGE_WINDOWMOVED, - PGE_WINDOWRESIZED, - PGE_WINDOWSIZECHANGED, - PGE_WINDOWMINIMIZED, - PGE_WINDOWMAXIMIZED, - PGE_WINDOWRESTORED, - PGE_WINDOWENTER, - PGE_WINDOWLEAVE, - PGE_WINDOWFOCUSGAINED, - PGE_WINDOWFOCUSLOST, - PGE_WINDOWCLOSE, - PGE_WINDOWTAKEFOCUS, - PGE_WINDOWHITTEST, - - /* Here we define PGPOST_* events, events that act as a one-to-one - * proxy for SDL events (and some extra events too!), the proxy is used - * internally when pygame users use event.post() - * - * Thankfully, SDL2 provides over 8000 userevents, so theres no need - * to worry about wasting userevent space. - * - * IMPORTANT NOTE: Do not post events directly with these proxy types, - * use the appropriate functions in event.c, that handle these proxy - * events for you. - * Proxy events are for internal use only */ - PGPOST_EVENTBEGIN, /* mark start of proxy-events */ - PGPOST_ACTIVEEVENT = PGPOST_EVENTBEGIN, - PGPOST_AUDIODEVICEADDED, - PGPOST_AUDIODEVICEREMOVED, - PGPOST_CONTROLLERAXISMOTION, - PGPOST_CONTROLLERBUTTONDOWN, - PGPOST_CONTROLLERBUTTONUP, - PGPOST_CONTROLLERDEVICEADDED, - PGPOST_CONTROLLERDEVICEREMOVED, - PGPOST_CONTROLLERDEVICEREMAPPED, - PGPOST_DOLLARGESTURE, - PGPOST_DOLLARRECORD, - PGPOST_DROPFILE, - PGPOST_DROPTEXT, - PGPOST_DROPBEGIN, - PGPOST_DROPCOMPLETE, - PGPOST_FINGERMOTION, - PGPOST_FINGERDOWN, - PGPOST_FINGERUP, - PGPOST_KEYDOWN, - PGPOST_KEYUP, - PGPOST_JOYAXISMOTION, - PGPOST_JOYBALLMOTION, - PGPOST_JOYHATMOTION, - PGPOST_JOYBUTTONDOWN, - PGPOST_JOYBUTTONUP, - PGPOST_JOYDEVICEADDED, - PGPOST_JOYDEVICEREMOVED, - PGPOST_MIDIIN, - PGPOST_MIDIOUT, - PGPOST_MOUSEMOTION, - PGPOST_MOUSEBUTTONDOWN, - PGPOST_MOUSEBUTTONUP, - PGPOST_MOUSEWHEEL, - PGPOST_MULTIGESTURE, - PGPOST_NOEVENT, - PGPOST_QUIT, - PGPOST_SYSWMEVENT, - PGPOST_TEXTEDITING, - PGPOST_TEXTINPUT, - PGPOST_VIDEORESIZE, - PGPOST_VIDEOEXPOSE, - PGPOST_WINDOWSHOWN, - PGPOST_WINDOWHIDDEN, - PGPOST_WINDOWEXPOSED, - PGPOST_WINDOWMOVED, - PGPOST_WINDOWRESIZED, - PGPOST_WINDOWSIZECHANGED, - PGPOST_WINDOWMINIMIZED, - PGPOST_WINDOWMAXIMIZED, - PGPOST_WINDOWRESTORED, - PGPOST_WINDOWENTER, - PGPOST_WINDOWLEAVE, - PGPOST_WINDOWFOCUSGAINED, - PGPOST_WINDOWFOCUSLOST, - PGPOST_WINDOWCLOSE, - PGPOST_WINDOWTAKEFOCUS, - PGPOST_WINDOWHITTEST, - - PGE_USEREVENT, /* this event must stay in this position only */ - - PG_NUMEVENTS = SDL_LASTEVENT /* Not an event. Indicates end of user events. */ -} PygameEventCode; - -typedef enum { - SDL_APPFOCUSMOUSE, - SDL_APPINPUTFOCUS, - SDL_APPACTIVE -} PygameAppCode; - -/* Surface flags: based on SDL 1.2 flags */ -typedef enum { - PGS_SWSURFACE = 0x00000000, - PGS_HWSURFACE = 0x00000001, - PGS_ASYNCBLIT = 0x00000004, - - PGS_ANYFORMAT = 0x10000000, - PGS_HWPALETTE = 0x20000000, - PGS_DOUBLEBUF = 0x40000000, - PGS_FULLSCREEN = 0x80000000, - PGS_SCALED = 0x00000200, - - PGS_OPENGL = 0x00000002, - PGS_OPENGLBLIT = 0x0000000A, - PGS_RESIZABLE = 0x00000010, - PGS_NOFRAME = 0x00000020, - PGS_SHOWN = 0x00000040, /* Added from SDL 2 */ - PGS_HIDDEN = 0x00000080, /* Added from SDL 2 */ - - PGS_HWACCEL = 0x00000100, - PGS_SRCCOLORKEY = 0x00001000, - PGS_RLEACCELOK = 0x00002000, - PGS_RLEACCEL = 0x00004000, - PGS_SRCALPHA = 0x00010000, - PGS_PREALLOC = 0x01000000 -} PygameSurfaceFlags; - -#else /* IS_SDLv2 */ - -/* To maintain SDL 1.2 build support. */ -#define PGE_USEREVENT SDL_USEREVENT -#define PG_NUMEVENTS SDL_NUMEVENTS -#define PGPOST_EVENTBEGIN 0 -/* These midi events were originally defined in midi.py. - * Note: They are outside the SDL_USEREVENT/SDL_NUMEVENTS event range for - * SDL 1.2. */ -#define PGE_MIDIIN PGE_USEREVENT + 10 -#define PGE_MIDIOUT PGE_USEREVENT + 11 -#endif /* IS_SDLv1 */ - -//TODO Implement check below in a way that does not break CI -/* New buffer protocol (PEP 3118) implemented on all supported Py versions. -#if !defined(Py_TPFLAGS_HAVE_NEWBUFFER) -#error No support for PEP 3118/Py_TPFLAGS_HAVE_NEWBUFFER. Please use a supported Python version. -#endif */ - -#define RAISE(x, y) (PyErr_SetString((x), (y)), (PyObject *)NULL) -#define DEL_ATTR_NOT_SUPPORTED_CHECK(name, value) \ - do { \ - if (!value) { \ - if (name) { \ - PyErr_Format(PyExc_AttributeError, \ - "Cannot delete attribute %s", \ - name); \ - } else { \ - PyErr_SetString(PyExc_AttributeError, \ - "Cannot delete attribute"); \ - } \ - return -1; \ - } \ - } while (0) - -/* - * Initialization checks - */ - -#define VIDEO_INIT_CHECK() \ - if (!SDL_WasInit(SDL_INIT_VIDEO)) \ - return RAISE(pgExc_SDLError, "video system not initialized") - -#define CDROM_INIT_CHECK() \ - if (!SDL_WasInit(SDL_INIT_CDROM)) \ - return RAISE(pgExc_SDLError, "cdrom system not initialized") - -#define JOYSTICK_INIT_CHECK() \ - if (!SDL_WasInit(SDL_INIT_JOYSTICK)) \ - return RAISE(pgExc_SDLError, "joystick system not initialized") - -/* thread check */ -#ifdef WITH_THREAD -#define PG_CHECK_THREADS() (1) -#else /* ~WITH_THREAD */ -#define PG_CHECK_THREADS() \ - (RAISE(PyExc_NotImplementedError, \ - "Python built without thread support")) -#endif /* ~WITH_THREAD */ - -#define PyType_Init(x) (((x).ob_type) = &PyType_Type) - -/* - * event module internals - */ -struct pgEventObject { - PyObject_HEAD int type; - PyObject *dict; -}; - -/* - * surflock module internals - */ -typedef struct { - PyObject_HEAD PyObject *surface; - PyObject *lockobj; - PyObject *weakrefs; -} pgLifetimeLockObject; - -/* - * surface module internals - */ -struct pgSubSurface_Data { - PyObject *owner; - int pixeloffset; - int offsetx, offsety; -}; - -/* - * color module internals - */ -struct pgColorObject { - PyObject_HEAD - Uint8 data[4]; - Uint8 len; -}; - -/* - * include public API - */ -#include "include/_pygame.h" - -#include "pgimport.h" - -/* Slot counts. - * Remember to keep these constants up to date. - */ - -#define PYGAMEAPI_RECT_NUMSLOTS 5 -#define PYGAMEAPI_JOYSTICK_NUMSLOTS 2 -#define PYGAMEAPI_DISPLAY_NUMSLOTS 2 -#define PYGAMEAPI_SURFACE_NUMSLOTS 4 -#define PYGAMEAPI_SURFLOCK_NUMSLOTS 8 -#define PYGAMEAPI_RWOBJECT_NUMSLOTS 6 -#define PYGAMEAPI_PIXELARRAY_NUMSLOTS 2 -#define PYGAMEAPI_COLOR_NUMSLOTS 5 -#define PYGAMEAPI_MATH_NUMSLOTS 2 -#define PYGAMEAPI_CDROM_NUMSLOTS 2 - -#if PG_API_VERSION == 1 -#define PYGAMEAPI_BASE_NUMSLOTS 19 -#define PYGAMEAPI_EVENT_NUMSLOTS 4 -#else /* PG_API_VERSION == 2 */ -#define PYGAMEAPI_BASE_NUMSLOTS 24 -#define PYGAMEAPI_EVENT_NUMSLOTS 6 -#endif /* PG_API_VERSION == 2 */ - -#endif /* _PYGAME_INTERNAL_H */ diff --git a/venv/Include/site/python3.9/pygame/_surface.h b/venv/Include/site/python3.9/pygame/_surface.h deleted file mode 100644 index 016aac0..0000000 --- a/venv/Include/site/python3.9/pygame/_surface.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - Copyright (C) 2007 Marcus von Appen - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -#ifndef _SURFACE_H -#define _SURFACE_H - -#include "_pygame.h" -#include "surface.h" - -#endif - diff --git a/venv/Include/site/python3.9/pygame/camera.h b/venv/Include/site/python3.9/pygame/camera.h deleted file mode 100644 index 5001061..0000000 --- a/venv/Include/site/python3.9/pygame/camera.h +++ /dev/null @@ -1,205 +0,0 @@ -#ifndef CAMERA_H -#define CAMERA_H -/* - pygame - Python Game Library - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -#include "pygame.h" -#include "doc/camera_doc.h" - -#if defined(__unix__) - #include - #include - #include - #include - #include - - #include /* low-level i/o */ - #include - #include - #include - #include - #include - #include - #include - - /* on freebsd there is no asm/types */ - #ifdef linux - #include /* for videodev2.h */ - #endif - - #include -#elif defined(__APPLE__) - #include - /* We support OSX 10.6 and below. */ - #if __MAC_OS_X_VERSION_MAX_ALLOWED <= 1060 - #define PYGAME_MAC_CAMERA_OLD 1 - #endif -#endif - -#if defined(PYGAME_MAC_CAMERA_OLD) - #include - #include - #include -#endif - -/* some constants used which are not defined on non-v4l machines. */ -#ifndef V4L2_PIX_FMT_RGB24 - #define V4L2_PIX_FMT_RGB24 'RGB3' -#endif -#ifndef V4L2_PIX_FMT_RGB444 - #define V4L2_PIX_FMT_RGB444 'R444' -#endif -#ifndef V4L2_PIX_FMT_YUYV - #define V4L2_PIX_FMT_YUYV 'YUYV' -#endif - -#define CLEAR(x) memset (&(x), 0, sizeof (x)) -#define SAT(c) if (c & (~255)) { if (c < 0) c = 0; else c = 255; } -#define SAT2(c) ((c) & (~255) ? ((c) < 0 ? 0 : 255) : (c)) -#define DEFAULT_WIDTH 640 -#define DEFAULT_HEIGHT 480 -#define RGB_OUT 1 -#define YUV_OUT 2 -#define HSV_OUT 4 -#define CAM_V4L 1 /* deprecated. the incomplete support in pygame was removed */ -#define CAM_V4L2 2 - -struct buffer { - void * start; - size_t length; -}; - -#if defined(__unix__) -typedef struct pgCameraObject { - PyObject_HEAD - char* device_name; - int camera_type; - unsigned long pixelformat; - unsigned int color_out; - struct buffer* buffers; - unsigned int n_buffers; - int width; - int height; - int size; - int hflip; - int vflip; - int brightness; - int fd; -} pgCameraObject; -#elif defined(PYGAME_MAC_CAMERA_OLD) -typedef struct pgCameraObject { - PyObject_HEAD - char* device_name; /* unique name of the device */ - OSType pixelformat; - unsigned int color_out; - SeqGrabComponent component; /* A type used by the Sequence Grabber API */ - SGChannel channel; /* Channel of the Sequence Grabber */ - GWorldPtr gworld; /* Pointer to the struct that holds the data of the captured image */ - Rect boundsRect; /* bounds of the image frame */ - long size; /* size of the image in our buffer to draw */ - int hflip; - int vflip; - short depth; - struct buffer pixels; - //struct buffer tmp_pixels /* place where the flipped image in temporarily stored if hflip or vflip is true.*/ -} pgCameraObject; - -#else -/* generic definition. -*/ - -typedef struct pgCameraObject { - PyObject_HEAD - char* device_name; - int camera_type; - unsigned long pixelformat; - unsigned int color_out; - struct buffer* buffers; - unsigned int n_buffers; - int width; - int height; - int size; - int hflip; - int vflip; - int brightness; - int fd; -} pgCameraObject; -#endif - -/* internal functions for colorspace conversion */ -void colorspace (SDL_Surface *src, SDL_Surface *dst, int cspace); -void rgb24_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); -void rgb444_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); -void rgb_to_yuv (const void* src, void* dst, int length, - unsigned long source, SDL_PixelFormat* format); -void rgb_to_hsv (const void* src, void* dst, int length, - unsigned long source, SDL_PixelFormat* format); -void yuyv_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); -void yuyv_to_yuv (const void* src, void* dst, int length, SDL_PixelFormat* format); -void uyvy_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format); -void uyvy_to_yuv (const void* src, void* dst, int length, SDL_PixelFormat* format); -void sbggr8_to_rgb (const void* src, void* dst, int width, int height, - SDL_PixelFormat* format); -void yuv420_to_rgb (const void* src, void* dst, int width, int height, - SDL_PixelFormat* format); -void yuv420_to_yuv (const void* src, void* dst, int width, int height, - SDL_PixelFormat* format); - -#if defined(__unix__) -/* internal functions specific to v4l2 */ -char** v4l2_list_cameras (int* num_devices); -int v4l2_get_control (int fd, int id, int *value); -int v4l2_set_control (int fd, int id, int value); -PyObject* v4l2_read_raw (pgCameraObject* self); -int v4l2_xioctl (int fd, int request, void *arg); -int v4l2_process_image (pgCameraObject* self, const void *image, - unsigned int buffer_size, SDL_Surface* surf); -int v4l2_query_buffer (pgCameraObject* self); -int v4l2_read_frame (pgCameraObject* self, SDL_Surface* surf); -int v4l2_stop_capturing (pgCameraObject* self); -int v4l2_start_capturing (pgCameraObject* self); -int v4l2_uninit_device (pgCameraObject* self); -int v4l2_init_mmap (pgCameraObject* self); -int v4l2_init_device (pgCameraObject* self); -int v4l2_close_device (pgCameraObject* self); -int v4l2_open_device (pgCameraObject* self); - -#elif defined(PYGAME_MAC_CAMERA_OLD) -/* internal functions specific to mac */ -char** mac_list_cameras(int* num_devices); -int mac_open_device (pgCameraObject* self); -int mac_init_device(pgCameraObject* self); -int mac_close_device (pgCameraObject* self); -int mac_start_capturing(pgCameraObject* self); -int mac_stop_capturing (pgCameraObject* self); - -int mac_get_control(pgCameraObject* self, int id, int* value); -int mac_set_control(pgCameraObject* self, int id, int value); - -PyObject* mac_read_raw(pgCameraObject *self); -int mac_read_frame(pgCameraObject* self, SDL_Surface* surf); -int mac_camera_idle(pgCameraObject* self); -int mac_copy_gworld_to_surface(pgCameraObject* self, SDL_Surface* surf); - -void flip_image(const void* image, void* flipped_image, int width, int height, - short depth, int hflip, int vflip); - -#endif - -#endif /* !CAMERA_H */ diff --git a/venv/Include/site/python3.9/pygame/fastevents.h b/venv/Include/site/python3.9/pygame/fastevents.h deleted file mode 100644 index 04098c3..0000000 --- a/venv/Include/site/python3.9/pygame/fastevents.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef _FASTEVENTS_H_ -#define _FASTEVENTS_H_ -/* - NET2 is a threaded, event based, network IO library for SDL. - Copyright (C) 2002 Bob Pendleton - - 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., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA - - If you do not wish to comply with the terms of the LGPL please - contact the author as other terms are available for a fee. - - Bob Pendleton - Bob@Pendleton.com -*/ - -#include "SDL.h" - -#ifdef __cplusplus -extern "C" { -#endif - - int FE_Init(void); // Initialize FE - void FE_Quit(void); // shutdown FE - - void FE_PumpEvents(void); // replacement for SDL_PumpEvents - int FE_PollEvent(SDL_Event *event); // replacement for SDL_PollEvent - int FE_WaitEvent(SDL_Event *event); // replacement for SDL_WaitEvent - int FE_PushEvent(SDL_Event *event); // replacement for SDL_PushEvent - - char *FE_GetError(void); // get the last error -#ifdef __cplusplus -} -#endif - -#endif diff --git a/venv/Include/site/python3.9/pygame/font.h b/venv/Include/site/python3.9/pygame/font.h deleted file mode 100644 index 9878435..0000000 --- a/venv/Include/site/python3.9/pygame/font.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef PGFONT_INTERNAL_H -#define PGFONT_INTERNAL_H - -#include - -/* test font initialization */ -#define FONT_INIT_CHECK() \ - if(!(*(int*)PyFONT_C_API[2])) \ - return RAISE(pgExc_SDLError, "font system not initialized") - -#include "include/pygame_font.h" - -#define PYGAMEAPI_FONT_NUMSLOTS 3 - -#endif /* ~PGFONT_INTERNAL_H */ diff --git a/venv/Include/site/python3.9/pygame/freetype.h b/venv/Include/site/python3.9/pygame/freetype.h deleted file mode 100644 index 2f75319..0000000 --- a/venv/Include/site/python3.9/pygame/freetype.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2009 Vicent Marti - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ -#ifndef _PYGAME_FREETYPE_INTERNAL_H_ -#define _PYGAME_FREETYPE_INTERNAL_H_ - -#define PGFT_PYGAME1_COMPAT -#define HAVE_PYGAME_SDL_VIDEO -#define HAVE_PYGAME_SDL_RWOPS - -#include "pgcompat.h" -#include "pgplatform.h" -#include - -#include -#include FT_FREETYPE_H -#include FT_CACHE_H -#include FT_XFREE86_H -#include FT_TRIGONOMETRY_H - -/********************************************************** - * Global module constants - **********************************************************/ - -/* Render styles */ -#define FT_STYLE_NORMAL 0x00 -#define FT_STYLE_STRONG 0x01 -#define FT_STYLE_OBLIQUE 0x02 -#define FT_STYLE_UNDERLINE 0x04 -#define FT_STYLE_WIDE 0x08 -#define FT_STYLE_DEFAULT 0xFF - -/* Bounding box modes */ -#define FT_BBOX_EXACT FT_GLYPH_BBOX_SUBPIXELS -#define FT_BBOX_EXACT_GRIDFIT FT_GLYPH_BBOX_GRIDFIT -#define FT_BBOX_PIXEL FT_GLYPH_BBOX_TRUNCATE -#define FT_BBOX_PIXEL_GRIDFIT FT_GLYPH_BBOX_PIXELS - -/* Rendering flags */ -#define FT_RFLAG_NONE (0) -#define FT_RFLAG_ANTIALIAS (1 << 0) -#define FT_RFLAG_AUTOHINT (1 << 1) -#define FT_RFLAG_VERTICAL (1 << 2) -#define FT_RFLAG_HINTED (1 << 3) -#define FT_RFLAG_KERNING (1 << 4) -#define FT_RFLAG_TRANSFORM (1 << 5) -#define FT_RFLAG_PAD (1 << 6) -#define FT_RFLAG_ORIGIN (1 << 7) -#define FT_RFLAG_UCS4 (1 << 8) -#define FT_RFLAG_USE_BITMAP_STRIKES (1 << 9) -#define FT_RFLAG_DEFAULTS (FT_RFLAG_HINTED | \ - FT_RFLAG_USE_BITMAP_STRIKES | \ - FT_RFLAG_ANTIALIAS) - - -#define FT_RENDER_NEWBYTEARRAY 0x0 -#define FT_RENDER_NEWSURFACE 0x1 -#define FT_RENDER_EXISTINGSURFACE 0x2 - -/********************************************************** - * Global module types - **********************************************************/ - -typedef struct _scale_s { - FT_UInt x, y; -} Scale_t; -typedef FT_Angle Angle_t; - -struct fontinternals_; -struct freetypeinstance_; - -typedef struct { - FT_Long font_index; - FT_Open_Args open_args; -} pgFontId; - -typedef struct { - PyObject_HEAD - pgFontId id; - PyObject *path; - int is_scalable; - int is_bg_col_set; - - Scale_t face_size; - FT_Int16 style; - FT_Int16 render_flags; - double strength; - double underline_adjustment; - FT_UInt resolution; - Angle_t rotation; - FT_Matrix transform; - FT_Byte fgcolor[4]; - FT_Byte bgcolor[4]; - - struct freetypeinstance_ *freetype; /* Personal reference */ - struct fontinternals_ *_internals; -} pgFontObject; - -#define pgFont_IS_ALIVE(o) \ - (((pgFontObject *)(o))->_internals != 0) - -/* import public API */ -#include "include/pygame_freetype.h" - -#define PYGAMEAPI_FREETYPE_NUMSLOTS 2 - -#endif /* ~_PYGAME_FREETYPE_INTERNAL_H_ */ diff --git a/venv/Include/site/python3.9/pygame/include/_pygame.h b/venv/Include/site/python3.9/pygame/include/_pygame.h deleted file mode 100644 index cb7f5a2..0000000 --- a/venv/Include/site/python3.9/pygame/include/_pygame.h +++ /dev/null @@ -1,649 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -#ifndef _PYGAME_H -#define _PYGAME_H - -/** This header file includes all the definitions for the - ** base pygame extensions. This header only requires - ** Python includes (and SDL.h for functions that use SDL types). - ** The reason for functions prototyped with #define's is - ** to allow for maximum Python portability. It also uses - ** Python as the runtime linker, which allows for late binding. - '' For more information on this style of development, read - ** the Python docs on this subject. - ** http://www.python.org/doc/current/ext/using-cobjects.html - ** - ** If using this to build your own derived extensions, - ** you'll see that the functions available here are mainly - ** used to help convert between python objects and SDL objects. - ** Since this library doesn't add a lot of functionality to - ** the SDL library, it doesn't need to offer a lot either. - ** - ** When initializing your extension module, you must manually - ** import the modules you want to use. (this is the part about - ** using python as the runtime linker). Each module has its - ** own import_xxx() routine. You need to perform this import - ** after you have initialized your own module, and before - ** you call any routines from that module. Since every module - ** in pygame does this, there are plenty of examples. - ** - ** The base module does include some useful conversion routines - ** that you are free to use in your own extension. - **/ - -#include "pgplatform.h" -#include - - -/* version macros (defined since version 1.9.5) */ -#define PG_MAJOR_VERSION 2 -#define PG_MINOR_VERSION 0 -#define PG_PATCH_VERSION 1 -#define PG_VERSIONNUM(MAJOR, MINOR, PATCH) (1000*(MAJOR) + 100*(MINOR) + (PATCH)) -#define PG_VERSION_ATLEAST(MAJOR, MINOR, PATCH) \ - (PG_VERSIONNUM(PG_MAJOR_VERSION, PG_MINOR_VERSION, PG_PATCH_VERSION) >= \ - PG_VERSIONNUM(MAJOR, MINOR, PATCH)) - -/* SDL 1.x/2.x and pygame 1.x/2.x - */ -#if defined(SDL_VERSION_ATLEAST) -#if (SDL_VERSION_ATLEAST(2, 0, 0)) -#define PG_API_VERSION 2 -#else /* SDL 1 */ -/* for now: allow pygame 2 to be compiled with SDL 1. */ -#define PG_API_VERSION 1 -#endif /* SDL 1 */ -#else /* NO SDL */ -#define PG_API_VERSION ((PG_MAJOR_VERSION == 1) ? 1 : 2) -#endif /* NO SDL */ - -#include "pgcompat.h" - - -/* Flag indicating a pg_buffer; used for assertions within callbacks */ -#ifndef NDEBUG -#define PyBUF_PYGAME 0x4000 -#endif -#define PyBUF_HAS_FLAG(f, F) (((f) & (F)) == (F)) - -/* Array information exchange struct C type; inherits from Py_buffer - * - * Pygame uses its own Py_buffer derived C struct as an internal representation - * of an imported array buffer. The extended Py_buffer allows for a - * per-instance release callback, - */ -typedef void (*pybuffer_releaseproc)(Py_buffer *); - -typedef struct pg_bufferinfo_s { - Py_buffer view; - PyObject *consumer; /* Input: Borrowed reference */ - pybuffer_releaseproc release_buffer; -} pg_buffer; - -#include "pgimport.h" - -/* - * BASE module - */ -#ifndef PYGAMEAPI_BASE_INTERNAL -#define pgExc_SDLError \ - ((PyObject *) \ - PYGAMEAPI_GET_SLOT(base, 0)) - -#define pg_RegisterQuit \ - (*(void (*)(void (*)(void))) \ - PYGAMEAPI_GET_SLOT(base, 1)) - -#define pg_IntFromObj \ - (*(int (*)(PyObject *, int *)) \ - PYGAMEAPI_GET_SLOT(base, 2)) - -#define pg_IntFromObjIndex \ - (*(int (*)(PyObject *, int, int *)) \ - PYGAMEAPI_GET_SLOT(base, 3)) - -#define pg_TwoIntsFromObj \ - (*(int (*)(PyObject *, int *, int *)) \ - PYGAMEAPI_GET_SLOT(base, 4)) - -#define pg_FloatFromObj \ - (*(int (*)(PyObject *, float *)) \ - PYGAMEAPI_GET_SLOT(base, 5)) - -#define pg_FloatFromObjIndex \ - (*(int (*)(PyObject *, int, float *)) \ - PYGAMEAPI_GET_SLOT(base, 6)) - -#define pg_TwoFloatsFromObj \ - (*(int (*)(PyObject *, float *, float *)) \ - PYGAMEAPI_GET_SLOT(base, 7)) - -#define pg_UintFromObj \ - (*(int (*)(PyObject *, Uint32 *)) \ - PYGAMEAPI_GET_SLOT(base, 8)) - -#define pg_UintFromObjIndex \ - (*(int (*)(PyObject *, int, Uint32 *)) \ - PYGAMEAPI_GET_SLOT(base, 9)) - -#define pgVideo_AutoQuit \ - (*(void (*)(void)) \ - PYGAMEAPI_GET_SLOT(base, 10)) - -#define pgVideo_AutoInit \ - (*(int (*)(void)) \ - PYGAMEAPI_GET_SLOT(base, 11)) - -#define pg_RGBAFromObj \ - (*(int (*)(PyObject *, Uint8 *)) \ - PYGAMEAPI_GET_SLOT(base, 12)) - -#define pgBuffer_AsArrayInterface \ - (*(PyObject * (*)(Py_buffer *)) \ - PYGAMEAPI_GET_SLOT(base, 13)) - -#define pgBuffer_AsArrayStruct \ - (*(PyObject * (*)(Py_buffer *)) \ - PYGAMEAPI_GET_SLOT(base, 14)) - -#define pgObject_GetBuffer \ - (*(int (*)(PyObject *, pg_buffer *, int)) \ - PYGAMEAPI_GET_SLOT(base, 15)) - -#define pgBuffer_Release \ - (*(void (*)(pg_buffer *)) \ - PYGAMEAPI_GET_SLOT(base, 16)) - -#define pgDict_AsBuffer \ - (*(int (*)(pg_buffer *, PyObject *, int)) \ - PYGAMEAPI_GET_SLOT(base, 17)) - -#define pgExc_BufferError \ - ((PyObject *) \ - PYGAMEAPI_GET_SLOT(base, 18)) - -#if PG_API_VERSION == 2 -#define pg_GetDefaultWindow \ - (*(SDL_Window * (*)(void)) \ - PYGAMEAPI_GET_SLOT(base, 19)) - -#define pg_SetDefaultWindow \ - (*(void (*)(SDL_Window *)) \ - PYGAMEAPI_GET_SLOT(base, 20)) - -#define pg_GetDefaultWindowSurface \ - (*(pgSurfaceObject * (*)(void)) \ - PYGAMEAPI_GET_SLOT(base, 21)) - -#define pg_SetDefaultWindowSurface \ - (*(void (*)(pgSurfaceObject *)) \ - PYGAMEAPI_GET_SLOT(base, 22)) - -#define pg_EnvShouldBlendAlphaSDL2 \ - (*(char * (*)(void)) \ - PYGAMEAPI_GET_SLOT(base, 23)) - -#endif /* PG_API_VERSION == 2 */ - -#define import_pygame_base() IMPORT_PYGAME_MODULE(base) -#endif /* ~PYGAMEAPI_BASE_INTERNAL */ - -/* - * RECT module - */ -#if !defined(SDL_VERSION_ATLEAST) || PG_API_VERSION == 1 -typedef struct { - int x, y; - int w, h; -} GAME_Rect; -#else /* SDL 2+ */ -typedef SDL_Rect GAME_Rect; -#endif /* SDL 2+ */ - -typedef struct { - PyObject_HEAD GAME_Rect r; - PyObject *weakreflist; -} pgRectObject; - -#define pgRect_AsRect(x) (((pgRectObject *)x)->r) -#ifndef PYGAMEAPI_RECT_INTERNAL -#define pgRect_Type \ - (*(PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(rect, 0)) - -#define pgRect_Check(x) \ - ((x)->ob_type == &pgRect_Type) -#define pgRect_New \ - (*(PyObject * (*)(SDL_Rect *)) \ - PYGAMEAPI_GET_SLOT(rect, 1)) - -#define pgRect_New4 \ - (*(PyObject * (*)(int, int, int, int)) \ - PYGAMEAPI_GET_SLOT(rect, 2)) - -#define pgRect_FromObject \ - (*(GAME_Rect * (*)(PyObject *, GAME_Rect *)) \ - PYGAMEAPI_GET_SLOT(rect, 3)) - -#define pgRect_Normalize (*(void (*)(GAME_Rect *)) PYGAMEAPI_GET_SLOT(rect, 4)) - -#define import_pygame_rect() IMPORT_PYGAME_MODULE(rect) -#endif /* ~PYGAMEAPI_RECT_INTERNAL */ - -/* - * CDROM module - */ - -typedef struct { - PyObject_HEAD int id; -} pgCDObject; - -#define pgCD_AsID(x) (((pgCDObject *)x)->id) -#ifndef PYGAMEAPI_CDROM_INTERNAL -#define pgCD_Type \ - (*(PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(cdrom, 0)) - -#define pgCD_Check(x) \ - ((x)->ob_type == &pgCD_Type) -#define pgCD_New \ - (*(PyObject * (*)(int)) \ - PYGAMEAPI_GET_SLOT(cdrom, 1)) - -#define import_pygame_cd() IMPORT_PYGAME_MODULE(cdrom) -#endif - -/* - * JOYSTICK module - */ -typedef struct pgJoystickObject { - PyObject_HEAD - int id; - SDL_Joystick *joy; - - /* Joysticks form an intrusive linked list. - * - * Note that we don't maintain refcounts for these so they are weakrefs from - * the Python side. - */ - struct pgJoystickObject *next; - struct pgJoystickObject *prev; -} pgJoystickObject; - -#define pgJoystick_AsID(x) (((pgJoystickObject *)x)->id) -#define pgJoystick_AsSDL(x) (((pgJoystickObject *)x)->joy) - -#ifndef PYGAMEAPI_JOYSTICK_INTERNAL -#define pgJoystick_Type \ - (*(PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(joystick, 0)) - -#define pgJoystick_Check(x) \ - ((x)->ob_type == &pgJoystick_Type) -#define pgJoystick_New \ - (*(PyObject * (*)(int)) \ - PYGAMEAPI_GET_SLOT(joystick, 1)) - -#define import_pygame_joystick() IMPORT_PYGAME_MODULE(joystick) -#endif - -/* - * DISPLAY module - */ - -#if defined(SDL_VERSION_ATLEAST) - -#if PG_API_VERSION == 2 -typedef struct { - Uint32 hw_available:1; - Uint32 wm_available:1; - Uint32 blit_hw:1; - Uint32 blit_hw_CC:1; - Uint32 blit_hw_A:1; - Uint32 blit_sw:1; - Uint32 blit_sw_CC:1; - Uint32 blit_sw_A:1; - Uint32 blit_fill:1; - Uint32 video_mem; - SDL_PixelFormat *vfmt; - SDL_PixelFormat vfmt_data; - int current_w; - int current_h; -} pg_VideoInfo; -#endif /* PG_API_VERSION == 2 */ - -typedef struct { -#if PG_API_VERSION == 1 - PyObject_HEAD SDL_VideoInfo info; -#else - PyObject_HEAD pg_VideoInfo info; -#endif -} pgVidInfoObject; - -#define pgVidInfo_AsVidInfo(x) (((pgVidInfoObject *)x)->info) -#endif /* defined(SDL_VERSION_ATLEAST) */ - -#ifndef PYGAMEAPI_DISPLAY_INTERNAL -#define pgVidInfo_Type \ - (*(PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(display, 0)) - -#define pgVidInfo_Check(x) \ - ((x)->ob_type == &pgVidInfo_Type) - -#if PG_API_VERSION == 1 -#define pgVidInfo_New \ - (*(PyObject * (*)(SDL_VideoInfo *)) \ - PYGAMEAPI_GET_SLOT(display, 1)) -#else -#define pgVidInfo_New \ - (*(PyObject * (*)(pg_VideoInfo *)) \ - PYGAMEAPI_GET_SLOT(display, 1)) -#endif - -#define import_pygame_display() IMPORT_PYGAME_MODULE(display) -#endif /* ~PYGAMEAPI_DISPLAY_INTERNAL */ - -/* - * SURFACE module - */ -struct pgSubSurface_Data; -struct SDL_Surface; - -typedef struct { - PyObject_HEAD struct SDL_Surface *surf; -#if PG_API_VERSION == 2 - int owner; -#endif /* PG_API_VERSION == 2 */ - struct pgSubSurface_Data *subsurface; /* ptr to subsurface data (if a - * subsurface)*/ - PyObject *weakreflist; - PyObject *locklist; - PyObject *dependency; -} pgSurfaceObject; -#define pgSurface_AsSurface(x) (((pgSurfaceObject *)x)->surf) - -#ifndef PYGAMEAPI_SURFACE_INTERNAL -#define pgSurface_Type \ - (*(PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(surface, 0)) - -#define pgSurface_Check(x) \ - (PyObject_IsInstance((x), (PyObject *) &pgSurface_Type)) -#if PG_API_VERSION == 1 -#define pgSurface_New \ - (*(pgSurfaceObject * (*)(SDL_Surface *)) \ - PYGAMEAPI_GET_SLOT(surface, 1)) - -#define pgSurface_SetSurface \ - (*(int (*)(pgSurfaceObject *, SDL_Surface *)) \ - PYGAMEAPI_GET_SLOT(surface, 3)) - -#else /* PG_API_VERSION == 2 */ -#define pgSurface_New2 \ - (*(pgSurfaceObject * (*)(SDL_Surface *, int)) \ - PYGAMEAPI_GET_SLOT(surface, 1)) - -#define pgSurface_SetSurface \ - (*(int (*)(pgSurfaceObject *, SDL_Surface *, int)) \ - PYGAMEAPI_GET_SLOT(surface, 3)) - -#endif /* PG_API_VERSION == 2 */ -#define pgSurface_Blit \ - (*(int (*)(pgSurfaceObject *, pgSurfaceObject *, GAME_Rect *, GAME_Rect *, int)) \ - PYGAMEAPI_GET_SLOT(surface, 2)) - -#define import_pygame_surface() \ - do { \ - IMPORT_PYGAME_MODULE(surface); \ - if (PyErr_Occurred() != NULL) \ - break; \ - IMPORT_PYGAME_MODULE(surflock); \ - } while (0) - -#if PG_API_VERSION == 2 -#define pgSurface_New(surface) pgSurface_New2((surface), 1) -#define pgSurface_NewNoOwn(surface) pgSurface_New2((surface), 0) -#endif /* PG_API_VERSION == 2 */ - -#endif /* ~PYGAMEAPI_SURFACE_INTERNAL */ - -/* - * SURFLOCK module - * auto imported/initialized by surface - */ -#ifndef PYGAMEAPI_SURFLOCK_INTERNAL -#define pgLifetimeLock_Type \ - (*(PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(surflock, 0)) - -#define pgLifetimeLock_Check(x) \ - ((x)->ob_type == &pgLifetimeLock_Type) - -#define pgSurface_Prep(x) \ - if ((x)->subsurface) \ - (*(*(void (*)(pgSurfaceObject *)) \ - PYGAMEAPI_GET_SLOT(surflock, 1)))(x) - -#define pgSurface_Unprep(x) \ - if ((x)->subsurface) \ - (*(*(void (*)(pgSurfaceObject *)) \ - PYGAMEAPI_GET_SLOT(surflock, 2)))(x) - -#define pgSurface_Lock \ - (*(int (*)(pgSurfaceObject *)) \ - PYGAMEAPI_GET_SLOT(surflock, 3)) - -#define pgSurface_Unlock \ - (*(int (*)(pgSurfaceObject *)) \ - PYGAMEAPI_GET_SLOT(surflock, 4)) - -#define pgSurface_LockBy \ - (*(int (*)(pgSurfaceObject *, PyObject *)) \ - PYGAMEAPI_GET_SLOT(surflock, 5)) - -#define pgSurface_UnlockBy \ - (*(int (*)(pgSurfaceObject *, PyObject *)) \ - PYGAMEAPI_GET_SLOT(surflock, 6)) - -#define pgSurface_LockLifetime \ - (*(PyObject * (*)(PyObject *, PyObject *)) \ - PYGAMEAPI_GET_SLOT(surflock, 7)) -#endif - -/* - * EVENT module - */ -typedef struct pgEventObject pgEventObject; - -#ifndef PYGAMEAPI_EVENT_INTERNAL -#define pgEvent_Type \ - (*(PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(event, 0)) - -#define pgEvent_Check(x) \ - ((x)->ob_type == &pgEvent_Type) - -#define pgEvent_New \ - (*(PyObject * (*)(SDL_Event *)) \ - PYGAMEAPI_GET_SLOT(event, 1)) - -#define pgEvent_New2 \ - (*(PyObject * (*)(int, PyObject *)) \ - PYGAMEAPI_GET_SLOT(event, 2)) - -#define pgEvent_FillUserEvent \ - (*(int (*)(pgEventObject *, SDL_Event *)) \ - PYGAMEAPI_GET_SLOT(event, 3)) - -#if PG_API_VERSION == 2 -#define pg_EnableKeyRepeat \ - (*(int (*)(int, int)) \ - PYGAMEAPI_GET_SLOT(event, 4)) - -#define pg_GetKeyRepeat \ - (*(void (*)(int *, int *)) \ - PYGAMEAPI_GET_SLOT(event, 5)) -#endif /* PG_API_VERSION == 2 */ - -#define import_pygame_event() IMPORT_PYGAME_MODULE(event) -#endif - -/* - * RWOBJECT module - * the rwobject are only needed for C side work, not accessable from python. - */ -#ifndef PYGAMEAPI_RWOBJECT_INTERNAL -#define pgRWops_FromObject \ - (*(SDL_RWops * (*)(PyObject *)) \ - PYGAMEAPI_GET_SLOT(rwobject, 0)) - -#define pgRWops_IsFileObject \ - (*(int (*)(SDL_RWops *)) \ - PYGAMEAPI_GET_SLOT(rwobject, 1)) - -#define pg_EncodeFilePath \ - (*(PyObject * (*)(PyObject *, PyObject *)) \ - PYGAMEAPI_GET_SLOT(rwobject, 2)) - -#define pg_EncodeString \ - (*(PyObject * (*)(PyObject *, const char *, const char *, PyObject *)) \ - PYGAMEAPI_GET_SLOT(rwobject, 3)) - -#define pgRWops_FromFileObject \ - (*(SDL_RWops * (*)(PyObject *)) \ - PYGAMEAPI_GET_SLOT(rwobject, 4)) - -#define pgRWops_ReleaseObject \ - (*(int (*)(SDL_RWops *)) \ - PYGAMEAPI_GET_SLOT(rwobject, 5)) - -#define import_pygame_rwobject() IMPORT_PYGAME_MODULE(rwobject) - -#endif - -/* - * PixelArray module - */ -#ifndef PYGAMEAPI_PIXELARRAY_INTERNAL -#define PyPixelArray_Type \ - ((PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(pixelarray, 0)) - -#define PyPixelArray_Check(x) \ - ((x)->ob_type == &PyPixelArray_Type) -#define PyPixelArray_New \ - (*(PyObject * (*)) \ - PYGAMEAPI_GET_SLOT(pixelarray, 1)) - -#define import_pygame_pixelarray() IMPORT_PYGAME_MODULE(pixelarray) -#endif /* PYGAMEAPI_PIXELARRAY_INTERNAL */ - -/* - * Color module - */ -typedef struct pgColorObject pgColorObject; - -#ifndef PYGAMEAPI_COLOR_INTERNAL -#define pgColor_Type (*(PyObject *) \ - PYGAMEAPI_GET_SLOT(color, 0)) - -#define pgColor_Check(x) \ - ((x)->ob_type == &pgColor_Type) -#define pgColor_New \ - (*(PyObject * (*)(Uint8 *)) \ - PYGAMEAPI_GET_SLOT(color, 1)) - -#define pgColor_NewLength \ - (*(PyObject * (*)(Uint8 *, Uint8)) \ - PYGAMEAPI_GET_SLOT(color, 3)) - -#define pg_RGBAFromColorObj \ - (*(int (*)(PyObject *, Uint8 *)) \ - PYGAMEAPI_GET_SLOT(color, 2)) - -#define pg_RGBAFromFuzzyColorObj \ - (*(int (*)(PyObject *, Uint8 *)) \ - PYGAMEAPI_GET_SLOT(color, 4)) - -#define pgColor_AsArray(x) (((pgColorObject *)x)->data) -#define pgColor_NumComponents(x) (((pgColorObject *)x)->len) - - -#define import_pygame_color() IMPORT_PYGAME_MODULE(color) -#endif /* PYGAMEAPI_COLOR_INTERNAL */ - -/* - * Math module - */ -#ifndef PYGAMEAPI_MATH_INTERNAL -#define pgVector2_Check(x) \ - ((x)->ob_type == (PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(math, 0)) - -#define pgVector3_Check(x) \ - ((x)->ob_type == (PyTypeObject *) \ - PYGAMEAPI_GET_SLOT(math, 1)) -/* -#define pgVector2_New \ - (*(PyObject*(*)) \ - PYGAMEAPI_GET_SLOT(PyGAME_C_API, 1)) -*/ -#define import_pygame_math() IMPORT_PYGAME_MODULE(math) -#endif /* PYGAMEAPI_MATH_INTERNAL */ - -#define IMPORT_PYGAME_MODULE _IMPORT_PYGAME_MODULE - -/* - * base pygame API slots - * disable slots with NO_PYGAME_C_API - */ -#ifdef PYGAME_H -PYGAMEAPI_DEFINE_SLOTS(base); -PYGAMEAPI_DEFINE_SLOTS(rect); -PYGAMEAPI_DEFINE_SLOTS(cdrom); -PYGAMEAPI_DEFINE_SLOTS(joystick); -PYGAMEAPI_DEFINE_SLOTS(display); -PYGAMEAPI_DEFINE_SLOTS(surface); -PYGAMEAPI_DEFINE_SLOTS(surflock); -PYGAMEAPI_DEFINE_SLOTS(event); -PYGAMEAPI_DEFINE_SLOTS(rwobject); -PYGAMEAPI_DEFINE_SLOTS(pixelarray); -PYGAMEAPI_DEFINE_SLOTS(color); -PYGAMEAPI_DEFINE_SLOTS(math); -#else /* ~PYGAME_H */ -PYGAMEAPI_EXTERN_SLOTS(base); -PYGAMEAPI_EXTERN_SLOTS(rect); -PYGAMEAPI_EXTERN_SLOTS(cdrom); -PYGAMEAPI_EXTERN_SLOTS(joystick); -PYGAMEAPI_EXTERN_SLOTS(display); -PYGAMEAPI_EXTERN_SLOTS(surface); -PYGAMEAPI_EXTERN_SLOTS(surflock); -PYGAMEAPI_EXTERN_SLOTS(event); -PYGAMEAPI_EXTERN_SLOTS(rwobject); -PYGAMEAPI_EXTERN_SLOTS(pixelarray); -PYGAMEAPI_EXTERN_SLOTS(color); -PYGAMEAPI_EXTERN_SLOTS(math); -#endif /* ~PYGAME_H */ - -#endif /* PYGAME_H */ diff --git a/venv/Include/site/python3.9/pygame/include/bitmask.h b/venv/Include/site/python3.9/pygame/include/bitmask.h deleted file mode 100644 index d95297e..0000000 --- a/venv/Include/site/python3.9/pygame/include/bitmask.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - Bitmask 1.7 - A pixel-perfect collision detection library. - - Copyright (C) 2002-2005 Ulf Ekstrom except for the bitcount - function which is copyright (C) Donald W. Gillies, 1992. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef BITMASK_H -#define BITMASK_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -/* Define INLINE for different compilers. If your compiler does not - support inlining then there might be a performance hit in - bitmask_overlap_area(). -*/ -#ifndef INLINE -# ifdef __GNUC__ -# define INLINE inline -# else -# ifdef _MSC_VER -# define INLINE __inline -# else -# define INLINE -# endif -# endif -#endif - -#define BITMASK_W unsigned long int -#define BITMASK_W_LEN (sizeof(BITMASK_W)*CHAR_BIT) -#define BITMASK_W_MASK (BITMASK_W_LEN - 1) -#define BITMASK_N(n) ((BITMASK_W)1 << (n)) - -typedef struct bitmask -{ - int w,h; - BITMASK_W bits[1]; -} bitmask_t; - -/* Creates a bitmask of width w and height h, where - w and h must both be greater than or equal to 0. - The mask is automatically cleared when created. - */ -bitmask_t *bitmask_create(int w, int h); - -/* Frees all the memory allocated by bitmask_create for m. */ -void bitmask_free(bitmask_t *m); - -/* Create a copy of the given bitmask. */ -bitmask_t *bitmask_copy(bitmask_t *m); - -/* Clears all bits in the mask */ -void bitmask_clear(bitmask_t *m); - -/* Sets all bits in the mask */ -void bitmask_fill(bitmask_t *m); - -/* Flips all bits in the mask */ -void bitmask_invert(bitmask_t *m); - -/* Counts the bits in the mask */ -unsigned int bitmask_count(bitmask_t *m); - -/* Returns nonzero if the bit at (x,y) is set. Coordinates start at - (0,0) */ -static INLINE int bitmask_getbit(const bitmask_t *m, int x, int y) -{ - return (m->bits[x/BITMASK_W_LEN*m->h + y] & BITMASK_N(x & BITMASK_W_MASK)) != 0; -} - -/* Sets the bit at (x,y) */ -static INLINE void bitmask_setbit(bitmask_t *m, int x, int y) -{ - m->bits[x/BITMASK_W_LEN*m->h + y] |= BITMASK_N(x & BITMASK_W_MASK); -} - -/* Clears the bit at (x,y) */ -static INLINE void bitmask_clearbit(bitmask_t *m, int x, int y) -{ - m->bits[x/BITMASK_W_LEN*m->h + y] &= ~BITMASK_N(x & BITMASK_W_MASK); -} - -/* Returns nonzero if the masks overlap with the given offset. - The overlap tests uses the following offsets (which may be negative): - - +----+----------.. - |A | yoffset - | +-+----------.. - +--|B - |xoffset - | | - : : -*/ -int bitmask_overlap(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); - -/* Like bitmask_overlap(), but will also give a point of intersection. - x and y are given in the coordinates of mask a, and are untouched - if there is no overlap. */ -int bitmask_overlap_pos(const bitmask_t *a, const bitmask_t *b, - int xoffset, int yoffset, int *x, int *y); - -/* Returns the number of overlapping 'pixels' */ -int bitmask_overlap_area(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); - -/* Fills a mask with the overlap of two other masks. A bitwise AND. */ -void bitmask_overlap_mask (const bitmask_t *a, const bitmask_t *b, bitmask_t *c, int xoffset, int yoffset); - -/* Draws mask b onto mask a (bitwise OR). Can be used to compose large - (game background?) mask from several submasks, which may speed up - the testing. */ - -void bitmask_draw(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); - -void bitmask_erase(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset); - -/* Return a new scaled bitmask, with dimensions w*h. The quality of the - scaling may not be perfect for all circumstances, but it should - be reasonable. If either w or h is 0 a clear 1x1 mask is returned. */ -bitmask_t *bitmask_scale(const bitmask_t *m, int w, int h); - -/* Convolve b into a, drawing the output into o, shifted by offset. If offset - * is 0, then the (x,y) bit will be set if and only if - * bitmask_overlap(a, b, x - b->w - 1, y - b->h - 1) returns true. - * - * Modifies bits o[xoffset ... xoffset + a->w + b->w - 1) - * [yoffset ... yoffset + a->h + b->h - 1). */ -void bitmask_convolve(const bitmask_t *a, const bitmask_t *b, bitmask_t *o, int xoffset, int yoffset); - -#ifdef __cplusplus -} /* End of extern "C" { */ -#endif - -#endif diff --git a/venv/Include/site/python3.9/pygame/include/pgcompat.h b/venv/Include/site/python3.9/pygame/include/pgcompat.h deleted file mode 100644 index 2ba1b6b..0000000 --- a/venv/Include/site/python3.9/pygame/include/pgcompat.h +++ /dev/null @@ -1,180 +0,0 @@ -/* Python 2.x/3.x and SDL compatibility tools - */ - -#if !defined(PGCOMPAT_H) -#define PGCOMPAT_H - -#include - -/* Cobjects vanish in Python 3.2; so we will code as though we use capsules */ -#if defined(Py_CAPSULE_H) -#define PG_HAVE_CAPSULE 1 -#else -#define PG_HAVE_CAPSULE 0 -#endif -#if defined(Py_COBJECT_H) -#define PG_HAVE_COBJECT 1 -#else -#define PG_HAVE_COBJECT 0 -#endif -#if !PG_HAVE_CAPSULE -#define PyCapsule_New(ptr, n, dfn) PyCObject_FromVoidPtr(ptr, dfn) -#define PyCapsule_GetPointer(obj, n) PyCObject_AsVoidPtr(obj) -#define PyCapsule_CheckExact(obj) PyCObject_Check(obj) -#endif - -/* Pygame uses Py_buffer (PEP 3118) to exchange array information internally; - * define here as needed. - */ -#if !defined(PyBUF_SIMPLE) -typedef struct bufferinfo { - void *buf; - PyObject *obj; - Py_ssize_t len; - Py_ssize_t itemsize; - int readonly; - int ndim; - char *format; - Py_ssize_t *shape; - Py_ssize_t *strides; - Py_ssize_t *suboffsets; - void *internal; -} Py_buffer; - -/* Flags for getting buffers */ -#define PyBUF_SIMPLE 0 -#define PyBUF_WRITABLE 0x0001 -/* we used to include an E, backwards compatible alias */ -#define PyBUF_WRITEABLE PyBUF_WRITABLE -#define PyBUF_FORMAT 0x0004 -#define PyBUF_ND 0x0008 -#define PyBUF_STRIDES (0x0010 | PyBUF_ND) -#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) -#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) -#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) -#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) - -#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE) -#define PyBUF_CONTIG_RO (PyBUF_ND) - -#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE) -#define PyBUF_STRIDED_RO (PyBUF_STRIDES) - -#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT) -#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT) - -#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT) -#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT) - -#define PyBUF_READ 0x100 -#define PyBUF_WRITE 0x200 -#define PyBUF_SHADOW 0x400 - -typedef int(*getbufferproc)(PyObject *, Py_buffer *, int); -typedef void(*releasebufferproc)(Py_buffer *); -#endif /* ~defined(PyBUF_SIMPLE) */ - -/* define common types where SDL is not included */ -#ifndef SDL_VERSION_ATLEAST -#ifdef _MSC_VER -typedef unsigned __int8 uint8_t; -typedef unsigned __int32 uint32_t; -#else -#include -#endif -typedef uint32_t Uint32; -typedef uint8_t Uint8; -#endif /* no SDL */ - - -#if defined(SDL_VERSION_ATLEAST) - -#ifndef SDL_WINDOW_VULKAN -#define SDL_WINDOW_VULKAN 0 -#endif - -#ifndef SDL_WINDOW_ALWAYS_ON_TOP -#define SDL_WINDOW_ALWAYS_ON_TOP 0 -#endif - -#ifndef SDL_WINDOW_SKIP_TASKBAR -#define SDL_WINDOW_SKIP_TASKBAR 0 -#endif - -#ifndef SDL_WINDOW_UTILITY -#define SDL_WINDOW_UTILITY 0 -#endif - -#ifndef SDL_WINDOW_TOOLTIP -#define SDL_WINDOW_TOOLTIP 0 -#endif - -#ifndef SDL_WINDOW_POPUP_MENU -#define SDL_WINDOW_POPUP_MENU 0 -#endif - - -#ifndef SDL_WINDOW_INPUT_GRABBED -#define SDL_WINDOW_INPUT_GRABBED 0 -#endif - -#ifndef SDL_WINDOW_INPUT_FOCUS -#define SDL_WINDOW_INPUT_FOCUS 0 -#endif - -#ifndef SDL_WINDOW_MOUSE_FOCUS -#define SDL_WINDOW_MOUSE_FOCUS 0 -#endif - -#ifndef SDL_WINDOW_FOREIGN -#define SDL_WINDOW_FOREIGN 0 -#endif - -#ifndef SDL_WINDOW_ALLOW_HIGHDPI -#define SDL_WINDOW_ALLOW_HIGHDPI 0 -#endif - -#ifndef SDL_WINDOW_MOUSE_CAPTURE -#define SDL_WINDOW_MOUSE_CAPTURE 0 -#endif - -#ifndef SDL_WINDOW_ALWAYS_ON_TOP -#define SDL_WINDOW_ALWAYS_ON_TOP 0 -#endif - -#ifndef SDL_WINDOW_SKIP_TASKBAR -#define SDL_WINDOW_SKIP_TASKBAR 0 -#endif - -#ifndef SDL_WINDOW_UTILITY -#define SDL_WINDOW_UTILITY 0 -#endif - -#ifndef SDL_WINDOW_TOOLTIP -#define SDL_WINDOW_TOOLTIP 0 -#endif - -#ifndef SDL_WINDOW_POPUP_MENU -#define SDL_WINDOW_POPUP_MENU 0 -#endif - -#if SDL_VERSION_ATLEAST(2, 0, 4) -/* To control the use of: - * SDL_AUDIODEVICEADDED - * SDL_AUDIODEVICEREMOVED - * - * Ref: https://wiki.libsdl.org/SDL_EventType - * Ref: https://wiki.libsdl.org/SDL_AudioDeviceEvent - */ -#define SDL2_AUDIODEVICE_SUPPORTED -#endif - -#ifndef SDL_MOUSEWHEEL_FLIPPED -#define NO_SDL_MOUSEWHEEL_FLIPPED -#endif - - -#endif /* defined(SDL_VERSION_ATLEAST) */ - - -#endif /* ~defined(PGCOMPAT_H) */ diff --git a/venv/Include/site/python3.9/pygame/include/pgimport.h b/venv/Include/site/python3.9/pygame/include/pgimport.h deleted file mode 100644 index 6649865..0000000 --- a/venv/Include/site/python3.9/pygame/include/pgimport.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef PGIMPORT_H -#define PGIMPORT_H - -/* Prefix when initializing module */ -#define MODPREFIX "" -/* Prefix when importing module */ -#define IMPPREFIX "pygame." - -#ifdef __SYMBIAN32__ - -/* On Symbian there is no pygame package. The extensions are built-in or in - * sys\bin. */ -#undef MODPREFIX -#undef IMPPREFIX -#define MODPREFIX "pygame_" -#define IMPPREFIX "pygame_" - -#endif /* __SYMBIAN32__ */ - -#include "pgcompat.h" - -#define PYGAMEAPI_LOCAL_ENTRY "_PYGAME_C_API" -#define PG_CAPSULE_NAME(m) (IMPPREFIX m "." PYGAMEAPI_LOCAL_ENTRY) - -/* - * fill API slots defined by PYGAMEAPI_DEFINE_SLOTS/PYGAMEAPI_EXTERN_SLOTS - */ -#define _IMPORT_PYGAME_MODULE(module) \ - { \ - PyObject *_mod_##module = PyImport_ImportModule(IMPPREFIX #module); \ - \ - if (_mod_##module != NULL) { \ - PyObject *_c_api = \ - PyObject_GetAttrString(_mod_##module, PYGAMEAPI_LOCAL_ENTRY);\ - \ - Py_DECREF(_mod_##module); \ - if (_c_api != NULL && PyCapsule_CheckExact(_c_api)) { \ - void **localptr = (void **)PyCapsule_GetPointer( \ - _c_api, PG_CAPSULE_NAME(#module)); \ - _PGSLOTS_ ## module = localptr; \ - } \ - Py_XDECREF(_c_api); \ - } \ - } - -#define PYGAMEAPI_IS_IMPORTED(module) (_PGSLOTS_ ## module != NULL) - -/* - * source file must include one of these in order to use _IMPORT_PYGAME_MODULE. - * this is set by import_pygame_*() functions. - * disable with NO_PYGAME_C_API - */ -#define PYGAMEAPI_DEFINE_SLOTS(module) \ - void ** _PGSLOTS_ ## module = NULL -#define PYGAMEAPI_EXTERN_SLOTS(module) \ - extern void **_PGSLOTS_ ## module -#define PYGAMEAPI_GET_SLOT(module, index) \ - _PGSLOTS_ ## module [(index)] - -/* - * disabled API with NO_PYGAME_C_API; do nothing instead - */ -#ifdef NO_PYGAME_C_API - -#undef PYGAMEAPI_DEFINE_SLOTS -#undef PYGAMEAPI_EXTERN_SLOTS - -#define PYGAMEAPI_DEFINE_SLOTS(module) -#define PYGAMEAPI_EXTERN_SLOTS(module) - -/* intentionally leave this defined to cause a compiler error * -#define PYGAMEAPI_GET_SLOT(api_root, index) -#undef PYGAMEAPI_GET_SLOT*/ - -#undef _IMPORT_PYGAME_MODULE -#define _IMPORT_PYGAME_MODULE(module) - -#endif /* NO_PYGAME_C_API */ - -#endif /* ~PGIMPORT_H */ diff --git a/venv/Include/site/python3.9/pygame/include/pgplatform.h b/venv/Include/site/python3.9/pygame/include/pgplatform.h deleted file mode 100644 index 659ea62..0000000 --- a/venv/Include/site/python3.9/pygame/include/pgplatform.h +++ /dev/null @@ -1,91 +0,0 @@ -/* platform/compiler adjustments */ -#ifndef PG_PLATFORM_H -#define PG_PLATFORM_H - -#if defined(HAVE_SNPRINTF) /* defined in python.h (pyerrors.h) and SDL.h \ - (SDL_config.h) */ -#undef HAVE_SNPRINTF /* remove GCC redefine warning */ -#endif /* HAVE_SNPRINTF */ - -#ifndef PG_INLINE -#if defined(__clang__) -#define PG_INLINE __inline__ __attribute__((__unused__)) -#elif defined(__GNUC__) -#define PG_INLINE __inline__ -#elif defined(_MSC_VER) -#define PG_INLINE __inline -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#define PG_INLINE inline -#else -#define PG_INLINE -#endif -#endif /* ~PG_INLINE */ - -// Worth trying this on MSVC/win32 builds to see if provides any speed up -#ifndef PG_FORCEINLINE -#if defined(__clang__) -#define PG_FORCEINLINE __inline__ __attribute__((__unused__)) -#elif defined(__GNUC__) -#define PG_FORCEINLINE __inline__ -#elif defined(_MSC_VER) -#define PG_FORCEINLINE __forceinline -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#define PG_FORCEINLINE inline -#else -#define PG_FORCEINLINE -#endif -#endif /* ~PG_FORCEINLINE */ - -/* This is unconditionally defined in Python.h */ -#if defined(_POSIX_C_SOURCE) -#undef _POSIX_C_SOURCE -#endif - -/* No signal() */ -#if defined(__SYMBIAN32__) && defined(HAVE_SIGNAL_H) -#undef HAVE_SIGNAL_H -#endif - -#if defined(HAVE_SNPRINTF) -#undef HAVE_SNPRINTF -#endif - -/* SDL needs WIN32 */ -#if !defined(WIN32) && \ - (defined(MS_WIN32) || defined(_WIN32) || \ - defined(__WIN32) || defined(__WIN32__) || defined(_WINDOWS)) -#define WIN32 -#endif - -/* Commenting out SSE4_2 stuff because it does not do runtime detection. -#ifndef PG_TARGET_SSE4_2 -#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 9) || __GNUC__ >= 5 )) -//The old gcc 4.8 on centos used by manylinux1 does not seem to get sse4.2 intrinsics -#define PG_FUNCTION_TARGET_SSE4_2 __attribute__((target("sse4.2"))) -// No else; we define the fallback later -#endif -#endif -*/ -/* ~PG_TARGET_SSE4_2 */ - -/* -#ifdef PG_FUNCTION_TARGET_SSE4_2 -#if !defined(__SSE4_2__) && !defined(PG_COMPILE_SSE4_2) -#if defined(__x86_64__) || defined(__i386__) -#define PG_COMPILE_SSE4_2 1 -#endif -#endif -#endif -*/ -/* ~PG_TARGET_SSE4_2 */ - -/* Fallback definition of target attribute */ -#ifndef PG_FUNCTION_TARGET_SSE4_2 -#define PG_FUNCTION_TARGET_SSE4_2 -#endif - -#ifndef PG_COMPILE_SSE4_2 -#define PG_COMPILE_SSE4_2 0 -#endif - -#endif /* ~PG_PLATFORM_H */ diff --git a/venv/Include/site/python3.9/pygame/include/pygame.h b/venv/Include/site/python3.9/pygame/include/pygame.h deleted file mode 100644 index bcbf1d9..0000000 --- a/venv/Include/site/python3.9/pygame/include/pygame.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -/* To allow the Pygame C api to be globally shared by all code within an - * extension module built from multiple C files, only include the pygame.h - * header within the top level C file, the one which calls the - * 'import_pygame_*' macros. All other C source files of the module should - * include _pygame.h instead. - */ -#ifndef PYGAME_H -#define PYGAME_H - -#include "_pygame.h" - -#endif diff --git a/venv/Include/site/python3.9/pygame/include/pygame_bufferproxy.h b/venv/Include/site/python3.9/pygame/include/pygame_bufferproxy.h deleted file mode 100644 index d7c4ac6..0000000 --- a/venv/Include/site/python3.9/pygame/include/pygame_bufferproxy.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - Copyright (C) 2007 Rene Dudfield, Richard Goedeken - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -/* Bufferproxy module C api. */ -#if !defined(PG_BUFPROXY_HEADER) -#define PG_BUFPROXY_HEADER - -#include - -typedef PyObject *(*_pgbufproxy_new_t)(PyObject *, getbufferproc); -typedef PyObject *(*_pgbufproxy_get_obj_t)(PyObject *); -typedef int (*_pgbufproxy_trip_t)(PyObject *); - -#ifndef PYGAMEAPI_BUFPROXY_INTERNAL - -#include "pgimport.h" - -PYGAMEAPI_DEFINE_SLOTS(bufferproxy); - -#define pgBufproxy_Type (*(PyTypeObject*) \ - PYGAMEAPI_GET_SLOT(bufferproxy, 0) ) - -#define pgBufproxy_Check(x) ((x)->ob_type == &pgBufproxy_Type) - -#define pgBufproxy_New (*(_pgbufproxy_new_t) \ - PYGAMEAPI_GET_SLOT(bufferproxy, 1)) - -#define pgBufproxy_GetParent \ - (*(_pgbufproxy_get_obj_t) \ - PYGAMEAPI_GET_SLOT(bufferproxy, 2)) - -#define pgBufproxy_Trip (*(_pgbufproxy_trip_t) \ - PYGAMEAPI_GET_SLOT(bufferproxy, 3)) - -#define import_pygame_bufferproxy() _IMPORT_PYGAME_MODULE(bufferproxy) - -#endif /* ~PYGAMEAPI_BUFPROXY_INTERNAL */ - -#endif /* ~defined(PG_BUFPROXY_HEADER) */ diff --git a/venv/Include/site/python3.9/pygame/include/pygame_font.h b/venv/Include/site/python3.9/pygame/include/pygame_font.h deleted file mode 100644 index 3fe4500..0000000 --- a/venv/Include/site/python3.9/pygame/include/pygame_font.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -#include -#include "pgplatform.h" - -struct TTF_Font; - -typedef struct { - PyObject_HEAD - TTF_Font* font; - PyObject* weakreflist; -} PyFontObject; -#define PyFont_AsFont(x) (((PyFontObject*)x)->font) - -#ifndef PYGAMEAPI_FONT_INTERNAL - -#include "pgimport.h" - -PYGAMEAPI_DEFINE_SLOTS(font); - -#define PyFont_Type (*(PyTypeObject*) \ - PYGAMEAPI_GET_SLOT(font, 0)) -#define PyFont_Check(x) ((x)->ob_type == &PyFont_Type) - -#define PyFont_New (*(PyObject*(*)(TTF_Font*))\ - PYGAMEAPI_GET_SLOT(font, 1)) - -/*slot 2 taken by FONT_INIT_CHECK*/ - -#define import_pygame_font() _IMPORT_PYGAME_MODULE(font) - -#endif - diff --git a/venv/Include/site/python3.9/pygame/include/pygame_freetype.h b/venv/Include/site/python3.9/pygame/include/pygame_freetype.h deleted file mode 100644 index f727ee2..0000000 --- a/venv/Include/site/python3.9/pygame/include/pygame_freetype.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2009 Vicent Marti - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ -#ifndef PYGAME_FREETYPE_H_ -#define PYGAME_FREETYPE_H_ - -#include "pgplatform.h" -#include "pgimport.h" -#include "pgcompat.h" - -#ifndef PYGAME_FREETYPE_INTERNAL - -PYGAMEAPI_DEFINE_SLOTS(_freetype); - -#define pgFont_Type (*(PyTypeObject*) \ - PYGAMEAPI_GET_SLOT(_freetype, 0)) - -#define pgFont_Check(x) ((x)->ob_type == &pgFont_Type) - -#define pgFont_New (*(PyObject*(*)(const char*, long)) \ - PYGAMEAPI_GET_SLOT(_freetype, 1)) - -#define import_pygame_freetype() _IMPORT_PYGAME_MODULE(_freetype) - -#endif /* PYGAME_FREETYPE_INTERNAL */ - -#endif /* PYGAME_FREETYPE_H_ */ diff --git a/venv/Include/site/python3.9/pygame/include/pygame_mask.h b/venv/Include/site/python3.9/pygame/include/pygame_mask.h deleted file mode 100644 index 1b25553..0000000 --- a/venv/Include/site/python3.9/pygame/include/pygame_mask.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - pygame - Python Game Library - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef PGMASK_H -#define PGMASK_H - -#include -#include "bitmask.h" - -typedef struct { - PyObject_HEAD - bitmask_t *mask; - void *bufdata; -} pgMaskObject; - -#define pgMask_AsBitmap(x) (((pgMaskObject*)x)->mask) - -#ifndef PYGAMEAPI_MASK_INTERNAL - -#include "pgimport.h" - -PYGAMEAPI_DEFINE_SLOTS(mask); - -#define pgMask_Type (*(PyTypeObject*) \ - PYGAMEAPI_GET_SLOT(mask, 0)) -#define pgMask_Check(x) ((x)->ob_type == &pgMask_Type) - -#define import_pygame_mask() _IMPORT_PYGAME_MODULE(mask) - -#endif /* ~PYGAMEAPI_MASK_INTERNAL */ - -#endif /* ~PGMASK_H */ diff --git a/venv/Include/site/python3.9/pygame/include/pygame_mixer.h b/venv/Include/site/python3.9/pygame/include/pygame_mixer.h deleted file mode 100644 index 52e76ae..0000000 --- a/venv/Include/site/python3.9/pygame/include/pygame_mixer.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -#ifndef PGMIXER_H -#define PGMIXER_H - -#include -#include - -#include "pgcompat.h" - -struct Mix_Chunk; - -typedef struct { - PyObject_HEAD - Mix_Chunk *chunk; - Uint8 *mem; - PyObject *weakreflist; -} pgSoundObject; - -typedef struct { - PyObject_HEAD - int chan; -} pgChannelObject; - -#define pgSound_AsChunk(x) (((pgSoundObject*)x)->chunk) -#define pgChannel_AsInt(x) (((pgChannelObject*)x)->chan) - -#include "pgimport.h" - -#ifndef PYGAMEAPI_MIXER_INTERNAL - -PYGAMEAPI_DEFINE_SLOTS(mixer); - -#define pgSound_Type (*(PyTypeObject*) \ - PYGAMEAPI_GET_SLOT(mixer, 0)) - -#define pgSound_Check(x) ((x)->ob_type == &pgSound_Type) - -#define pgSound_New (*(PyObject*(*)(Mix_Chunk*)) \ - PYGAMEAPI_GET_SLOT(mixer, 1)) - -#define pgSound_Play (*(PyObject*(*)(PyObject*, PyObject*)) \ - PYGAMEAPI_GET_SLOT(mixer, 2)) - -#define pgChannel_Type (*(PyTypeObject*) \ - PYGAMEAPI_GET_SLOT(mixer, 3)) -#define pgChannel_Check(x) ((x)->ob_type == &pgChannel_Type) - -#define pgChannel_New (*(PyObject*(*)(int)) \ - PYGAMEAPI_GET_SLOT(mixer, 4)) - -#define pgMixer_AutoInit (*(PyObject*(*)(PyObject*, PyObject*)) \ - PYGAMEAPI_GET_SLOT(mixer, 5)) - -#define pgMixer_AutoQuit (*(void(*)(void)) \ - PYGAMEAPI_GET_SLOT(mixer, 6)) - -#define import_pygame_mixer() _IMPORT_PYGAME_MODULE(mixer) - -#endif /* PYGAMEAPI_MIXER_INTERNAL */ - -#endif /* ~PGMIXER_H */ diff --git a/venv/Include/site/python3.9/pygame/include/sse2neon.h b/venv/Include/site/python3.9/pygame/include/sse2neon.h deleted file mode 100644 index 7dbb4dd..0000000 --- a/venv/Include/site/python3.9/pygame/include/sse2neon.h +++ /dev/null @@ -1,3676 +0,0 @@ -#ifndef SSE2NEON_H -#define SSE2NEON_H - -// This header file provides a simple API translation layer -// between SSE intrinsics to their corresponding Arm/Aarch64 NEON versions -// -// This header file does not yet translate all of the SSE intrinsics. -// -// Contributors to this work are: -// John W. Ratcliff -// Brandon Rowlett -// Ken Fast -// Eric van Beurden -// Alexander Potylitsin -// Hasindu Gamaarachchi -// Jim Huang -// Mark Cheng -// Malcolm James MacLeod -// Devin Hussey (easyaspi314) -// Sebastian Pop - -/* - * The MIT license: - * - * 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. - */ - -#if defined(__GNUC__) || defined(__clang__) - -#pragma push_macro("FORCE_INLINE") -#pragma push_macro("ALIGN_STRUCT") -#define FORCE_INLINE static inline __attribute__((always_inline)) -#define ALIGN_STRUCT(x) __attribute__((aligned(x))) - -#else - -#error "Macro name collisions may happens with unknown compiler" -#ifdef FORCE_INLINE -#undef FORCE_INLINE -#endif -#define FORCE_INLINE static inline -#ifndef ALIGN_STRUCT -#define ALIGN_STRUCT(x) __declspec(align(x)) -#endif - -#endif - -#include -#include - -#include - -/** - * MACRO for shuffle parameter for _mm_shuffle_ps(). - * Argument fp3 is a digit[0123] that represents the fp from argument "b" - * of mm_shuffle_ps that will be placed in fp3 of result. fp2 is the same - * for fp2 in result. fp1 is a digit[0123] that represents the fp from - * argument "a" of mm_shuffle_ps that will be places in fp1 of result. - * fp0 is the same for fp0 of result. - */ -#define _MM_SHUFFLE(fp3, fp2, fp1, fp0) \ - (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0))) - -/* indicate immediate constant argument in a given range */ -#define __constrange(a, b) const - -typedef float32x2_t __m64; -typedef float32x4_t __m128; -typedef int64x2_t __m128i; - -// ****************************************** -// type-safe casting between types -// ****************************************** - -#define vreinterpretq_m128_f16(x) vreinterpretq_f32_f16(x) -#define vreinterpretq_m128_f32(x) (x) -#define vreinterpretq_m128_f64(x) vreinterpretq_f32_f64(x) - -#define vreinterpretq_m128_u8(x) vreinterpretq_f32_u8(x) -#define vreinterpretq_m128_u16(x) vreinterpretq_f32_u16(x) -#define vreinterpretq_m128_u32(x) vreinterpretq_f32_u32(x) -#define vreinterpretq_m128_u64(x) vreinterpretq_f32_u64(x) - -#define vreinterpretq_m128_s8(x) vreinterpretq_f32_s8(x) -#define vreinterpretq_m128_s16(x) vreinterpretq_f32_s16(x) -#define vreinterpretq_m128_s32(x) vreinterpretq_f32_s32(x) -#define vreinterpretq_m128_s64(x) vreinterpretq_f32_s64(x) - -#define vreinterpretq_f16_m128(x) vreinterpretq_f16_f32(x) -#define vreinterpretq_f32_m128(x) (x) -#define vreinterpretq_f64_m128(x) vreinterpretq_f64_f32(x) - -#define vreinterpretq_u8_m128(x) vreinterpretq_u8_f32(x) -#define vreinterpretq_u16_m128(x) vreinterpretq_u16_f32(x) -#define vreinterpretq_u32_m128(x) vreinterpretq_u32_f32(x) -#define vreinterpretq_u64_m128(x) vreinterpretq_u64_f32(x) - -#define vreinterpretq_s8_m128(x) vreinterpretq_s8_f32(x) -#define vreinterpretq_s16_m128(x) vreinterpretq_s16_f32(x) -#define vreinterpretq_s32_m128(x) vreinterpretq_s32_f32(x) -#define vreinterpretq_s64_m128(x) vreinterpretq_s64_f32(x) - -#define vreinterpretq_m128i_s8(x) vreinterpretq_s64_s8(x) -#define vreinterpretq_m128i_s16(x) vreinterpretq_s64_s16(x) -#define vreinterpretq_m128i_s32(x) vreinterpretq_s64_s32(x) -#define vreinterpretq_m128i_s64(x) (x) - -#define vreinterpretq_m128i_u8(x) vreinterpretq_s64_u8(x) -#define vreinterpretq_m128i_u16(x) vreinterpretq_s64_u16(x) -#define vreinterpretq_m128i_u32(x) vreinterpretq_s64_u32(x) -#define vreinterpretq_m128i_u64(x) vreinterpretq_s64_u64(x) - -#define vreinterpretq_s8_m128i(x) vreinterpretq_s8_s64(x) -#define vreinterpretq_s16_m128i(x) vreinterpretq_s16_s64(x) -#define vreinterpretq_s32_m128i(x) vreinterpretq_s32_s64(x) -#define vreinterpretq_s64_m128i(x) (x) - -#define vreinterpretq_u8_m128i(x) vreinterpretq_u8_s64(x) -#define vreinterpretq_u16_m128i(x) vreinterpretq_u16_s64(x) -#define vreinterpretq_u32_m128i(x) vreinterpretq_u32_s64(x) -#define vreinterpretq_u64_m128i(x) vreinterpretq_u64_s64(x) - -// A struct is defined in this header file called 'SIMDVec' which can be used -// by applications which attempt to access the contents of an _m128 struct -// directly. It is important to note that accessing the __m128 struct directly -// is bad coding practice by Microsoft: @see: -// https://msdn.microsoft.com/en-us/library/ayeb3ayc.aspx -// -// However, some legacy source code may try to access the contents of an __m128 -// struct directly so the developer can use the SIMDVec as an alias for it. Any -// casting must be done manually by the developer, as you cannot cast or -// otherwise alias the base NEON data type for intrinsic operations. -// -// union intended to allow direct access to an __m128 variable using the names -// that the MSVC compiler provides. This union should really only be used when -// trying to access the members of the vector as integer values. GCC/clang -// allow native access to the float members through a simple array access -// operator (in C since 4.6, in C++ since 4.8). -// -// Ideally direct accesses to SIMD vectors should not be used since it can cause -// a performance hit. If it really is needed however, the original __m128 -// variable can be aliased with a pointer to this union and used to access -// individual components. The use of this union should be hidden behind a macro -// that is used throughout the codebase to access the members instead of always -// declaring this type of variable. -typedef union ALIGN_STRUCT(16) SIMDVec { - float m128_f32[4]; // as floats - do not to use this. Added for convenience. - int8_t m128_i8[16]; // as signed 8-bit integers. - int16_t m128_i16[8]; // as signed 16-bit integers. - int32_t m128_i32[4]; // as signed 32-bit integers. - int64_t m128_i64[2]; // as signed 64-bit integers. - uint8_t m128_u8[16]; // as unsigned 8-bit integers. - uint16_t m128_u16[8]; // as unsigned 16-bit integers. - uint32_t m128_u32[4]; // as unsigned 32-bit integers. - uint64_t m128_u64[2]; // as unsigned 64-bit integers. -} SIMDVec; - -// casting using SIMDVec -#define vreinterpretq_nth_u64_m128i(x, n) (((SIMDVec *) &x)->m128_u64[n]) -#define vreinterpretq_nth_u32_m128i(x, n) (((SIMDVec *) &x)->m128_u32[n]) - - -// ****************************************** -// Backwards compatibility for compilers with lack of specific type support -// ****************************************** - -// Older gcc does not define vld1q_u8_x4 type -#if defined(__GNUC__) && !defined(__clang__) -#if __GNUC__ <= 9 -FORCE_INLINE uint8x16x4_t vld1q_u8_x4(const uint8_t *p) -{ - uint8x16x4_t ret; - ret.val[0] = vld1q_u8(p + 0); - ret.val[1] = vld1q_u8(p + 16); - ret.val[2] = vld1q_u8(p + 32); - ret.val[3] = vld1q_u8(p + 48); - return ret; -} -#endif -#endif - - -// ****************************************** -// Set/get methods -// ****************************************** - -// Loads one cache line of data from address p to a location closer to the -// processor. https://msdn.microsoft.com/en-us/library/84szxsww(v=vs.100).aspx -FORCE_INLINE void _mm_prefetch(const void *p, int i) -{ - (void)i; - __builtin_prefetch(p); -} - -// extracts the lower order floating point value from the parameter : -// https://msdn.microsoft.com/en-us/library/bb514059%28v=vs.120%29.aspx?f=255&MSPPError=-2147217396 -FORCE_INLINE float _mm_cvtss_f32(__m128 a) -{ - return vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); -} - -// Sets the 128-bit value to zero -// https://msdn.microsoft.com/en-us/library/vstudio/ys7dw0kh(v=vs.100).aspx -FORCE_INLINE __m128i _mm_setzero_si128(void) -{ - return vreinterpretq_m128i_s32(vdupq_n_s32(0)); -} - -// Clears the four single-precision, floating-point values. -// https://msdn.microsoft.com/en-us/library/vstudio/tk1t2tbz(v=vs.100).aspx -FORCE_INLINE __m128 _mm_setzero_ps(void) -{ - return vreinterpretq_m128_f32(vdupq_n_f32(0)); -} - -// Sets the four single-precision, floating-point values to w. -// -// r0 := r1 := r2 := r3 := w -// -// https://msdn.microsoft.com/en-us/library/vstudio/2x1se8ha(v=vs.100).aspx -FORCE_INLINE __m128 _mm_set1_ps(float _w) -{ - return vreinterpretq_m128_f32(vdupq_n_f32(_w)); -} - -// Sets the four single-precision, floating-point values to w. -// https://msdn.microsoft.com/en-us/library/vstudio/2x1se8ha(v=vs.100).aspx -FORCE_INLINE __m128 _mm_set_ps1(float _w) -{ - return vreinterpretq_m128_f32(vdupq_n_f32(_w)); -} - -// Sets the four single-precision, floating-point values to the four inputs. -// https://msdn.microsoft.com/en-us/library/vstudio/afh0zf75(v=vs.100).aspx -FORCE_INLINE __m128 _mm_set_ps(float w, float z, float y, float x) -{ - float __attribute__((aligned(16))) data[4] = {x, y, z, w}; - return vreinterpretq_m128_f32(vld1q_f32(data)); -} - -// Sets the four single-precision, floating-point values to the four inputs in -// reverse order. -// https://msdn.microsoft.com/en-us/library/vstudio/d2172ct3(v=vs.100).aspx -FORCE_INLINE __m128 _mm_setr_ps(float w, float z, float y, float x) -{ - float __attribute__((aligned(16))) data[4] = {w, z, y, x}; - return vreinterpretq_m128_f32(vld1q_f32(data)); -} - -// Sets the 8 signed 16-bit integer values in reverse order. -// -// Return Value -// r0 := w0 -// r1 := w1 -// ... -// r7 := w7 -FORCE_INLINE __m128i _mm_setr_epi16(short w0, - short w1, - short w2, - short w3, - short w4, - short w5, - short w6, - short w7) -{ - int16_t __attribute__((aligned(16))) - data[8] = {w0, w1, w2, w3, w4, w5, w6, w7}; - return vreinterpretq_m128i_s16(vld1q_s16((int16_t *) data)); -} - -// Sets the 4 signed 32-bit integer values in reverse order -// https://technet.microsoft.com/en-us/library/security/27yb3ee5(v=vs.90).aspx -FORCE_INLINE __m128i _mm_setr_epi32(int i3, int i2, int i1, int i0) -{ - int32_t __attribute__((aligned(16))) data[4] = {i3, i2, i1, i0}; - return vreinterpretq_m128i_s32(vld1q_s32(data)); -} - -// Sets the 16 signed 8-bit integer values to b. -// -// r0 := b -// r1 := b -// ... -// r15 := b -// -// https://msdn.microsoft.com/en-us/library/6e14xhyf(v=vs.100).aspx -FORCE_INLINE __m128i _mm_set1_epi8(signed char w) -{ - return vreinterpretq_m128i_s8(vdupq_n_s8(w)); -} - -// Sets the 8 signed 16-bit integer values to w. -// -// r0 := w -// r1 := w -// ... -// r7 := w -// -// https://msdn.microsoft.com/en-us/library/k0ya3x0e(v=vs.90).aspx -FORCE_INLINE __m128i _mm_set1_epi16(short w) -{ - return vreinterpretq_m128i_s16(vdupq_n_s16(w)); -} - -// Sets the 16 signed 8-bit integer values. -// https://msdn.microsoft.com/en-us/library/x0cx8zd3(v=vs.90).aspx -FORCE_INLINE __m128i _mm_set_epi8(signed char b15, - signed char b14, - signed char b13, - signed char b12, - signed char b11, - signed char b10, - signed char b9, - signed char b8, - signed char b7, - signed char b6, - signed char b5, - signed char b4, - signed char b3, - signed char b2, - signed char b1, - signed char b0) -{ - int8_t __attribute__((aligned(16))) - data[16] = {(int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3, - (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7, - (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11, - (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15}; - return (__m128i) vld1q_s8(data); -} - -// Sets the 8 signed 16-bit integer values. -// https://msdn.microsoft.com/en-au/library/3e0fek84(v=vs.90).aspx -FORCE_INLINE __m128i _mm_set_epi16(short i7, - short i6, - short i5, - short i4, - short i3, - short i2, - short i1, - short i0) -{ - int16_t __attribute__((aligned(16))) - data[8] = {i0, i1, i2, i3, i4, i5, i6, i7}; - return vreinterpretq_m128i_s16(vld1q_s16(data)); -} - -// Sets the 16 signed 8-bit integer values in reverse order. -// https://msdn.microsoft.com/en-us/library/2khb9c7k(v=vs.90).aspx -FORCE_INLINE __m128i _mm_setr_epi8(signed char b0, - signed char b1, - signed char b2, - signed char b3, - signed char b4, - signed char b5, - signed char b6, - signed char b7, - signed char b8, - signed char b9, - signed char b10, - signed char b11, - signed char b12, - signed char b13, - signed char b14, - signed char b15) -{ - int8_t __attribute__((aligned(16))) - data[16] = {(int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3, - (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7, - (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11, - (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15}; - return (__m128i) vld1q_s8(data); -} - -// Sets the 4 signed 32-bit integer values to i. -// -// r0 := i -// r1 := i -// r2 := i -// r3 := I -// -// https://msdn.microsoft.com/en-us/library/vstudio/h4xscxat(v=vs.100).aspx -FORCE_INLINE __m128i _mm_set1_epi32(int _i) -{ - return vreinterpretq_m128i_s32(vdupq_n_s32(_i)); -} - -// Sets the 2 signed 64-bit integer values to i. -// https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/whtfzhzk(v=vs.100) -FORCE_INLINE __m128i _mm_set1_epi64(int64_t _i) -{ - return vreinterpretq_m128i_s64(vdupq_n_s64(_i)); -} - -// Sets the 2 signed 64-bit integer values to i. -// https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_set1_epi64x&expand=4961 -FORCE_INLINE __m128i _mm_set1_epi64x(int64_t _i) -{ - return vreinterpretq_m128i_s64(vdupq_n_s64(_i)); -} - -// Sets the 4 signed 32-bit integer values. -// https://msdn.microsoft.com/en-us/library/vstudio/019beekt(v=vs.100).aspx -FORCE_INLINE __m128i _mm_set_epi32(int i3, int i2, int i1, int i0) -{ - int32_t __attribute__((aligned(16))) data[4] = {i0, i1, i2, i3}; - return vreinterpretq_m128i_s32(vld1q_s32(data)); -} - -// Returns the __m128i structure with its two 64-bit integer values -// initialized to the values of the two 64-bit integers passed in. -// https://msdn.microsoft.com/en-us/library/dk2sdw0h(v=vs.120).aspx -FORCE_INLINE __m128i _mm_set_epi64x(int64_t i1, int64_t i2) -{ - int64_t __attribute__((aligned(16))) data[2] = {i2, i1}; - return vreinterpretq_m128i_s64(vld1q_s64(data)); -} - -// Stores four single-precision, floating-point values. -// https://msdn.microsoft.com/en-us/library/vstudio/s3h4ay6y(v=vs.100).aspx -FORCE_INLINE void _mm_store_ps(float *p, __m128 a) -{ - vst1q_f32(p, vreinterpretq_f32_m128(a)); -} - -// Stores four single-precision, floating-point values. -// https://msdn.microsoft.com/en-us/library/44e30x22(v=vs.100).aspx -FORCE_INLINE void _mm_storeu_ps(float *p, __m128 a) -{ - vst1q_f32(p, vreinterpretq_f32_m128(a)); -} - -// Stores four 32-bit integer values as (as a __m128i value) at the address p. -// https://msdn.microsoft.com/en-us/library/vstudio/edk11s13(v=vs.100).aspx -FORCE_INLINE void _mm_store_si128(__m128i *p, __m128i a) -{ - vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a)); -} - -// Stores four 32-bit integer values as (as a __m128i value) at the address p. -// https://msdn.microsoft.com/en-us/library/vstudio/edk11s13(v=vs.100).aspx -FORCE_INLINE void _mm_storeu_si128(__m128i *p, __m128i a) -{ - vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a)); -} - -// Stores the lower single - precision, floating - point value. -// https://msdn.microsoft.com/en-us/library/tzz10fbx(v=vs.100).aspx -FORCE_INLINE void _mm_store_ss(float *p, __m128 a) -{ - vst1q_lane_f32(p, vreinterpretq_f32_m128(a), 0); -} - -// Reads the lower 64 bits of b and stores them into the lower 64 bits of a. -// https://msdn.microsoft.com/en-us/library/hhwf428f%28v=vs.90%29.aspx -FORCE_INLINE void _mm_storel_epi64(__m128i *a, __m128i b) -{ - uint64x1_t hi = vget_high_u64(vreinterpretq_u64_m128i(*a)); - uint64x1_t lo = vget_low_u64(vreinterpretq_u64_m128i(b)); - *a = vreinterpretq_m128i_u64(vcombine_u64(lo, hi)); -} - -// Stores the lower two single-precision floating point values of a to the -// address p. -// -// *p0 := a0 -// *p1 := a1 -// -// https://msdn.microsoft.com/en-us/library/h54t98ks(v=vs.90).aspx -FORCE_INLINE void _mm_storel_pi(__m64 *p, __m128 a) -{ - *p = vget_low_f32(a); -} - -// Stores the upper two single-precision, floating-point values of a to the -// address p. -// -// *p0 := a2 -// *p1 := a3 -// -// https://msdn.microsoft.com/en-us/library/a7525fs8(v%3dvs.90).aspx -FORCE_INLINE void _mm_storeh_pi(__m64 * p, __m128 a) -{ - *p = vget_high_f32(a); -} - -// Loads a single single-precision, floating-point value, copying it into all -// four words -// https://msdn.microsoft.com/en-us/library/vstudio/5cdkf716(v=vs.100).aspx -FORCE_INLINE __m128 _mm_load1_ps(const float *p) -{ - return vreinterpretq_m128_f32(vld1q_dup_f32(p)); -} -#define _mm_load_ps1 _mm_load1_ps - -// Sets the lower two single-precision, floating-point values with 64 -// bits of data loaded from the address p; the upper two values are passed -// through from a. -// -// Return Value -// r0 := *p0 -// r1 := *p1 -// r2 := a2 -// r3 := a3 -// -// https://msdn.microsoft.com/en-us/library/s57cyak2(v=vs.100).aspx -FORCE_INLINE __m128 _mm_loadl_pi(__m128 a, __m64 const *p) -{ - return vreinterpretq_m128_f32( - vcombine_f32(vld1_f32((const float32_t *) p), vget_high_f32(a))); -} - -// Sets the upper two single-precision, floating-point values with 64 -// bits of data loaded from the address p; the lower two values are passed -// through from a. -// -// r0 := a0 -// r1 := a1 -// r2 := *p0 -// r3 := *p1 -// -// https://msdn.microsoft.com/en-us/library/w92wta0x(v%3dvs.100).aspx -FORCE_INLINE __m128 _mm_loadh_pi(__m128 a, __m64 const *p) -{ - return vreinterpretq_m128_f32( - vcombine_f32(vget_low_f32(a), vld1_f32((const float32_t *) p))); -} - -// Loads four single-precision, floating-point values. -// https://msdn.microsoft.com/en-us/library/vstudio/zzd50xxt(v=vs.100).aspx -FORCE_INLINE __m128 _mm_load_ps(const float *p) -{ - return vreinterpretq_m128_f32(vld1q_f32(p)); -} - -// Loads four single-precision, floating-point values. -// https://msdn.microsoft.com/en-us/library/x1b16s7z%28v=vs.90%29.aspx -FORCE_INLINE __m128 _mm_loadu_ps(const float *p) -{ - // for neon, alignment doesn't matter, so _mm_load_ps and _mm_loadu_ps are - // equivalent for neon - return vreinterpretq_m128_f32(vld1q_f32(p)); -} - -// Loads an single - precision, floating - point value into the low word and -// clears the upper three words. -// https://msdn.microsoft.com/en-us/library/548bb9h4%28v=vs.90%29.aspx -FORCE_INLINE __m128 _mm_load_ss(const float *p) -{ - return vreinterpretq_m128_f32(vsetq_lane_f32(*p, vdupq_n_f32(0), 0)); -} - -FORCE_INLINE __m128i _mm_loadl_epi64(__m128i const *p) -{ - /* Load the lower 64 bits of the value pointed to by p into the - * lower 64 bits of the result, zeroing the upper 64 bits of the result. - */ - return vreinterpretq_m128i_s32(vcombine_s32(vld1_s32((int32_t const *) p), vcreate_s32(0))); -} - -// ****************************************** -// Logic/Binary operations -// ****************************************** - -// Compares for inequality. -// https://msdn.microsoft.com/en-us/library/sf44thbx(v=vs.100).aspx -FORCE_INLINE __m128 _mm_cmpneq_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_u32(vmvnq_u32( - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); -} - -// Computes the bitwise AND-NOT of the four single-precision, floating-point -// values of a and b. -// -// r0 := ~a0 & b0 -// r1 := ~a1 & b1 -// r2 := ~a2 & b2 -// r3 := ~a3 & b3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/68h7wd02(v=vs.100).aspx -FORCE_INLINE __m128 _mm_andnot_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_s32( - vbicq_s32(vreinterpretq_s32_m128(b), - vreinterpretq_s32_m128(a))); // *NOTE* argument swap -} - -// Computes the bitwise AND of the 128-bit value in b and the bitwise NOT of the -// 128-bit value in a. -// -// r := (~a) & b -// -// https://msdn.microsoft.com/en-us/library/vstudio/1beaceh8(v=vs.100).aspx -FORCE_INLINE __m128i _mm_andnot_si128(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s32( - vbicq_s32(vreinterpretq_s32_m128i(b), - vreinterpretq_s32_m128i(a))); // *NOTE* argument swap -} - -// Computes the bitwise AND of the 128-bit value in a and the 128-bit value in -// b. -// -// r := a & b -// -// https://msdn.microsoft.com/en-us/library/vstudio/6d1txsa8(v=vs.100).aspx -FORCE_INLINE __m128i _mm_and_si128(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s32( - vandq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Computes the bitwise AND of the four single-precision, floating-point values -// of a and b. -// -// r0 := a0 & b0 -// r1 := a1 & b1 -// r2 := a2 & b2 -// r3 := a3 & b3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/73ck1xc5(v=vs.100).aspx -FORCE_INLINE __m128 _mm_and_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_s32( - vandq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); -} - -// Computes the bitwise OR of the four single-precision, floating-point values -// of a and b. -// https://msdn.microsoft.com/en-us/library/vstudio/7ctdsyy0(v=vs.100).aspx -FORCE_INLINE __m128 _mm_or_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_s32( - vorrq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); -} - -// Computes bitwise EXOR (exclusive-or) of the four single-precision, -// floating-point values of a and b. -// https://msdn.microsoft.com/en-us/library/ss6k3wk8(v=vs.100).aspx -FORCE_INLINE __m128 _mm_xor_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_s32( - veorq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); -} - -// Computes the bitwise OR of the 128-bit value in a and the 128-bit value in b. -// -// r := a | b -// -// https://msdn.microsoft.com/en-us/library/vstudio/ew8ty0db(v=vs.100).aspx -FORCE_INLINE __m128i _mm_or_si128(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s32( - vorrq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Computes the bitwise XOR of the 128-bit value in a and the 128-bit value in -// b. https://msdn.microsoft.com/en-us/library/fzt08www(v=vs.100).aspx -FORCE_INLINE __m128i _mm_xor_si128(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s32( - veorq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Moves the upper two values of B into the lower two values of A. -// -// r3 := a3 -// r2 := a2 -// r1 := b3 -// r0 := b2 -FORCE_INLINE __m128 _mm_movehl_ps(__m128 __A, __m128 __B) -{ - float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(__A)); - float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(__B)); - return vreinterpretq_m128_f32(vcombine_f32(b32, a32)); -} - -// Moves the lower two values of B into the upper two values of A. -// -// r3 := b1 -// r2 := b0 -// r1 := a1 -// r0 := a0 -FORCE_INLINE __m128 _mm_movelh_ps(__m128 __A, __m128 __B) -{ - float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(__A)); - float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(__B)); - return vreinterpretq_m128_f32(vcombine_f32(a10, b10)); -} - -FORCE_INLINE __m128i _mm_abs_epi32(__m128i a) -{ - return vreinterpretq_m128i_s32(vabsq_s32(vreinterpretq_s32_m128i(a))); -} - -FORCE_INLINE __m128i _mm_abs_epi16(__m128i a) -{ - return vreinterpretq_m128i_s16(vabsq_s16(vreinterpretq_s16_m128i(a))); -} - -FORCE_INLINE __m128i _mm_abs_epi8(__m128i a) -{ - return vreinterpretq_m128i_s8(vabsq_s8(vreinterpretq_s8_m128i(a))); -} - -// Takes the upper 64 bits of a and places it in the low end of the result -// Takes the lower 64 bits of b and places it into the high end of the result. -FORCE_INLINE __m128 _mm_shuffle_ps_1032(__m128 a, __m128 b) -{ - float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); - float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); - return vreinterpretq_m128_f32(vcombine_f32(a32, b10)); -} - -// takes the lower two 32-bit values from a and swaps them and places in high -// end of result takes the higher two 32 bit values from b and swaps them and -// places in low end of result. -FORCE_INLINE __m128 _mm_shuffle_ps_2301(__m128 a, __m128 b) -{ - float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); - float32x2_t b23 = vrev64_f32(vget_high_f32(vreinterpretq_f32_m128(b))); - return vreinterpretq_m128_f32(vcombine_f32(a01, b23)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_0321(__m128 a, __m128 b) -{ - float32x2_t a21 = vget_high_f32( - vextq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 3)); - float32x2_t b03 = vget_low_f32( - vextq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b), 3)); - return vreinterpretq_m128_f32(vcombine_f32(a21, b03)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_2103(__m128 a, __m128 b) -{ - float32x2_t a03 = vget_low_f32( - vextq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 3)); - float32x2_t b21 = vget_high_f32( - vextq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b), 3)); - return vreinterpretq_m128_f32(vcombine_f32(a03, b21)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_1010(__m128 a, __m128 b) -{ - float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); - float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); - return vreinterpretq_m128_f32(vcombine_f32(a10, b10)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_1001(__m128 a, __m128 b) -{ - float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); - float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); - return vreinterpretq_m128_f32(vcombine_f32(a01, b10)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_0101(__m128 a, __m128 b) -{ - float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); - float32x2_t b01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(b))); - return vreinterpretq_m128_f32(vcombine_f32(a01, b01)); -} - -// keeps the low 64 bits of b in the low and puts the high 64 bits of a in the -// high -FORCE_INLINE __m128 _mm_shuffle_ps_3210(__m128 a, __m128 b) -{ - float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); - float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); - return vreinterpretq_m128_f32(vcombine_f32(a10, b32)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_0011(__m128 a, __m128 b) -{ - float32x2_t a11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 1); - float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); - return vreinterpretq_m128_f32(vcombine_f32(a11, b00)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_0022(__m128 a, __m128 b) -{ - float32x2_t a22 = - vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0); - float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); - return vreinterpretq_m128_f32(vcombine_f32(a22, b00)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_2200(__m128 a, __m128 b) -{ - float32x2_t a00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 0); - float32x2_t b22 = - vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(b)), 0); - return vreinterpretq_m128_f32(vcombine_f32(a00, b22)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_3202(__m128 a, __m128 b) -{ - float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); - float32x2_t a22 = - vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0); - float32x2_t a02 = vset_lane_f32(a0, a22, 1); /* TODO: use vzip ?*/ - float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); - return vreinterpretq_m128_f32(vcombine_f32(a02, b32)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_1133(__m128 a, __m128 b) -{ - float32x2_t a33 = - vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 1); - float32x2_t b11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 1); - return vreinterpretq_m128_f32(vcombine_f32(a33, b11)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_2010(__m128 a, __m128 b) -{ - float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); - float32_t b2 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 2); - float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); - float32x2_t b20 = vset_lane_f32(b2, b00, 1); - return vreinterpretq_m128_f32(vcombine_f32(a10, b20)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_2001(__m128 a, __m128 b) -{ - float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); - float32_t b2 = vgetq_lane_f32(b, 2); - float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); - float32x2_t b20 = vset_lane_f32(b2, b00, 1); - return vreinterpretq_m128_f32(vcombine_f32(a01, b20)); -} - -FORCE_INLINE __m128 _mm_shuffle_ps_2032(__m128 a, __m128 b) -{ - float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); - float32_t b2 = vgetq_lane_f32(b, 2); - float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); - float32x2_t b20 = vset_lane_f32(b2, b00, 1); - return vreinterpretq_m128_f32(vcombine_f32(a32, b20)); -} - -// NEON does not support a general purpose permute intrinsic -// Selects four specific single-precision, floating-point values from a and b, -// based on the mask i. -// https://msdn.microsoft.com/en-us/library/vstudio/5f0858x0(v=vs.100).aspx -#if 0 /* C version */ -FORCE_INLINE __m128 _mm_shuffle_ps_default(__m128 a, - __m128 b, - __constrange(0, 255) int imm) -{ - __m128 ret; - ret[0] = a[imm & 0x3]; - ret[1] = a[(imm >> 2) & 0x3]; - ret[2] = b[(imm >> 4) & 0x03]; - ret[3] = b[(imm >> 6) & 0x03]; - return ret; -} -#endif -#define _mm_shuffle_ps_default(a, b, imm) \ - __extension__({ \ - float32x4_t ret; \ - ret = vmovq_n_f32( \ - vgetq_lane_f32(vreinterpretq_f32_m128(a), (imm) &0x3)); \ - ret = vsetq_lane_f32( \ - vgetq_lane_f32(vreinterpretq_f32_m128(a), ((imm) >> 2) & 0x3), \ - ret, 1); \ - ret = vsetq_lane_f32( \ - vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 4) & 0x3), \ - ret, 2); \ - ret = vsetq_lane_f32( \ - vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 6) & 0x3), \ - ret, 3); \ - vreinterpretq_m128_f32(ret); \ - }) - -// FORCE_INLINE __m128 _mm_shuffle_ps(__m128 a, __m128 b, __constrange(0,255) -// int imm) -#if defined(__clang__) -#define _mm_shuffle_ps(a, b, imm) \ - __extension__({ \ - float32x4_t _input1 = vreinterpretq_f32_m128(a); \ - float32x4_t _input2 = vreinterpretq_f32_m128(b); \ - float32x4_t _shuf = \ - __builtin_shufflevector(_input1, _input2, \ - (imm) & 0x3, \ - ((imm) >> 2) & 0x3, \ - (((imm) >> 4) & 0x3) + 4, \ - (((imm) >> 6) & 0x3) + 4); \ - vreinterpretq_m128_f32(_shuf); \ - }) -#else // generic -#define _mm_shuffle_ps(a, b, imm) \ - __extension__({ \ - __m128 ret; \ - switch (imm) { \ - case _MM_SHUFFLE(1, 0, 3, 2): \ - ret = _mm_shuffle_ps_1032((a), (b)); \ - break; \ - case _MM_SHUFFLE(2, 3, 0, 1): \ - ret = _mm_shuffle_ps_2301((a), (b)); \ - break; \ - case _MM_SHUFFLE(0, 3, 2, 1): \ - ret = _mm_shuffle_ps_0321((a), (b)); \ - break; \ - case _MM_SHUFFLE(2, 1, 0, 3): \ - ret = _mm_shuffle_ps_2103((a), (b)); \ - break; \ - case _MM_SHUFFLE(1, 0, 1, 0): \ - ret = _mm_movelh_ps((a), (b)); \ - break; \ - case _MM_SHUFFLE(1, 0, 0, 1): \ - ret = _mm_shuffle_ps_1001((a), (b)); \ - break; \ - case _MM_SHUFFLE(0, 1, 0, 1): \ - ret = _mm_shuffle_ps_0101((a), (b)); \ - break; \ - case _MM_SHUFFLE(3, 2, 1, 0): \ - ret = _mm_shuffle_ps_3210((a), (b)); \ - break; \ - case _MM_SHUFFLE(0, 0, 1, 1): \ - ret = _mm_shuffle_ps_0011((a), (b)); \ - break; \ - case _MM_SHUFFLE(0, 0, 2, 2): \ - ret = _mm_shuffle_ps_0022((a), (b)); \ - break; \ - case _MM_SHUFFLE(2, 2, 0, 0): \ - ret = _mm_shuffle_ps_2200((a), (b)); \ - break; \ - case _MM_SHUFFLE(3, 2, 0, 2): \ - ret = _mm_shuffle_ps_3202((a), (b)); \ - break; \ - case _MM_SHUFFLE(3, 2, 3, 2): \ - ret = _mm_movehl_ps((b), (a)); \ - break; \ - case _MM_SHUFFLE(1, 1, 3, 3): \ - ret = _mm_shuffle_ps_1133((a), (b)); \ - break; \ - case _MM_SHUFFLE(2, 0, 1, 0): \ - ret = _mm_shuffle_ps_2010((a), (b)); \ - break; \ - case _MM_SHUFFLE(2, 0, 0, 1): \ - ret = _mm_shuffle_ps_2001((a), (b)); \ - break; \ - case _MM_SHUFFLE(2, 0, 3, 2): \ - ret = _mm_shuffle_ps_2032((a), (b)); \ - break; \ - default: \ - ret = _mm_shuffle_ps_default((a), (b), (imm)); \ - break; \ - } \ - ret; \ - }) -#endif // not clang - -// Takes the upper 64 bits of a and places it in the low end of the result -// Takes the lower 64 bits of a and places it into the high end of the result. -FORCE_INLINE __m128i _mm_shuffle_epi_1032(__m128i a) -{ - int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a)); - int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a)); - return vreinterpretq_m128i_s32(vcombine_s32(a32, a10)); -} - -// takes the lower two 32-bit values from a and swaps them and places in low end -// of result takes the higher two 32 bit values from a and swaps them and places -// in high end of result. -FORCE_INLINE __m128i _mm_shuffle_epi_2301(__m128i a) -{ - int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); - int32x2_t a23 = vrev64_s32(vget_high_s32(vreinterpretq_s32_m128i(a))); - return vreinterpretq_m128i_s32(vcombine_s32(a01, a23)); -} - -// rotates the least significant 32 bits into the most signficant 32 bits, and -// shifts the rest down -FORCE_INLINE __m128i _mm_shuffle_epi_0321(__m128i a) -{ - return vreinterpretq_m128i_s32( - vextq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(a), 1)); -} - -// rotates the most significant 32 bits into the least signficant 32 bits, and -// shifts the rest up -FORCE_INLINE __m128i _mm_shuffle_epi_2103(__m128i a) -{ - return vreinterpretq_m128i_s32( - vextq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(a), 3)); -} - -// gets the lower 64 bits of a, and places it in the upper 64 bits -// gets the lower 64 bits of a and places it in the lower 64 bits -FORCE_INLINE __m128i _mm_shuffle_epi_1010(__m128i a) -{ - int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a)); - return vreinterpretq_m128i_s32(vcombine_s32(a10, a10)); -} - -// gets the lower 64 bits of a, swaps the 0 and 1 elements, and places it in the -// lower 64 bits gets the lower 64 bits of a, and places it in the upper 64 bits -FORCE_INLINE __m128i _mm_shuffle_epi_1001(__m128i a) -{ - int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); - int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a)); - return vreinterpretq_m128i_s32(vcombine_s32(a01, a10)); -} - -// gets the lower 64 bits of a, swaps the 0 and 1 elements and places it in the -// upper 64 bits gets the lower 64 bits of a, swaps the 0 and 1 elements, and -// places it in the lower 64 bits -FORCE_INLINE __m128i _mm_shuffle_epi_0101(__m128i a) -{ - int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); - return vreinterpretq_m128i_s32(vcombine_s32(a01, a01)); -} - -FORCE_INLINE __m128i _mm_shuffle_epi_2211(__m128i a) -{ - int32x2_t a11 = vdup_lane_s32(vget_low_s32(vreinterpretq_s32_m128i(a)), 1); - int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0); - return vreinterpretq_m128i_s32(vcombine_s32(a11, a22)); -} - -FORCE_INLINE __m128i _mm_shuffle_epi_0122(__m128i a) -{ - int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0); - int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); - return vreinterpretq_m128i_s32(vcombine_s32(a22, a01)); -} - -FORCE_INLINE __m128i _mm_shuffle_epi_3332(__m128i a) -{ - int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a)); - int32x2_t a33 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 1); - return vreinterpretq_m128i_s32(vcombine_s32(a32, a33)); -} - -// Shuffle packed 8-bit integers in a according to shuffle control mask in the -// corresponding 8-bit element of b, and store the results in dst. -// https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_shuffle_epi8&expand=5146 -FORCE_INLINE __m128i _mm_shuffle_epi8(__m128i a, __m128i b) -{ - int8x16_t tbl = vreinterpretq_s8_m128i(a); // input a - uint8x16_t idx = vreinterpretq_u8_m128i(b); // input b - uint8x16_t idx_masked = - vandq_u8(idx, vdupq_n_u8(0x8F)); // avoid using meaningless bits -#if defined(__aarch64__) - return vreinterpretq_m128i_s8(vqtbl1q_s8(tbl, idx_masked)); -#elif defined(__GNUC__) - - int8x16_t ret; - // %e and %f represent the even and odd D registers - // respectively. - __asm__( - " vtbl.8 %e[ret], {%e[tbl], %f[tbl]}, %e[idx]\n" - " vtbl.8 %f[ret], {%e[tbl], %f[tbl]}, %f[idx]\n" - : [ret] "=&w" (ret) - : [tbl] "w" (tbl), [idx] "w" (idx_masked)); - return vreinterpretq_m128i_s8(ret); -#else - // use this line if testing on aarch64 - int8x8x2_t a_split = { vget_low_s8(tbl), vget_high_s8(tbl) }; - return vreinterpretq_m128i_s8( - vcombine_s8( - vtbl2_s8(a_split, vget_low_u8(idx_masked)), - vtbl2_s8(a_split, vget_high_u8(idx_masked)) - ) - ); -#endif -} - - -#if 0 /* C version */ -FORCE_INLINE __m128i _mm_shuffle_epi32_default(__m128i a, - __constrange(0, 255) int imm) -{ - __m128i ret; - ret[0] = a[imm & 0x3]; - ret[1] = a[(imm >> 2) & 0x3]; - ret[2] = a[(imm >> 4) & 0x03]; - ret[3] = a[(imm >> 6) & 0x03]; - return ret; -} -#endif -#define _mm_shuffle_epi32_default(a, imm) \ - __extension__({ \ - int32x4_t ret; \ - ret = vmovq_n_s32( \ - vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm) &0x3)); \ - ret = vsetq_lane_s32( \ - vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 2) & 0x3), \ - ret, 1); \ - ret = vsetq_lane_s32( \ - vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 4) & 0x3), \ - ret, 2); \ - ret = vsetq_lane_s32( \ - vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 6) & 0x3), \ - ret, 3); \ - vreinterpretq_m128i_s32(ret); \ - }) - -// FORCE_INLINE __m128i _mm_shuffle_epi32_splat(__m128i a, __constrange(0,255) -// int imm) -#if defined(__aarch64__) -#define _mm_shuffle_epi32_splat(a, imm) \ - __extension__({ \ - vreinterpretq_m128i_s32( \ - vdupq_laneq_s32(vreinterpretq_s32_m128i(a), (imm))); \ - }) -#else -#define _mm_shuffle_epi32_splat(a, imm) \ - __extension__({ \ - vreinterpretq_m128i_s32( \ - vdupq_n_s32(vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)))); \ - }) -#endif - -// Shuffles the 4 signed or unsigned 32-bit integers in a as specified by imm. -// https://msdn.microsoft.com/en-us/library/56f67xbk%28v=vs.90%29.aspx -// FORCE_INLINE __m128i _mm_shuffle_epi32(__m128i a, __constrange(0,255) int -// imm) -#if defined(__clang__) -#define _mm_shuffle_epi32(a, imm) \ - __extension__({ \ - int32x4_t _input = vreinterpretq_s32_m128i(a); \ - int32x4_t _shuf = \ - __builtin_shufflevector(_input, _input, \ - (imm) & 0x3, ((imm) >> 2) & 0x3, \ - ((imm) >> 4) & 0x3, ((imm) >> 6) & 0x3); \ - vreinterpretq_m128i_s32(_shuf); \ - }) -#else // generic -#define _mm_shuffle_epi32(a, imm) \ - __extension__({ \ - __m128i ret; \ - switch (imm) { \ - case _MM_SHUFFLE(1, 0, 3, 2): \ - ret = _mm_shuffle_epi_1032((a)); \ - break; \ - case _MM_SHUFFLE(2, 3, 0, 1): \ - ret = _mm_shuffle_epi_2301((a)); \ - break; \ - case _MM_SHUFFLE(0, 3, 2, 1): \ - ret = _mm_shuffle_epi_0321((a)); \ - break; \ - case _MM_SHUFFLE(2, 1, 0, 3): \ - ret = _mm_shuffle_epi_2103((a)); \ - break; \ - case _MM_SHUFFLE(1, 0, 1, 0): \ - ret = _mm_shuffle_epi_1010((a)); \ - break; \ - case _MM_SHUFFLE(1, 0, 0, 1): \ - ret = _mm_shuffle_epi_1001((a)); \ - break; \ - case _MM_SHUFFLE(0, 1, 0, 1): \ - ret = _mm_shuffle_epi_0101((a)); \ - break; \ - case _MM_SHUFFLE(2, 2, 1, 1): \ - ret = _mm_shuffle_epi_2211((a)); \ - break; \ - case _MM_SHUFFLE(0, 1, 2, 2): \ - ret = _mm_shuffle_epi_0122((a)); \ - break; \ - case _MM_SHUFFLE(3, 3, 3, 2): \ - ret = _mm_shuffle_epi_3332((a)); \ - break; \ - case _MM_SHUFFLE(0, 0, 0, 0): \ - ret = _mm_shuffle_epi32_splat((a), 0); \ - break; \ - case _MM_SHUFFLE(1, 1, 1, 1): \ - ret = _mm_shuffle_epi32_splat((a), 1); \ - break; \ - case _MM_SHUFFLE(2, 2, 2, 2): \ - ret = _mm_shuffle_epi32_splat((a), 2); \ - break; \ - case _MM_SHUFFLE(3, 3, 3, 3): \ - ret = _mm_shuffle_epi32_splat((a), 3); \ - break; \ - default: \ - ret = _mm_shuffle_epi32_default((a), (imm)); \ - break; \ - } \ - ret; \ - }) -#endif // not clang - -// Shuffles the lower 4 signed or unsigned 16-bit integers in a as specified -// by imm. -// https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/y41dkk37(v=vs.100) -// FORCE_INLINE __m128i _mm_shufflelo_epi16_function(__m128i a, -// __constrange(0,255) int imm) - -#define _mm_shufflelo_epi16_function(a, imm) \ - __extension__({ \ - int16x8_t ret = vreinterpretq_s16_m128i(a); \ - int16x4_t lowBits = vget_low_s16(ret); \ - ret = vsetq_lane_s16(vget_lane_s16(lowBits, (imm) &0x3), ret, 0); \ - ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 2) & 0x3), ret, \ - 1); \ - ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 4) & 0x3), ret, \ - 2); \ - ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 6) & 0x3), ret, \ - 3); \ - vreinterpretq_m128i_s16(ret); \ - }) - -// FORCE_INLINE __m128i _mm_shufflelo_epi16(__m128i a, __constrange(0,255) int -// imm) -#if defined(__clang__) -#define _mm_shufflelo_epi16(a, imm) \ - __extension__({ \ - int16x8_t _input = vreinterpretq_s16_m128i(a); \ - int16x8_t _shuf = \ - __builtin_shufflevector(_input, _input, \ - ((imm) & 0x3), \ - (((imm) >> 2) & 0x3), \ - (((imm) >> 4) & 0x3), \ - (((imm) >> 6) & 0x3), \ - 4, 5, 6, 7); \ - vreinterpretq_m128i_s16(_shuf); \ - }) -#else // generic -#define _mm_shufflelo_epi16(a, imm) _mm_shufflelo_epi16_function((a), (imm)) -#endif - -// Shuffles the upper 4 signed or unsigned 16-bit integers in a as specified -// by imm. -// https://msdn.microsoft.com/en-us/library/13ywktbs(v=vs.100).aspx -// FORCE_INLINE __m128i _mm_shufflehi_epi16_function(__m128i a, -// __constrange(0,255) int imm) -#define _mm_shufflehi_epi16_function(a, imm) \ - __extension__({ \ - int16x8_t ret = vreinterpretq_s16_m128i(a); \ - int16x4_t highBits = vget_high_s16(ret); \ - ret = vsetq_lane_s16(vget_lane_s16(highBits, (imm) &0x3), ret, 4); \ - ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 2) & 0x3), ret, \ - 5); \ - ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 4) & 0x3), ret, \ - 6); \ - ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 6) & 0x3), ret, \ - 7); \ - vreinterpretq_m128i_s16(ret); \ - }) - -// FORCE_INLINE __m128i _mm_shufflehi_epi16(__m128i a, __constrange(0,255) int -// imm) -#if defined(__clang__) -#define _mm_shufflehi_epi16(a, imm) \ - __extension__({ \ - int16x8_t _input = vreinterpretq_s16_m128i(a); \ - int16x8_t _shuf = \ - __builtin_shufflevector(_input, _input, \ - 0, 1, 2, 3, \ - ((imm) & 0x3) + 4, \ - (((imm) >> 2) & 0x3) + 4, \ - (((imm) >> 4) & 0x3) + 4, \ - (((imm) >> 6) & 0x3) + 4); \ - vreinterpretq_m128i_s16(_shuf); \ - }) -#else // generic -#define _mm_shufflehi_epi16(a, imm) _mm_shufflehi_epi16_function((a), (imm)) -#endif - -// Blend packed 16-bit integers from a and b using control mask imm8, and store -// the results in dst. -// -// FOR j := 0 to 7 -// i := j*16 -// IF imm8[j] -// dst[i+15:i] := b[i+15:i] -// ELSE -// dst[i+15:i] := a[i+15:i] -// FI -// ENDFOR -// FORCE_INLINE __m128i _mm_blend_epi16(__m128i a, __m128i b, __constrange(0,255) -// int imm) -#define _mm_blend_epi16(a, b, imm) \ - __extension__({ \ - const uint16_t _mask[8] = { \ - ((imm) & (1 << 0)) ? 0xFFFF : 0x0000, \ - ((imm) & (1 << 1)) ? 0xFFFF : 0x0000, \ - ((imm) & (1 << 2)) ? 0xFFFF : 0x0000, \ - ((imm) & (1 << 3)) ? 0xFFFF : 0x0000, \ - ((imm) & (1 << 4)) ? 0xFFFF : 0x0000, \ - ((imm) & (1 << 5)) ? 0xFFFF : 0x0000, \ - ((imm) & (1 << 6)) ? 0xFFFF : 0x0000, \ - ((imm) & (1 << 7)) ? 0xFFFF : 0x0000 \ - }; \ - uint16x8_t _mask_vec = vld1q_u16(_mask); \ - uint16x8_t _a = vreinterpretq_u16_m128i(a); \ - uint16x8_t _b = vreinterpretq_u16_m128i(b); \ - vreinterpretq_m128i_u16(vbslq_u16(_mask_vec, _b, _a)); \ - }) - -// Blend packed 8-bit integers from a and b using mask, and store the results in dst. -// -// FOR j := 0 to 15 -// i := j*8 -// IF mask[i+7] -// dst[i+7:i] := b[i+7:i] -// ELSE -// dst[i+7:i] := a[i+7:i] -// FI -// ENDFOR -FORCE_INLINE __m128i _mm_blendv_epi8(__m128i _a, __m128i _b, __m128i _mask) -{ - // Use a signed shift right to create a mask with the sign bit - uint8x16_t mask = vreinterpretq_u8_s8(vshrq_n_s8(vreinterpretq_s8_m128i(_mask), 7)); - uint8x16_t a = vreinterpretq_u8_m128i(_a); - uint8x16_t b = vreinterpretq_u8_m128i(_b); - return vreinterpretq_m128i_u8(vbslq_u8(mask, b, a)); -} - -///////////////////////////////////// -// Shifts -///////////////////////////////////// - -// Shifts the 4 signed 32-bit integers in a right by count bits while shifting -// in the sign bit. -// -// r0 := a0 >> count -// r1 := a1 >> count -// r2 := a2 >> count -// r3 := a3 >> count immediate -FORCE_INLINE __m128i _mm_srai_epi32(__m128i a, int count) -{ - return (__m128i) vshlq_s32((int32x4_t) a, vdupq_n_s32(-count)); -} - -// Shifts the 8 signed 16-bit integers in a right by count bits while shifting -// in the sign bit. -// -// r0 := a0 >> count -// r1 := a1 >> count -// ... -// r7 := a7 >> count -FORCE_INLINE __m128i _mm_srai_epi16(__m128i a, int count) -{ - return (__m128i) vshlq_s16((int16x8_t) a, vdupq_n_s16(-count)); -} - -// Shifts the 8 signed or unsigned 16-bit integers in a left by count bits while -// shifting in zeros. -// -// r0 := a0 << count -// r1 := a1 << count -// ... -// r7 := a7 << count -// -// https://msdn.microsoft.com/en-us/library/es73bcsy(v=vs.90).aspx -#define _mm_slli_epi16(a, imm) \ - __extension__({ \ - __m128i ret; \ - if ((imm) <= 0) { \ - ret = a; \ - } else if ((imm) > 31) { \ - ret = _mm_setzero_si128(); \ - } else { \ - ret = vreinterpretq_m128i_s16( \ - vshlq_n_s16(vreinterpretq_s16_m128i(a), (imm))); \ - } \ - ret; \ - }) - -// Shifts the 4 signed or unsigned 32-bit integers in a left by count bits while -// shifting in zeros. : -// https://msdn.microsoft.com/en-us/library/z2k3bbtb%28v=vs.90%29.aspx -// FORCE_INLINE __m128i _mm_slli_epi32(__m128i a, __constrange(0,255) int imm) -#define _mm_slli_epi32(a, imm) \ - __extension__({ \ - __m128i ret; \ - if ((imm) <= 0) { \ - ret = a; \ - } else if ((imm) > 31) { \ - ret = _mm_setzero_si128(); \ - } else { \ - ret = vreinterpretq_m128i_s32( \ - vshlq_n_s32(vreinterpretq_s32_m128i(a), (imm))); \ - } \ - ret; \ - }) - -// Shift packed 64-bit integers in a left by imm8 while shifting in zeros, and -// store the results in dst. -#define _mm_slli_epi64(a, imm) \ - __extension__({ \ - __m128i ret; \ - if ((imm) <= 0) { \ - ret = a; \ - } else if ((imm) > 63) { \ - ret = _mm_setzero_si128(); \ - } else { \ - ret = vreinterpretq_m128i_s64( \ - vshlq_n_s64(vreinterpretq_s64_m128i(a), (imm))); \ - } \ - ret; \ - }) - -// Shifts the 8 signed or unsigned 16-bit integers in a right by count bits -// while shifting in zeros. -// -// r0 := srl(a0, count) -// r1 := srl(a1, count) -// ... -// r7 := srl(a7, count) -// -// https://msdn.microsoft.com/en-us/library/6tcwd38t(v=vs.90).aspx -#define _mm_srli_epi16(a, imm) \ - __extension__({ \ - __m128i ret; \ - if ((imm) <= 0) { \ - ret = a; \ - } else if ((imm) > 31) { \ - ret = _mm_setzero_si128(); \ - } else { \ - ret = vreinterpretq_m128i_u16( \ - vshrq_n_u16(vreinterpretq_u16_m128i(a), (imm))); \ - } \ - ret; \ - }) - -// Shifts the 4 signed or unsigned 32-bit integers in a right by count bits -// while shifting in zeros. -// https://msdn.microsoft.com/en-us/library/w486zcfa(v=vs.100).aspx FORCE_INLINE -// __m128i _mm_srli_epi32(__m128i a, __constrange(0,255) int imm) -#define _mm_srli_epi32(a, imm) \ - __extension__({ \ - __m128i ret; \ - if ((imm) <= 0) { \ - ret = a; \ - } else if ((imm) > 31) { \ - ret = _mm_setzero_si128(); \ - } else { \ - ret = vreinterpretq_m128i_u32( \ - vshrq_n_u32(vreinterpretq_u32_m128i(a), (imm))); \ - } \ - ret; \ - }) - -// Shift packed 64-bit integers in a right by imm8 while shifting in zeros, and -// store the results in dst. -#define _mm_srli_epi64(a, imm) \ - __extension__({ \ - __m128i ret; \ - if ((imm) <= 0) { \ - ret = a; \ - } else if ((imm) > 63) { \ - ret = _mm_setzero_si128(); \ - } else { \ - ret = vreinterpretq_m128i_u64( \ - vshrq_n_u64(vreinterpretq_u64_m128i(a), (imm))); \ - } \ - ret; \ - }) - -// Shifts the 4 signed 32 - bit integers in a right by count bits while shifting -// in the sign bit. -// https://msdn.microsoft.com/en-us/library/z1939387(v=vs.100).aspx -// FORCE_INLINE __m128i _mm_srai_epi32(__m128i a, __constrange(0,255) int imm) -#define _mm_srai_epi32(a, imm) \ - __extension__({ \ - __m128i ret; \ - if ((imm) <= 0) { \ - ret = a; \ - } else if ((imm) > 31) { \ - ret = vreinterpretq_m128i_s32( \ - vshrq_n_s32(vreinterpretq_s32_m128i(a), 16)); \ - ret = vreinterpretq_m128i_s32( \ - vshrq_n_s32(vreinterpretq_s32_m128i(ret), 16)); \ - } else { \ - ret = vreinterpretq_m128i_s32( \ - vshrq_n_s32(vreinterpretq_s32_m128i(a), (imm))); \ - } \ - ret; \ - }) - -// Shifts the 128 - bit value in a right by imm bytes while shifting in -// zeros.imm must be an immediate. -// -// r := srl(a, imm*8) -// -// https://msdn.microsoft.com/en-us/library/305w28yz(v=vs.100).aspx -// FORCE_INLINE _mm_srli_si128(__m128i a, __constrange(0,255) int imm) -#define _mm_srli_si128(a, imm) \ - __extension__({ \ - __m128i ret; \ - if ((imm) <= 0) { \ - ret = a; \ - } else if ((imm) > 15) { \ - ret = _mm_setzero_si128(); \ - } else { \ - ret = vreinterpretq_m128i_s8( \ - vextq_s8(vreinterpretq_s8_m128i(a), vdupq_n_s8(0), (imm))); \ - } \ - ret; \ - }) - -// Shifts the 128-bit value in a left by imm bytes while shifting in zeros. imm -// must be an immediate. -// -// r := a << (imm * 8) -// -// https://msdn.microsoft.com/en-us/library/34d3k2kt(v=vs.100).aspx -// FORCE_INLINE __m128i _mm_slli_si128(__m128i a, __constrange(0,255) int imm) -#define _mm_slli_si128(a, imm) \ - __extension__({ \ - __m128i ret; \ - if ((imm) <= 0) { \ - ret = a; \ - } else if ((imm) > 15) { \ - ret = _mm_setzero_si128(); \ - } else { \ - ret = vreinterpretq_m128i_s8(vextq_s8( \ - vdupq_n_s8(0), vreinterpretq_s8_m128i(a), 16 - (imm))); \ - } \ - ret; \ - }) - -// Shifts the 8 signed or unsigned 16-bit integers in a left by count bits while -// shifting in zeros. -// -// r0 := a0 << count -// r1 := a1 << count -// ... -// r7 := a7 << count -// -// https://msdn.microsoft.com/en-us/library/c79w388h(v%3dvs.90).aspx -FORCE_INLINE __m128i _mm_sll_epi16(__m128i a, __m128i count) -{ - uint64_t c = ((SIMDVec *) &count)->m128_u64[0]; - if (c > 15) - return _mm_setzero_si128(); - - int16x8_t vc = vdupq_n_s16((int16_t) c); - return vreinterpretq_m128i_s16(vshlq_s16(vreinterpretq_s16_m128i(a), vc)); -} - -// NEON does not provide a version of this function. -// Creates a 16-bit mask from the most significant bits of the 16 signed or -// unsigned 8-bit integers in a and zero extends the upper bits. -// https://msdn.microsoft.com/en-us/library/vstudio/s090c8fk(v=vs.100).aspx -FORCE_INLINE int _mm_movemask_epi8(__m128i a) -{ - // Use increasingly wide shifts+adds to collect the sign bits - // together. - // Since the widening shifts would be rather confusing to follow in little endian, everything - // will be illustrated in big endian order instead. This has a different result - the bits - // would actually be reversed on a big endian machine. - - // Starting input (only half the elements are shown): - // 89 ff 1d c0 00 10 99 33 - uint8x16_t input = vreinterpretq_u8_m128i(a); - - // Shift out everything but the sign bits with an unsigned shift right. - // - // Bytes of the vector:: - // 89 ff 1d c0 00 10 99 33 - // \ \ \ \ \ \ \ \ high_bits = (uint16x4_t)(input >> 7) - // | | | | | | | | - // 01 01 00 01 00 00 01 00 - // - // Bits of first important lane(s): - // 10001001 (89) - // \______ - // | - // 00000001 (01) - uint16x8_t high_bits = vreinterpretq_u16_u8(vshrq_n_u8(input, 7)); - - // Merge the even lanes together with a 16-bit unsigned shift right + add. - // 'xx' represents garbage data which will be ignored in the final result. - // In the important bytes, the add functions like a binary OR. - // - // 01 01 00 01 00 00 01 00 - // \_ | \_ | \_ | \_ | paired16 = (uint32x4_t)(input + (input >> 7)) - // \| \| \| \| - // xx 03 xx 01 xx 00 xx 02 - // - // 00000001 00000001 (01 01) - // \_______ | - // \| - // xxxxxxxx xxxxxx11 (xx 03) - uint32x4_t paired16 = vreinterpretq_u32_u16(vsraq_n_u16(high_bits, high_bits, 7)); - - // Repeat with a wider 32-bit shift + add. - // xx 03 xx 01 xx 00 xx 02 - // \____ | \____ | paired32 = (uint64x1_t)(paired16 + (paired16 >> 14)) - // \| \| - // xx xx xx 0d xx xx xx 02 - // - // 00000011 00000001 (03 01) - // \\_____ || - // '----.\|| - // xxxxxxxx xxxx1101 (xx 0d) - uint64x2_t paired32 = vreinterpretq_u64_u32(vsraq_n_u32(paired16, paired16, 14)); - - // Last, an even wider 64-bit shift + add to get our result in the low 8 bit lanes. - // xx xx xx 0d xx xx xx 02 - // \_________ | paired64 = (uint8x8_t)(paired32 + (paired32 >> 28)) - // \| - // xx xx xx xx xx xx xx d2 - // - // 00001101 00000010 (0d 02) - // \ \___ | | - // '---. \| | - // xxxxxxxx 11010010 (xx d2) - uint8x16_t paired64 = vreinterpretq_u8_u64(vsraq_n_u64(paired32, paired32, 28)); - - // Extract the low 8 bits from each 64-bit lane with 2 8-bit extracts. - // xx xx xx xx xx xx xx d2 - // || return paired64[0] - // d2 - // Note: Little endian would return the correct value 4b (01001011) instead. - return vgetq_lane_u8(paired64, 0) | ((int)vgetq_lane_u8(paired64, 8) << 8); -} - -// NEON does not provide this method -// Creates a 4-bit mask from the most significant bits of the four -// single-precision, floating-point values. -// https://msdn.microsoft.com/en-us/library/vstudio/4490ys29(v=vs.100).aspx -FORCE_INLINE int _mm_movemask_ps(__m128 a) -{ - // Uses the exact same method as _mm_movemask_epi8, see that for details - uint32x4_t input = vreinterpretq_u32_m128(a); - // Shift out everything but the sign bits with a 32-bit unsigned shift right. - uint64x2_t high_bits = vreinterpretq_u64_u32(vshrq_n_u32(input, 31)); - // Merge the two pairs together with a 64-bit unsigned shift right + add. - uint8x16_t paired = vreinterpretq_u8_u64(vsraq_n_u64(high_bits, high_bits, 31)); - // Extract the result. - return vgetq_lane_u8(paired, 0) | (vgetq_lane_u8(paired, 8) << 2); -} - -// Compute the bitwise AND of 128 bits (representing integer data) in a and -// mask, and return 1 if the result is zero, otherwise return 0. -// https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_test_all_zeros&expand=5871 -FORCE_INLINE int _mm_test_all_zeros(__m128i a, __m128i mask) -{ - int64x2_t a_and_mask = - vandq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(mask)); - return (vgetq_lane_s64(a_and_mask, 0) | vgetq_lane_s64(a_and_mask, 1)) ? 0 - : 1; -} - -// ****************************************** -// Math operations -// ****************************************** - -// Subtracts the four single-precision, floating-point values of a and b. -// -// r0 := a0 - b0 -// r1 := a1 - b1 -// r2 := a2 - b2 -// r3 := a3 - b3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/1zad2k61(v=vs.100).aspx -FORCE_INLINE __m128 _mm_sub_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_f32( - vsubq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// Subtract 2 packed 64-bit integers in b from 2 packed 64-bit integers in a, -// and store the results in dst. -// r0 := a0 - b0 -// r1 := a1 - b1 -FORCE_INLINE __m128i _mm_sub_epi64(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s64( - vsubq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); -} - -// Subtracts the 4 signed or unsigned 32-bit integers of b from the 4 signed or -// unsigned 32-bit integers of a. -// -// r0 := a0 - b0 -// r1 := a1 - b1 -// r2 := a2 - b2 -// r3 := a3 - b3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/fhh866h0(v=vs.100).aspx -FORCE_INLINE __m128i _mm_sub_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s32( - vsubq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -FORCE_INLINE __m128i _mm_sub_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s16( - vsubq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - -FORCE_INLINE __m128i _mm_sub_epi8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s8( - vsubq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); -} - -// Subtracts the 8 unsigned 16-bit integers of bfrom the 8 unsigned 16-bit -// integers of a and saturates.. -// https://technet.microsoft.com/en-us/subscriptions/index/f44y0s19(v=vs.90).aspx -FORCE_INLINE __m128i _mm_subs_epu16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u16( - vqsubq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); -} - -// Subtracts the 16 unsigned 8-bit integers of b from the 16 unsigned 8-bit -// integers of a and saturates. -// -// r0 := UnsignedSaturate(a0 - b0) -// r1 := UnsignedSaturate(a1 - b1) -// ... -// r15 := UnsignedSaturate(a15 - b15) -// -// https://technet.microsoft.com/en-us/subscriptions/yadkxc18(v=vs.90) -FORCE_INLINE __m128i _mm_subs_epu8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u8( - vqsubq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); -} - -// Subtracts the 8 signed 16-bit integers of b from the 8 signed 16-bit integers -// of a and saturates. -// -// r0 := SignedSaturate(a0 - b0) -// r1 := SignedSaturate(a1 - b1) -// ... -// r7 := SignedSaturate(a7 - b7) -FORCE_INLINE __m128i _mm_subs_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s16( - vqsubq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - -FORCE_INLINE __m128i _mm_adds_epu16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u16( - vqaddq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); -} - -// Negate packed 8-bit integers in a when the corresponding signed -// 8-bit integer in b is negative, and store the results in dst. -// Element in dst are zeroed out when the corresponding element -// in b is zero. -// -// for i in 0..15 -// if b[i] < 0 -// r[i] := -a[i] -// else if b[i] == 0 -// r[i] := 0 -// else -// r[i] := a[i] -// fi -// done -FORCE_INLINE __m128i _mm_sign_epi8(__m128i _a, __m128i _b) -{ - int8x16_t a = vreinterpretq_s8_m128i(_a); - int8x16_t b = vreinterpretq_s8_m128i(_b); - - int8x16_t zero = vdupq_n_s8(0); - // signed shift right: faster than vclt - // (b < 0) ? 0xFF : 0 - uint8x16_t ltMask = vreinterpretq_u8_s8(vshrq_n_s8(b, 7)); - // (b == 0) ? 0xFF : 0 - int8x16_t zeroMask = vreinterpretq_s8_u8(vceqq_s8(b, zero)); - // -a - int8x16_t neg = vnegq_s8(a); - // bitwise select either a or neg based on ltMask - int8x16_t masked = vbslq_s8(ltMask, a, neg); - // res = masked & (~zeroMask) - int8x16_t res = vbicq_s8(masked, zeroMask); - return vreinterpretq_m128i_s8(res); -} - -// Negate packed 16-bit integers in a when the corresponding signed -// 16-bit integer in b is negative, and store the results in dst. -// Element in dst are zeroed out when the corresponding element -// in b is zero. -// -// for i in 0..7 -// if b[i] < 0 -// r[i] := -a[i] -// else if b[i] == 0 -// r[i] := 0 -// else -// r[i] := a[i] -// fi -// done -FORCE_INLINE __m128i _mm_sign_epi16(__m128i _a, __m128i _b) -{ - int16x8_t a = vreinterpretq_s16_m128i(_a); - int16x8_t b = vreinterpretq_s16_m128i(_b); - - int16x8_t zero = vdupq_n_s16(0); - // signed shift right: faster than vclt - // (b < 0) ? 0xFFFF : 0 - uint16x8_t ltMask = vreinterpretq_u16_s16(vshrq_n_s16(b, 15)); - // (b == 0) ? 0xFFFF : 0 - int16x8_t zeroMask = vreinterpretq_s16_u16(vceqq_s16(b, zero)); - // -a - int16x8_t neg = vnegq_s16(a); - // bitwise select either a or neg based on ltMask - int16x8_t masked = vbslq_s16(ltMask, a, neg); - // res = masked & (~zeroMask) - int16x8_t res = vbicq_s16(masked, zeroMask); - return vreinterpretq_m128i_s16(res); -} - -// Negate packed 32-bit integers in a when the corresponding signed -// 32-bit integer in b is negative, and store the results in dst. -// Element in dst are zeroed out when the corresponding element -// in b is zero. -// -// for i in 0..3 -// if b[i] < 0 -// r[i] := -a[i] -// else if b[i] == 0 -// r[i] := 0 -// else -// r[i] := a[i] -// fi -// done -FORCE_INLINE __m128i _mm_sign_epi32(__m128i _a, __m128i _b) -{ - int32x4_t a = vreinterpretq_s32_m128i(_a); - int32x4_t b = vreinterpretq_s32_m128i(_b); - - int32x4_t zero = vdupq_n_s32(0); - // signed shift right: faster than vclt - // (b < 0) ? 0xFFFFFFFF : 0 - uint32x4_t ltMask = vreinterpretq_u32_s32(vshrq_n_s32(b, 31)); - // (b == 0) ? 0xFFFFFFFF : 0 - int32x4_t zeroMask = vreinterpretq_s32_u32(vceqq_s32(b, zero)); - // neg = -a - int32x4_t neg = vnegq_s32(a); - // bitwise select either a or neg based on ltMask - int32x4_t masked = vbslq_s32(ltMask, a, neg); - // res = masked & (~zeroMask) - int32x4_t res = vbicq_s32(masked, zeroMask); - return vreinterpretq_m128i_s32(res); -} - -// Computes the average of the 16 unsigned 8-bit integers in a and the 16 -// unsigned 8-bit integers in b and rounds. -// -// r0 := (a0 + b0) / 2 -// r1 := (a1 + b1) / 2 -// ... -// r15 := (a15 + b15) / 2 -// -// https://msdn.microsoft.com/en-us/library/vstudio/8zwh554a(v%3dvs.90).aspx -FORCE_INLINE __m128i _mm_avg_epu8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u8( - vrhaddq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); -} - -// Computes the average of the 8 unsigned 16-bit integers in a and the 8 -// unsigned 16-bit integers in b and rounds. -// -// r0 := (a0 + b0) / 2 -// r1 := (a1 + b1) / 2 -// ... -// r7 := (a7 + b7) / 2 -// -// https://msdn.microsoft.com/en-us/library/vstudio/y13ca3c8(v=vs.90).aspx -FORCE_INLINE __m128i _mm_avg_epu16(__m128i a, __m128i b) -{ - return (__m128i) vrhaddq_u16(vreinterpretq_u16_m128i(a), - vreinterpretq_u16_m128i(b)); -} - -// Adds the four single-precision, floating-point values of a and b. -// -// r0 := a0 + b0 -// r1 := a1 + b1 -// r2 := a2 + b2 -// r3 := a3 + b3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/c9848chc(v=vs.100).aspx -FORCE_INLINE __m128 _mm_add_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_f32( - vaddq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// adds the scalar single-precision floating point values of a and b. -// https://msdn.microsoft.com/en-us/library/be94x2y6(v=vs.100).aspx -FORCE_INLINE __m128 _mm_add_ss(__m128 a, __m128 b) -{ - float32_t b0 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 0); - float32x4_t value = vsetq_lane_f32(b0, vdupq_n_f32(0), 0); - // the upper values in the result must be the remnants of . - return vreinterpretq_m128_f32(vaddq_f32(a, value)); -} - -// Adds the 4 signed or unsigned 64-bit integers in a to the 4 signed or -// unsigned 32-bit integers in b. -// https://msdn.microsoft.com/en-us/library/vstudio/09xs4fkk(v=vs.100).aspx -FORCE_INLINE __m128i _mm_add_epi64(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s64( - vaddq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); -} - -// Adds the 4 signed or unsigned 32-bit integers in a to the 4 signed or -// unsigned 32-bit integers in b. -// -// r0 := a0 + b0 -// r1 := a1 + b1 -// r2 := a2 + b2 -// r3 := a3 + b3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/09xs4fkk(v=vs.100).aspx -FORCE_INLINE __m128i _mm_add_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s32( - vaddq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Adds the 8 signed or unsigned 16-bit integers in a to the 8 signed or -// unsigned 16-bit integers in b. -// https://msdn.microsoft.com/en-us/library/fceha5k4(v=vs.100).aspx -FORCE_INLINE __m128i _mm_add_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s16( - vaddq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - -// Adds the 16 signed or unsigned 8-bit integers in a to the 16 signed or -// unsigned 8-bit integers in b. -// https://technet.microsoft.com/en-us/subscriptions/yc7tcyzs(v=vs.90) -FORCE_INLINE __m128i _mm_add_epi8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s8( - vaddq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); -} - -// Adds the 8 signed 16-bit integers in a to the 8 signed 16-bit integers in b -// and saturates. -// -// r0 := SignedSaturate(a0 + b0) -// r1 := SignedSaturate(a1 + b1) -// ... -// r7 := SignedSaturate(a7 + b7) -// -// https://msdn.microsoft.com/en-us/library/1a306ef8(v=vs.100).aspx -FORCE_INLINE __m128i _mm_adds_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s16( - vqaddq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - -// Adds the 16 unsigned 8-bit integers in a to the 16 unsigned 8-bit integers in -// b and saturates.. -// https://msdn.microsoft.com/en-us/library/9hahyddy(v=vs.100).aspx -FORCE_INLINE __m128i _mm_adds_epu8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u8( - vqaddq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); -} - -// Multiplies the 8 signed or unsigned 16-bit integers from a by the 8 signed or -// unsigned 16-bit integers from b. -// -// r0 := (a0 * b0)[15:0] -// r1 := (a1 * b1)[15:0] -// ... -// r7 := (a7 * b7)[15:0] -// -// https://msdn.microsoft.com/en-us/library/vstudio/9ks1472s(v=vs.100).aspx -FORCE_INLINE __m128i _mm_mullo_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s16( - vmulq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - -// Multiplies the 4 signed or unsigned 32-bit integers from a by the 4 signed or -// unsigned 32-bit integers from b. -// https://msdn.microsoft.com/en-us/library/vstudio/bb531409(v=vs.100).aspx -FORCE_INLINE __m128i _mm_mullo_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s32( - vmulq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Multiplies the four single-precision, floating-point values of a and b. -// -// r0 := a0 * b0 -// r1 := a1 * b1 -// r2 := a2 * b2 -// r3 := a3 * b3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/22kbk6t9(v=vs.100).aspx -FORCE_INLINE __m128 _mm_mul_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_f32( - vmulq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// Multiply the low unsigned 32-bit integers from each packed 64-bit element in -// a and b, and store the unsigned 64-bit results in dst. -// -// r0 := (a0 & 0xFFFFFFFF) * (b0 & 0xFFFFFFFF) -// r1 := (a2 & 0xFFFFFFFF) * (b2 & 0xFFFFFFFF) -FORCE_INLINE __m128i _mm_mul_epu32(__m128i a, __m128i b) -{ - // vmull_u32 upcasts instead of masking, so we downcast. - uint32x2_t a_lo = vmovn_u64(vreinterpretq_u64_m128i(a)); - uint32x2_t b_lo = vmovn_u64(vreinterpretq_u64_m128i(b)); - return vreinterpretq_m128i_u64(vmull_u32(a_lo, b_lo)); -} - -// Multiply the low signed 32-bit integers from each packed 64-bit element in -// a and b, and store the signed 64-bit results in dst. -// -// r0 := (int64_t)(int32_t)a0 * (int64_t)(int32_t)b0 -// r1 := (int64_t)(int32_t)a2 * (int64_t)(int32_t)b2 -FORCE_INLINE __m128i _mm_mul_epi32(__m128i a, __m128i b) -{ - // vmull_s32 upcasts instead of masking, so we downcast. - int32x2_t a_lo = vmovn_s64(vreinterpretq_s64_m128i(a)); - int32x2_t b_lo = vmovn_s64(vreinterpretq_s64_m128i(b)); - return vreinterpretq_m128i_s64(vmull_s32(a_lo, b_lo)); -} - -// Multiplies the 8 signed 16-bit integers from a by the 8 signed 16-bit -// integers from b. -// -// r0 := (a0 * b0) + (a1 * b1) -// r1 := (a2 * b2) + (a3 * b3) -// r2 := (a4 * b4) + (a5 * b5) -// r3 := (a6 * b6) + (a7 * b7) -// https://msdn.microsoft.com/en-us/library/yht36sa6(v=vs.90).aspx -FORCE_INLINE __m128i _mm_madd_epi16(__m128i a, __m128i b) -{ - int32x4_t low = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)), - vget_low_s16(vreinterpretq_s16_m128i(b))); - int32x4_t high = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)), - vget_high_s16(vreinterpretq_s16_m128i(b))); - - int32x2_t low_sum = vpadd_s32(vget_low_s32(low), vget_high_s32(low)); - int32x2_t high_sum = vpadd_s32(vget_low_s32(high), vget_high_s32(high)); - - return vreinterpretq_m128i_s32(vcombine_s32(low_sum, high_sum)); -} - -// Multiply packed signed 16-bit integers in a and b, producing intermediate signed -// 32-bit integers. Shift right by 15 bits while rounding up, and store the -// packed 16-bit integers in dst. -// -// r0 := Round(((int32_t)a0 * (int32_t)b0) >> 15) -// r1 := Round(((int32_t)a1 * (int32_t)b1) >> 15) -// r2 := Round(((int32_t)a2 * (int32_t)b2) >> 15) -// ... -// r7 := Round(((int32_t)a7 * (int32_t)b7) >> 15) -FORCE_INLINE __m128i _mm_mulhrs_epi16(__m128i a, __m128i b) -{ - // Has issues due to saturation - // return vreinterpretq_m128i_s16(vqrdmulhq_s16(a, b)); - - // Multiply - int32x4_t mul_lo = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)), - vget_low_s16(vreinterpretq_s16_m128i(b))); - int32x4_t mul_hi = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)), - vget_high_s16(vreinterpretq_s16_m128i(b))); - - // Rounding narrowing shift right - // narrow = (int16_t)((mul + 16384) >> 15); - int16x4_t narrow_lo = vrshrn_n_s32(mul_lo, 15); - int16x4_t narrow_hi = vrshrn_n_s32(mul_hi, 15); - - // Join together - return vreinterpretq_m128i_s16(vcombine_s16(narrow_lo, narrow_hi)); -} - -// Vertically multiply each unsigned 8-bit integer from a with the corresponding -// signed 8-bit integer from b, producing intermediate signed 16-bit integers. -// Horizontally add adjacent pairs of intermediate signed 16-bit integers, -// and pack the saturated results in dst. -// -// FOR j := 0 to 7 -// i := j*16 -// dst[i+15:i] := Saturate_To_Int16( a[i+15:i+8]*b[i+15:i+8] + a[i+7:i]*b[i+7:i] ) -// ENDFOR -FORCE_INLINE __m128i _mm_maddubs_epi16(__m128i _a, __m128i _b) -{ - // This would be much simpler if x86 would choose to zero extend OR sign extend, - // not both. - // This could probably be optimized better. - uint16x8_t a = vreinterpretq_u16_m128i(_a); - int16x8_t b = vreinterpretq_s16_m128i(_b); - - // Zero extend a - int16x8_t a_odd = vreinterpretq_s16_u16(vshrq_n_u16(a, 8)); - int16x8_t a_even = vreinterpretq_s16_u16(vbicq_u16(a, vdupq_n_u16(0xff00))); - - // Sign extend by shifting left then shifting right. - int16x8_t b_even = vshrq_n_s16(vshlq_n_s16(b, 8), 8); - int16x8_t b_odd = vshrq_n_s16(b, 8); - - // multiply - int16x8_t prod1 = vmulq_s16(a_even, b_even); - int16x8_t prod2 = vmulq_s16(a_odd, b_odd); - - // saturated add - return vreinterpretq_m128i_s16(vqaddq_s16(prod1, prod2)); -} - -// Computes the absolute difference of the 16 unsigned 8-bit integers from a -// and the 16 unsigned 8-bit integers from b. -// -// Return Value -// Sums the upper 8 differences and lower 8 differences and packs the -// resulting 2 unsigned 16-bit integers into the upper and lower 64-bit -// elements. -// -// r0 := abs(a0 - b0) + abs(a1 - b1) +...+ abs(a7 - b7) -// r1 := 0x0 -// r2 := 0x0 -// r3 := 0x0 -// r4 := abs(a8 - b8) + abs(a9 - b9) +...+ abs(a15 - b15) -// r5 := 0x0 -// r6 := 0x0 -// r7 := 0x0 -FORCE_INLINE __m128i _mm_sad_epu8(__m128i a, __m128i b) -{ - uint16x8_t t = vpaddlq_u8(vabdq_u8((uint8x16_t) a, (uint8x16_t) b)); - uint16_t r0 = t[0] + t[1] + t[2] + t[3]; - uint16_t r4 = t[4] + t[5] + t[6] + t[7]; - uint16x8_t r = vsetq_lane_u16(r0, vdupq_n_u16(0), 0); - return (__m128i) vsetq_lane_u16(r4, r, 4); -} - -// Divides the four single-precision, floating-point values of a and b. -// -// r0 := a0 / b0 -// r1 := a1 / b1 -// r2 := a2 / b2 -// r3 := a3 / b3 -// -// https://msdn.microsoft.com/en-us/library/edaw8147(v=vs.100).aspx -FORCE_INLINE __m128 _mm_div_ps(__m128 a, __m128 b) -{ - float32x4_t recip0 = vrecpeq_f32(vreinterpretq_f32_m128(b)); - float32x4_t recip1 = - vmulq_f32(recip0, vrecpsq_f32(recip0, vreinterpretq_f32_m128(b))); - return vreinterpretq_m128_f32(vmulq_f32(vreinterpretq_f32_m128(a), recip1)); -} - -// Divides the scalar single-precision floating point value of a by b. -// https://msdn.microsoft.com/en-us/library/4y73xa49(v=vs.100).aspx -FORCE_INLINE __m128 _mm_div_ss(__m128 a, __m128 b) -{ - float32_t value = - vgetq_lane_f32(vreinterpretq_f32_m128(_mm_div_ps(a, b)), 0); - return vreinterpretq_m128_f32( - vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0)); -} - -// This version does additional iterations to improve accuracy. Between 1 and 4 -// recommended. Computes the approximations of reciprocals of the four -// single-precision, floating-point values of a. -// https://msdn.microsoft.com/en-us/library/vstudio/796k1tty(v=vs.100).aspx -FORCE_INLINE __m128 recipq_newton(__m128 in, int n) -{ - int i; - float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(in)); - for (i = 0; i < n; ++i) { - recip = - vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in))); - } - return vreinterpretq_m128_f32(recip); -} - -// Computes the approximations of reciprocals of the four single-precision, -// floating-point values of a. -// https://msdn.microsoft.com/en-us/library/vstudio/796k1tty(v=vs.100).aspx -FORCE_INLINE __m128 _mm_rcp_ps(__m128 in) -{ - float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(in)); - recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in))); - return vreinterpretq_m128_f32(recip); -} - -// Computes the approximations of square roots of the four single-precision, -// floating-point values of a. First computes reciprocal square roots and then -// reciprocals of the four values. -// -// r0 := sqrt(a0) -// r1 := sqrt(a1) -// r2 := sqrt(a2) -// r3 := sqrt(a3) -// -// https://msdn.microsoft.com/en-us/library/vstudio/8z67bwwk(v=vs.100).aspx -FORCE_INLINE __m128 _mm_sqrt_ps(__m128 in) -{ - float32x4_t recipsq = vrsqrteq_f32(vreinterpretq_f32_m128(in)); - float32x4_t sq = vrecpeq_f32(recipsq); - // ??? use step versions of both sqrt and recip for better accuracy? - return vreinterpretq_m128_f32(sq); -} - -// Computes the approximation of the square root of the scalar single-precision -// floating point value of in. -// https://msdn.microsoft.com/en-us/library/ahfsc22d(v=vs.100).aspx -FORCE_INLINE __m128 _mm_sqrt_ss(__m128 in) -{ - float32_t value = - vgetq_lane_f32(vreinterpretq_f32_m128(_mm_sqrt_ps(in)), 0); - return vreinterpretq_m128_f32( - vsetq_lane_f32(value, vreinterpretq_f32_m128(in), 0)); -} - -// Computes the approximations of the reciprocal square roots of the four -// single-precision floating point values of in. -// https://msdn.microsoft.com/en-us/library/22hfsh53(v=vs.100).aspx -FORCE_INLINE __m128 _mm_rsqrt_ps(__m128 in) -{ - return vreinterpretq_m128_f32(vrsqrteq_f32(vreinterpretq_f32_m128(in))); -} - -// Computes the maximums of the four single-precision, floating-point values of -// a and b. -// https://msdn.microsoft.com/en-us/library/vstudio/ff5d607a(v=vs.100).aspx -FORCE_INLINE __m128 _mm_max_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_f32( - vmaxq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// Computes the minima of the four single-precision, floating-point values of a -// and b. -// https://msdn.microsoft.com/en-us/library/vstudio/wh13kadz(v=vs.100).aspx -FORCE_INLINE __m128 _mm_min_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_f32( - vminq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// Computes the maximum of the two lower scalar single-precision floating point -// values of a and b. -// https://msdn.microsoft.com/en-us/library/s6db5esz(v=vs.100).aspx -FORCE_INLINE __m128 _mm_max_ss(__m128 a, __m128 b) -{ - float32_t value = vgetq_lane_f32( - vmaxq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)), 0); - return vreinterpretq_m128_f32( - vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0)); -} - -// Computes the minimum of the two lower scalar single-precision floating point -// values of a and b. -// https://msdn.microsoft.com/en-us/library/0a9y7xaa(v=vs.100).aspx -FORCE_INLINE __m128 _mm_min_ss(__m128 a, __m128 b) -{ - float32_t value = vgetq_lane_f32( - vminq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)), 0); - return vreinterpretq_m128_f32( - vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0)); -} - -// Computes the pairwise maxima of the 16 unsigned 8-bit integers from a and the -// 16 unsigned 8-bit integers from b. -// https://msdn.microsoft.com/en-us/library/st6634za(v=vs.100).aspx -FORCE_INLINE __m128i _mm_max_epu8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u8( - vmaxq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); -} - -// Computes the pairwise minima of the 16 unsigned 8-bit integers from a and the -// 16 unsigned 8-bit integers from b. -// https://msdn.microsoft.com/ko-kr/library/17k8cf58(v=vs.100).aspxx -FORCE_INLINE __m128i _mm_min_epu8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u8( - vminq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); -} - -// Computes the pairwise minima of the 8 signed 16-bit integers from a and the 8 -// signed 16-bit integers from b. -// https://msdn.microsoft.com/en-us/library/vstudio/6te997ew(v=vs.100).aspx -FORCE_INLINE __m128i _mm_min_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s16( - vminq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - -// Computes the pairwise maxima of the 8 signed 16-bit integers from a and the 8 -// signed 16-bit integers from b. -// https://msdn.microsoft.com/en-us/LIBRary/3x060h7c(v=vs.100).aspx -FORCE_INLINE __m128i _mm_max_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s16( - vmaxq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - -// epi versions of min/max -// Computes the pariwise maximums of the four signed 32-bit integer values of a -// and b. -// -// A 128-bit parameter that can be defined with the following equations: -// r0 := (a0 > b0) ? a0 : b0 -// r1 := (a1 > b1) ? a1 : b1 -// r2 := (a2 > b2) ? a2 : b2 -// r3 := (a3 > b3) ? a3 : b3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/bb514055(v=vs.100).aspx -FORCE_INLINE __m128i _mm_max_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s32( - vmaxq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Computes the pariwise minima of the four signed 32-bit integer values of a -// and b. -// -// A 128-bit parameter that can be defined with the following equations: -// r0 := (a0 < b0) ? a0 : b0 -// r1 := (a1 < b1) ? a1 : b1 -// r2 := (a2 < b2) ? a2 : b2 -// r3 := (a3 < b3) ? a3 : b3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/bb531476(v=vs.100).aspx -FORCE_INLINE __m128i _mm_min_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s32( - vminq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Multiplies the 8 signed 16-bit integers from a by the 8 signed 16-bit -// integers from b. -// -// r0 := (a0 * b0)[31:16] -// r1 := (a1 * b1)[31:16] -// ... -// r7 := (a7 * b7)[31:16] -// -// https://msdn.microsoft.com/en-us/library/vstudio/59hddw1d(v=vs.100).aspx -FORCE_INLINE __m128i _mm_mulhi_epi16(__m128i a, __m128i b) -{ - /* FIXME: issue with large values because of result saturation */ - // int16x8_t ret = vqdmulhq_s16(vreinterpretq_s16_m128i(a), - // vreinterpretq_s16_m128i(b)); /* =2*a*b */ return - // vreinterpretq_m128i_s16(vshrq_n_s16(ret, 1)); - int16x4_t a3210 = vget_low_s16(vreinterpretq_s16_m128i(a)); - int16x4_t b3210 = vget_low_s16(vreinterpretq_s16_m128i(b)); - int32x4_t ab3210 = vmull_s16(a3210, b3210); /* 3333222211110000 */ - int16x4_t a7654 = vget_high_s16(vreinterpretq_s16_m128i(a)); - int16x4_t b7654 = vget_high_s16(vreinterpretq_s16_m128i(b)); - int32x4_t ab7654 = vmull_s16(a7654, b7654); /* 7777666655554444 */ - uint16x8x2_t r = - vuzpq_u16(vreinterpretq_u16_s32(ab3210), vreinterpretq_u16_s32(ab7654)); - return vreinterpretq_m128i_u16(r.val[1]); -} - -// Computes pairwise add of each argument as single-precision, floating-point -// values a and b. -// https://msdn.microsoft.com/en-us/library/yd9wecaa.aspx -FORCE_INLINE __m128 _mm_hadd_ps(__m128 a, __m128 b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128_f32(vpaddq_f32( - vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); // AArch64 -#else - float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); - float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); - float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); - float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); - return vreinterpretq_m128_f32( - vcombine_f32(vpadd_f32(a10, a32), vpadd_f32(b10, b32))); -#endif -} - -// Computes pairwise add of each argument as a 16-bit signed or unsigned integer -// values a and b. -FORCE_INLINE __m128i _mm_hadd_epi16(__m128i _a, __m128i _b) -{ - int16x8_t a = vreinterpretq_s16_m128i(_a); - int16x8_t b = vreinterpretq_s16_m128i(_b); -#if defined(__aarch64__) - return vreinterpretq_m128i_s16(vpaddq_s16(a, b)); -#else - return vreinterpretq_m128i_s16( - vcombine_s16( - vpadd_s16(vget_low_s16(a), vget_high_s16(a)), - vpadd_s16(vget_low_s16(b), vget_high_s16(b)) - ) - ); -#endif -} - -// Computes pairwise difference of each argument as a 16-bit signed or unsigned integer -// values a and b. -FORCE_INLINE __m128i _mm_hsub_epi16(__m128i _a, __m128i _b) -{ - int32x4_t a = vreinterpretq_s32_m128i(_a); - int32x4_t b = vreinterpretq_s32_m128i(_b); - // Interleave using vshrn/vmovn - // [a0|a2|a4|a6|b0|b2|b4|b6] - // [a1|a3|a5|a7|b1|b3|b5|b7] - int16x8_t ab0246 = vcombine_s16(vmovn_s32(a), vmovn_s32(b)); - int16x8_t ab1357 = vcombine_s16(vshrn_n_s32(a, 16), vshrn_n_s32(b, 16)); - // Subtract - return vreinterpretq_m128i_s16(vsubq_s16(ab0246, ab1357)); -} - -// Computes saturated pairwise sub of each argument as a 16-bit signed -// integer values a and b. -FORCE_INLINE __m128i _mm_hadds_epi16(__m128i _a, __m128i _b) -{ - int32x4_t a = vreinterpretq_s32_m128i(_a); - int32x4_t b = vreinterpretq_s32_m128i(_b); - // Interleave using vshrn/vmovn - // [a0|a2|a4|a6|b0|b2|b4|b6] - // [a1|a3|a5|a7|b1|b3|b5|b7] - int16x8_t ab0246 = vcombine_s16(vmovn_s32(a), vmovn_s32(b)); - int16x8_t ab1357 = vcombine_s16(vshrn_n_s32(a, 16), vshrn_n_s32(b, 16)); - // Saturated add - return vreinterpretq_m128i_s16(vqaddq_s16(ab0246, ab1357)); -} - -// Computes saturated pairwise difference of each argument as a 16-bit signed -// integer values a and b. -FORCE_INLINE __m128i _mm_hsubs_epi16(__m128i _a, __m128i _b) -{ - int32x4_t a = vreinterpretq_s32_m128i(_a); - int32x4_t b = vreinterpretq_s32_m128i(_b); - // Interleave using vshrn/vmovn - // [a0|a2|a4|a6|b0|b2|b4|b6] - // [a1|a3|a5|a7|b1|b3|b5|b7] - int16x8_t ab0246 = vcombine_s16(vmovn_s32(a), vmovn_s32(b)); - int16x8_t ab1357 = vcombine_s16(vshrn_n_s32(a, 16), vshrn_n_s32(b, 16)); - // Saturated subtract - return vreinterpretq_m128i_s16(vqsubq_s16(ab0246, ab1357)); -} - -// Computes pairwise add of each argument as a 32-bit signed or unsigned integer -// values a and b. -FORCE_INLINE __m128i _mm_hadd_epi32(__m128i _a, __m128i _b) -{ - int32x4_t a = vreinterpretq_s32_m128i(_a); - int32x4_t b = vreinterpretq_s32_m128i(_b); - return vreinterpretq_m128i_s32( - vcombine_s32( - vpadd_s32(vget_low_s32(a), vget_high_s32(a)), - vpadd_s32(vget_low_s32(b), vget_high_s32(b)) - ) - ); -} - -// Computes pairwise difference of each argument as a 32-bit signed or unsigned integer -// values a and b. -FORCE_INLINE __m128i _mm_hsub_epi32(__m128i _a, __m128i _b) -{ - int64x2_t a = vreinterpretq_s64_m128i(_a); - int64x2_t b = vreinterpretq_s64_m128i(_b); - // Interleave using vshrn/vmovn - // [a0|a2|b0|b2] - // [a1|a2|b1|b3] - int32x4_t ab02 = vcombine_s32(vmovn_s64(a), vmovn_s64(b)); - int32x4_t ab13 = vcombine_s32(vshrn_n_s64(a, 32), vshrn_n_s64(b, 32)); - // Subtract - return vreinterpretq_m128i_s32(vsubq_s32(ab02, ab13)); -} - -// ****************************************** -// Compare operations -// ****************************************** - -// Compares for less than -// https://msdn.microsoft.com/en-us/library/vstudio/f330yhc8(v=vs.100).aspx -FORCE_INLINE __m128 _mm_cmplt_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_u32( - vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// Compares for greater than. -// -// r0 := (a0 > b0) ? 0xffffffff : 0x0 -// r1 := (a1 > b1) ? 0xffffffff : 0x0 -// r2 := (a2 > b2) ? 0xffffffff : 0x0 -// r3 := (a3 > b3) ? 0xffffffff : 0x0 -// -// https://msdn.microsoft.com/en-us/library/vstudio/11dy102s(v=vs.100).aspx -FORCE_INLINE __m128 _mm_cmpgt_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_u32( - vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// Compares for greater than or equal. -// https://msdn.microsoft.com/en-us/library/vstudio/fs813y2t(v=vs.100).aspx -FORCE_INLINE __m128 _mm_cmpge_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_u32( - vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// Compares for less than or equal. -// -// r0 := (a0 <= b0) ? 0xffffffff : 0x0 -// r1 := (a1 <= b1) ? 0xffffffff : 0x0 -// r2 := (a2 <= b2) ? 0xffffffff : 0x0 -// r3 := (a3 <= b3) ? 0xffffffff : 0x0 -// -// https://msdn.microsoft.com/en-us/library/vstudio/1s75w83z(v=vs.100).aspx -FORCE_INLINE __m128 _mm_cmple_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_u32( - vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// Compares for equality. -// https://msdn.microsoft.com/en-us/library/vstudio/36aectz5(v=vs.100).aspx -FORCE_INLINE __m128 _mm_cmpeq_ps(__m128 a, __m128 b) -{ - return vreinterpretq_m128_u32( - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -} - -// Compares the 16 signed or unsigned 8-bit integers in a and the 16 signed or -// unsigned 8-bit integers in b for equality. -// https://msdn.microsoft.com/en-us/library/windows/desktop/bz5xk21a(v=vs.90).aspx -FORCE_INLINE __m128i _mm_cmpeq_epi8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u8( - vceqq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); -} - -// Compares the 8 signed or unsigned 16-bit integers in a and the 8 signed or -// unsigned 16-bit integers in b for equality. -// https://msdn.microsoft.com/en-us/library/2ay060te(v=vs.100).aspx -FORCE_INLINE __m128i _mm_cmpeq_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u16( - vceqq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - -// Compare packed 32-bit integers in a and b for equality, and store the results -// in dst -FORCE_INLINE __m128i _mm_cmpeq_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u32( - vceqq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Compare packed 64-bit integers in a and b for equality, and store the results -// in dst -FORCE_INLINE __m128i _mm_cmpeq_epi64(__m128i a, __m128i b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128i_u64( - vceqq_u64(vreinterpretq_u64_m128i(a), vreinterpretq_u64_m128i(b))); -#else - // ARMv7 lacks vceqq_u64 - // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi) - uint32x4_t cmp = vceqq_u32(vreinterpretq_u32_m128i(a), vreinterpretq_u32_m128i(b)); - uint32x4_t swapped = vrev64q_u32(cmp); - return vreinterpretq_m128i_u32(vandq_u32(cmp, swapped)); -#endif -} - -// Compares the 16 signed 8-bit integers in a and the 16 signed 8-bit integers -// in b for lesser than. -// https://msdn.microsoft.com/en-us/library/windows/desktop/9s46csht(v=vs.90).aspx -FORCE_INLINE __m128i _mm_cmplt_epi8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u8( - vcltq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); -} - -// Compares the 16 signed 8-bit integers in a and the 16 signed 8-bit integers -// in b for greater than. -// -// r0 := (a0 > b0) ? 0xff : 0x0 -// r1 := (a1 > b1) ? 0xff : 0x0 -// ... -// r15 := (a15 > b15) ? 0xff : 0x0 -// -// https://msdn.microsoft.com/zh-tw/library/wf45zt2b(v=vs.100).aspx -FORCE_INLINE __m128i _mm_cmpgt_epi8(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u8( - vcgtq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); -} - -// Compares the 8 signed 16-bit integers in a and the 8 signed 16-bit integers -// in b for less than. -// -// r0 := (a0 < b0) ? 0xffff : 0x0 -// r1 := (a1 < b1) ? 0xffff : 0x0 -// ... -// r7 := (a7 < b7) ? 0xffff : 0x0 -// -// https://technet.microsoft.com/en-us/library/t863edb2(v=vs.100).aspx -FORCE_INLINE __m128i _mm_cmplt_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u16( - vcltq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - -// Compares the 8 signed 16-bit integers in a and the 8 signed 16-bit integers -// in b for greater than. -// -// r0 := (a0 > b0) ? 0xffff : 0x0 -// r1 := (a1 > b1) ? 0xffff : 0x0 -// ... -// r7 := (a7 > b7) ? 0xffff : 0x0 -// -// https://technet.microsoft.com/en-us/library/xd43yfsa(v=vs.100).aspx -FORCE_INLINE __m128i _mm_cmpgt_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u16( - vcgtq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -} - - -// Compares the 4 signed 32-bit integers in a and the 4 signed 32-bit integers -// in b for less than. -// https://msdn.microsoft.com/en-us/library/vstudio/4ak0bf5d(v=vs.100).aspx -FORCE_INLINE __m128i _mm_cmplt_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u32( - vcltq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Compares the 4 signed 32-bit integers in a and the 4 signed 32-bit integers -// in b for greater than. -// https://msdn.microsoft.com/en-us/library/vstudio/1s9f2z0y(v=vs.100).aspx -FORCE_INLINE __m128i _mm_cmpgt_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u32( - vcgtq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -} - -// Compares the 2 signed 64-bit integers in a and the 2 signed 64-bit integers -// in b for greater than. -FORCE_INLINE __m128i _mm_cmpgt_epi64(__m128i a, __m128i b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128i_u64( - vcgtq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); -#else - // ARMv7 lacks vcgtq_s64. - // This is based off of Clang's SSE2 polyfill: - // (a > b) -> ((a_hi > b_hi) || (a_lo > b_lo && a_hi == b_hi)) - - // Mask the sign bit out since we need a signed AND an unsigned comparison - // and it is ugly to try and split them. - int32x4_t mask = vreinterpretq_s32_s64(vdupq_n_s64(0x80000000ull)); - int32x4_t a_mask = veorq_s32(vreinterpretq_s32_m128i(a), mask); - int32x4_t b_mask = veorq_s32(vreinterpretq_s32_m128i(b), mask); - // Check if a > b - int64x2_t greater = vreinterpretq_s64_u32(vcgtq_s32(a_mask, b_mask)); - // Copy upper mask to lower mask - // a_hi > b_hi - int64x2_t gt_hi = vshrq_n_s64(greater, 63); - // Copy lower mask to upper mask - // a_lo > b_lo - int64x2_t gt_lo = vsliq_n_s64(greater, greater, 32); - // Compare for equality - int64x2_t equal = vreinterpretq_s64_u32(vceqq_s32(a_mask, b_mask)); - // Copy upper mask to lower mask - // a_hi == b_hi - int64x2_t eq_hi = vshrq_n_s64(equal, 63); - // a_hi > b_hi || (a_lo > b_lo && a_hi == b_hi) - int64x2_t ret = vorrq_s64(gt_hi, vandq_s64(gt_lo, eq_hi)); - return vreinterpretq_m128i_s64(ret); -#endif -} -// Compares the four 32-bit floats in a and b to check if any values are NaN. -// Ordered compare between each value returns true for "orderable" and false for -// "not orderable" (NaN). -// https://msdn.microsoft.com/en-us/library/vstudio/0h9w00fx(v=vs.100).aspx see -// also: -// http://stackoverflow.com/questions/8627331/what-does-ordered-unordered-comparison-mean -// http://stackoverflow.com/questions/29349621/neon-isnanval-intrinsics -FORCE_INLINE __m128 _mm_cmpord_ps(__m128 a, __m128 b) -{ - // Note: NEON does not have ordered compare builtin - // Need to compare a eq a and b eq b to check for NaN - // Do AND of results to get final - uint32x4_t ceqaa = - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); - uint32x4_t ceqbb = - vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); - return vreinterpretq_m128_u32(vandq_u32(ceqaa, ceqbb)); -} - -// Compares the lower single-precision floating point scalar values of a and b -// using a less than operation. : -// https://msdn.microsoft.com/en-us/library/2kwe606b(v=vs.90).aspx Important -// note!! The documentation on MSDN is incorrect! If either of the values is a -// NAN the docs say you will get a one, but in fact, it will return a zero!! -FORCE_INLINE int _mm_comilt_ss(__m128 a, __m128 b) -{ - uint32x4_t a_not_nan = - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); - uint32x4_t b_not_nan = - vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); - uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); - uint32x4_t a_lt_b = - vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); - return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_lt_b), 0) != 0) ? 1 : 0; -} - -// Compares the lower single-precision floating point scalar values of a and b -// using a greater than operation. : -// https://msdn.microsoft.com/en-us/library/b0738e0t(v=vs.100).aspx -FORCE_INLINE int _mm_comigt_ss(__m128 a, __m128 b) -{ - // return vgetq_lane_u32(vcgtq_f32(vreinterpretq_f32_m128(a), - // vreinterpretq_f32_m128(b)), 0); - uint32x4_t a_not_nan = - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); - uint32x4_t b_not_nan = - vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); - uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); - uint32x4_t a_gt_b = - vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); - return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_gt_b), 0) != 0) ? 1 : 0; -} - -// Compares the lower single-precision floating point scalar values of a and b -// using a less than or equal operation. : -// https://msdn.microsoft.com/en-us/library/1w4t7c57(v=vs.90).aspx -FORCE_INLINE int _mm_comile_ss(__m128 a, __m128 b) -{ - // return vgetq_lane_u32(vcleq_f32(vreinterpretq_f32_m128(a), - // vreinterpretq_f32_m128(b)), 0); - uint32x4_t a_not_nan = - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); - uint32x4_t b_not_nan = - vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); - uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); - uint32x4_t a_le_b = - vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); - return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_le_b), 0) != 0) ? 1 : 0; -} - -// Compares the lower single-precision floating point scalar values of a and b -// using a greater than or equal operation. : -// https://msdn.microsoft.com/en-us/library/8t80des6(v=vs.100).aspx -FORCE_INLINE int _mm_comige_ss(__m128 a, __m128 b) -{ - // return vgetq_lane_u32(vcgeq_f32(vreinterpretq_f32_m128(a), - // vreinterpretq_f32_m128(b)), 0); - uint32x4_t a_not_nan = - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); - uint32x4_t b_not_nan = - vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); - uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); - uint32x4_t a_ge_b = - vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); - return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_ge_b), 0) != 0) ? 1 : 0; -} - -// Compares the lower single-precision floating point scalar values of a and b -// using an equality operation. : -// https://msdn.microsoft.com/en-us/library/93yx2h2b(v=vs.100).aspx -FORCE_INLINE int _mm_comieq_ss(__m128 a, __m128 b) -{ - // return vgetq_lane_u32(vceqq_f32(vreinterpretq_f32_m128(a), - // vreinterpretq_f32_m128(b)), 0); - uint32x4_t a_not_nan = - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); - uint32x4_t b_not_nan = - vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); - uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); - uint32x4_t a_eq_b = - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); - return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_eq_b), 0) != 0) ? 1 : 0; -} - -// Compares the lower single-precision floating point scalar values of a and b -// using an inequality operation. : -// https://msdn.microsoft.com/en-us/library/bafh5e0a(v=vs.90).aspx -FORCE_INLINE int _mm_comineq_ss(__m128 a, __m128 b) -{ - // return !vgetq_lane_u32(vceqq_f32(vreinterpretq_f32_m128(a), - // vreinterpretq_f32_m128(b)), 0); - uint32x4_t a_not_nan = - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); - uint32x4_t b_not_nan = - vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); - uint32x4_t a_or_b_nan = vmvnq_u32(vandq_u32(a_not_nan, b_not_nan)); - uint32x4_t a_neq_b = vmvnq_u32( - vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); - return (vgetq_lane_u32(vorrq_u32(a_or_b_nan, a_neq_b), 0) != 0) ? 1 : 0; -} - -// according to the documentation, these intrinsics behave the same as the -// non-'u' versions. We'll just alias them here. -#define _mm_ucomilt_ss _mm_comilt_ss -#define _mm_ucomile_ss _mm_comile_ss -#define _mm_ucomigt_ss _mm_comigt_ss -#define _mm_ucomige_ss _mm_comige_ss -#define _mm_ucomieq_ss _mm_comieq_ss -#define _mm_ucomineq_ss _mm_comineq_ss - -// ****************************************** -// Conversions -// ****************************************** - -// Converts the four single-precision, floating-point values of a to signed -// 32-bit integer values using truncate. -// https://msdn.microsoft.com/en-us/library/vstudio/1h005y6x(v=vs.100).aspx -FORCE_INLINE __m128i _mm_cvttps_epi32(__m128 a) -{ - return vreinterpretq_m128i_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a))); -} - -// Converts the four signed 32-bit integer values of a to single-precision, -// floating-point values -// https://msdn.microsoft.com/en-us/library/vstudio/36bwxcx5(v=vs.100).aspx -FORCE_INLINE __m128 _mm_cvtepi32_ps(__m128i a) -{ - return vreinterpretq_m128_f32(vcvtq_f32_s32(vreinterpretq_s32_m128i(a))); -} - -// Converts the four unsigned 8-bit integers in the lower 16 bits to four -// unsigned 32-bit integers. -FORCE_INLINE __m128i _mm_cvtepu8_epi16(__m128i a) -{ - uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx DCBA */ - uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0D0C 0B0A */ - return vreinterpretq_m128i_u16(u16x8); -} - -// Converts the four unsigned 8-bit integers in the lower 32 bits to four -// unsigned 32-bit integers. -// https://msdn.microsoft.com/en-us/library/bb531467%28v=vs.100%29.aspx -FORCE_INLINE __m128i _mm_cvtepu8_epi32(__m128i a) -{ - uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx DCBA */ - uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0D0C 0B0A */ - uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000D 000C 000B 000A */ - return vreinterpretq_m128i_u32(u32x4); -} - -// Converts the two unsigned 8-bit integers in the lower 16 bits to two -// unsigned 64-bit integers. -FORCE_INLINE __m128i _mm_cvtepu8_epi64(__m128i a) -{ - uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx xxBA */ - uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0x0x 0B0A */ - uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */ - uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */ - return vreinterpretq_m128i_u64(u64x2); -} - -// Converts the four unsigned 8-bit integers in the lower 16 bits to four -// unsigned 32-bit integers. -FORCE_INLINE __m128i _mm_cvtepi8_epi16(__m128i a) -{ - int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */ - int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */ - return vreinterpretq_m128i_s16(s16x8); -} - -// Converts the four unsigned 8-bit integers in the lower 32 bits to four -// unsigned 32-bit integers. -FORCE_INLINE __m128i _mm_cvtepi8_epi32(__m128i a) -{ - int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */ - int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */ - int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000D 000C 000B 000A */ - return vreinterpretq_m128i_s32(s32x4); -} - -// Converts the two signed 8-bit integers in the lower 32 bits to four -// signed 64-bit integers. -FORCE_INLINE __m128i _mm_cvtepi8_epi64(__m128i a) -{ - int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx xxBA */ - int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0x0x 0B0A */ - int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */ - int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */ - return vreinterpretq_m128i_s64(s64x2); -} - -// Converts the four signed 16-bit integers in the lower 64 bits to four signed -// 32-bit integers. -FORCE_INLINE __m128i _mm_cvtepi16_epi32(__m128i a) -{ - return vreinterpretq_m128i_s32( - vmovl_s16(vget_low_s16(vreinterpretq_s16_m128i(a)))); -} - -// Converts the two signed 16-bit integers in the lower 32 bits two signed -// 32-bit integers. -FORCE_INLINE __m128i _mm_cvtepi16_epi64(__m128i a) -{ - int16x8_t s16x8 = vreinterpretq_s16_m128i(a); /* xxxx xxxx xxxx 0B0A */ - int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */ - int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */ - return vreinterpretq_m128i_s64(s64x2); -} - -// Converts the four unsigned 16-bit integers in the lower 64 bits to four unsigned -// 32-bit integers. -FORCE_INLINE __m128i _mm_cvtepu16_epi32(__m128i a) -{ - return vreinterpretq_m128i_u32( - vmovl_u16(vget_low_u16(vreinterpretq_u16_m128i(a)))); -} - -// Converts the two unsigned 16-bit integers in the lower 32 bits to two unsigned -// 64-bit integers. -FORCE_INLINE __m128i _mm_cvtepu16_epi64(__m128i a) -{ - uint16x8_t u16x8 = vreinterpretq_u16_m128i(a); /* xxxx xxxx xxxx 0B0A */ - uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */ - uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */ - return vreinterpretq_m128i_u64(u64x2); -} - -// Converts the two unsigned 32-bit integers in the lower 64 bits to two unsigned -// 64-bit integers. -FORCE_INLINE __m128i _mm_cvtepu32_epi64(__m128i a) -{ - return vreinterpretq_m128i_u64( - vmovl_u32(vget_low_u32(vreinterpretq_u32_m128i(a)))); -} - -// Converts the two signed 32-bit integers in the lower 64 bits to two signed -// 64-bit integers. -FORCE_INLINE __m128i _mm_cvtepi32_epi64(__m128i a) -{ - return vreinterpretq_m128i_s64( - vmovl_s32(vget_low_s32(vreinterpretq_s32_m128i(a)))); -} - -// Converts the four single-precision, floating-point values of a to signed -// 32-bit integer values. -// -// r0 := (int) a0 -// r1 := (int) a1 -// r2 := (int) a2 -// r3 := (int) a3 -// -// https://msdn.microsoft.com/en-us/library/vstudio/xdc42k5e(v=vs.100).aspx -// *NOTE*. The default rounding mode on SSE is 'round to even', which ArmV7-A -// does not support! It is supported on ARMv8-A however. -FORCE_INLINE __m128i _mm_cvtps_epi32(__m128 a) -{ -#if defined(__aarch64__) - return vreinterpretq_m128i_s32(vcvtnq_s32_f32(a)); -#else - uint32x4_t signmask = vdupq_n_u32(0x80000000); - float32x4_t half = vbslq_f32(signmask, vreinterpretq_f32_m128(a), - vdupq_n_f32(0.5f)); /* +/- 0.5 */ - int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32( - vreinterpretq_f32_m128(a), half)); /* round to integer: [a + 0.5]*/ - int32x4_t r_trunc = - vcvtq_s32_f32(vreinterpretq_f32_m128(a)); /* truncate to integer: [a] */ - int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32( - vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31)); /* 1 or 0 */ - int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone), - vdupq_n_s32(1)); /* ([a] + {0,1}) & ~1 */ - float32x4_t delta = vsubq_f32( - vreinterpretq_f32_m128(a), - vcvtq_f32_s32(r_trunc)); /* compute delta: delta = (a - [a]) */ - uint32x4_t is_delta_half = vceqq_f32(delta, half); /* delta == +/- 0.5 */ - return vreinterpretq_m128i_s32(vbslq_s32(is_delta_half, r_even, r_normal)); -#endif -} - -// Moves the least significant 32 bits of a to a 32-bit integer. -// https://msdn.microsoft.com/en-us/library/5z7a9642%28v=vs.90%29.aspx -FORCE_INLINE int _mm_cvtsi128_si32(__m128i a) -{ - return vgetq_lane_s32(vreinterpretq_s32_m128i(a), 0); -} - -// Extracts the low order 64-bit integer from the parameter. -// https://msdn.microsoft.com/en-us/library/bb531384(v=vs.120).aspx -FORCE_INLINE uint64_t _mm_cvtsi128_si64(__m128i a) -{ - return vgetq_lane_s64(vreinterpretq_s64_m128i(a), 0); -} - -// Moves 32-bit integer a to the least significant 32 bits of an __m128 object, -// zero extending the upper bits. -// -// r0 := a -// r1 := 0x0 -// r2 := 0x0 -// r3 := 0x0 -// -// https://msdn.microsoft.com/en-us/library/ct3539ha%28v=vs.90%29.aspx -FORCE_INLINE __m128i _mm_cvtsi32_si128(int a) -{ - return vreinterpretq_m128i_s32(vsetq_lane_s32(a, vdupq_n_s32(0), 0)); -} - -// Moves 64-bit integer a to the least significant 64 bits of an __m128 object, -// zero extending the upper bits. -// -// r0 := a -// r1 := 0x0 -FORCE_INLINE __m128i _mm_cvtsi64_si128(int64_t a) -{ - return vreinterpretq_m128i_s64(vsetq_lane_s64(a, vdupq_n_s64(0), 0)); -} - -// Applies a type cast to reinterpret four 32-bit floating point values passed -// in as a 128-bit parameter as packed 32-bit integers. -// https://msdn.microsoft.com/en-us/library/bb514099.aspx -FORCE_INLINE __m128i _mm_castps_si128(__m128 a) -{ - return vreinterpretq_m128i_s32(vreinterpretq_s32_m128(a)); -} - -// Applies a type cast to reinterpret four 32-bit integers passed in as a -// 128-bit parameter as packed 32-bit floating point values. -// https://msdn.microsoft.com/en-us/library/bb514029.aspx -FORCE_INLINE __m128 _mm_castsi128_ps(__m128i a) -{ - return vreinterpretq_m128_s32(vreinterpretq_s32_m128i(a)); -} - -// Loads 128-bit value. : -// https://msdn.microsoft.com/en-us/library/atzzad1h(v=vs.80).aspx -FORCE_INLINE __m128i _mm_load_si128(const __m128i *p) -{ - return vreinterpretq_m128i_s32(vld1q_s32((const int32_t *) p)); -} - -// Loads 128-bit value. : -// https://msdn.microsoft.com/zh-cn/library/f4k12ae8(v=vs.90).aspx -FORCE_INLINE __m128i _mm_loadu_si128(const __m128i *p) -{ - return vreinterpretq_m128i_s32(vld1q_s32((const int32_t *) p)); -} - -// _mm_lddqu_si128 functions the same as _mm_loadu_si128. -#define _mm_lddqu_si128 _mm_loadu_si128 - -// ****************************************** -// Miscellaneous Operations -// ****************************************** - - -// Shifts the 8 signed 16-bit integers in a right by count bits while shifting -// in the sign bit. -// -// r0 := a0 >> count -// r1 := a1 >> count -// ... -// r7 := a7 >> count -// -// https://msdn.microsoft.com/en-us/library/3c9997dk(v%3dvs.90).aspx -FORCE_INLINE __m128i _mm_sra_epi16(__m128i a, __m128i count) -{ - int64_t c = (int64_t) vget_low_s64((int64x2_t) count); - if (c > 15) - return _mm_cmplt_epi16(a, _mm_setzero_si128()); - return vreinterpretq_m128i_s16(vshlq_s16((int16x8_t) a, vdupq_n_s16(-c))); -} - -// Shifts the 4 signed 32-bit integers in a right by count bits while shifting -// in the sign bit. -// -// r0 := a0 >> count -// r1 := a1 >> count -// r2 := a2 >> count -// r3 := a3 >> count -// -// https://msdn.microsoft.com/en-us/library/ce40009e(v%3dvs.100).aspx -FORCE_INLINE __m128i _mm_sra_epi32(__m128i a, __m128i count) -{ - int64_t c = (int64_t) vget_low_s64((int64x2_t) count); - if (c > 31) - return _mm_cmplt_epi32(a, _mm_setzero_si128()); - return vreinterpretq_m128i_s32(vshlq_s32((int32x4_t) a, vdupq_n_s32(-c))); -} - -// Packs the 16 signed 16-bit integers from a and b into 8-bit integers and -// saturates. -// https://msdn.microsoft.com/en-us/library/k4y4f7w5%28v=vs.90%29.aspx -FORCE_INLINE __m128i _mm_packs_epi16(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s8( - vcombine_s8(vqmovn_s16(vreinterpretq_s16_m128i(a)), - vqmovn_s16(vreinterpretq_s16_m128i(b)))); -} - -// Packs the 16 signed 16 - bit integers from a and b into 8 - bit unsigned -// integers and saturates. -// -// r0 := UnsignedSaturate(a0) -// r1 := UnsignedSaturate(a1) -// ... -// r7 := UnsignedSaturate(a7) -// r8 := UnsignedSaturate(b0) -// r9 := UnsignedSaturate(b1) -// ... -// r15 := UnsignedSaturate(b7) -// -// https://msdn.microsoft.com/en-us/library/07ad1wx4(v=vs.100).aspx -FORCE_INLINE __m128i _mm_packus_epi16(const __m128i a, const __m128i b) -{ - return vreinterpretq_m128i_u8( - vcombine_u8(vqmovun_s16(vreinterpretq_s16_m128i(a)), - vqmovun_s16(vreinterpretq_s16_m128i(b)))); -} - -// Packs the 8 signed 32-bit integers from a and b into signed 16-bit integers -// and saturates. -// -// r0 := SignedSaturate(a0) -// r1 := SignedSaturate(a1) -// r2 := SignedSaturate(a2) -// r3 := SignedSaturate(a3) -// r4 := SignedSaturate(b0) -// r5 := SignedSaturate(b1) -// r6 := SignedSaturate(b2) -// r7 := SignedSaturate(b3) -// -// https://msdn.microsoft.com/en-us/library/393t56f9%28v=vs.90%29.aspx -FORCE_INLINE __m128i _mm_packs_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_s16( - vcombine_s16(vqmovn_s32(vreinterpretq_s32_m128i(a)), - vqmovn_s32(vreinterpretq_s32_m128i(b)))); -} - -// Packs the 8 unsigned 32-bit integers from a and b into unsigned 16-bit integers -// and saturates. -// -// r0 := UnsignedSaturate(a0) -// r1 := UnsignedSaturate(a1) -// r2 := UnsignedSaturate(a2) -// r3 := UnsignedSaturate(a3) -// r4 := UnsignedSaturate(b0) -// r5 := UnsignedSaturate(b1) -// r6 := UnsignedSaturate(b2) -// r7 := UnsignedSaturate(b3) -FORCE_INLINE __m128i _mm_packus_epi32(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u16( - vcombine_u16(vqmovn_u32(vreinterpretq_u32_m128i(a)), - vqmovn_u32(vreinterpretq_u32_m128i(b)))); -} - -// Interleaves the lower 8 signed or unsigned 8-bit integers in a with the lower -// 8 signed or unsigned 8-bit integers in b. -// -// r0 := a0 -// r1 := b0 -// r2 := a1 -// r3 := b1 -// ... -// r14 := a7 -// r15 := b7 -// -// https://msdn.microsoft.com/en-us/library/xf7k860c%28v=vs.90%29.aspx -FORCE_INLINE __m128i _mm_unpacklo_epi8(__m128i a, __m128i b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128i_s8(vzip1q_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); -#else - int8x8_t a1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(a))); - int8x8_t b1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(b))); - int8x8x2_t result = vzip_s8(a1, b1); - return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1])); -#endif -} - -// Interleaves the lower 4 signed or unsigned 16-bit integers in a with the -// lower 4 signed or unsigned 16-bit integers in b. -// -// r0 := a0 -// r1 := b0 -// r2 := a1 -// r3 := b1 -// r4 := a2 -// r5 := b2 -// r6 := a3 -// r7 := b3 -// -// https://msdn.microsoft.com/en-us/library/btxb17bw%28v=vs.90%29.aspx -FORCE_INLINE __m128i _mm_unpacklo_epi16(__m128i a, __m128i b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128i_s16(vzip1q_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -#else - int16x4_t a1 = vget_low_s16(vreinterpretq_s16_m128i(a)); - int16x4_t b1 = vget_low_s16(vreinterpretq_s16_m128i(b)); - int16x4x2_t result = vzip_s16(a1, b1); - return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1])); -#endif -} - -// Interleaves the lower 2 signed or unsigned 32 - bit integers in a with the -// lower 2 signed or unsigned 32 - bit integers in b. -// -// r0 := a0 -// r1 := b0 -// r2 := a1 -// r3 := b1 -// -// https://msdn.microsoft.com/en-us/library/x8atst9d(v=vs.100).aspx -FORCE_INLINE __m128i _mm_unpacklo_epi32(__m128i a, __m128i b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128i_s32(vzip1q_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -#else - int32x2_t a1 = vget_low_s32(vreinterpretq_s32_m128i(a)); - int32x2_t b1 = vget_low_s32(vreinterpretq_s32_m128i(b)); - int32x2x2_t result = vzip_s32(a1, b1); - return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1])); -#endif -} - -FORCE_INLINE __m128i _mm_unpacklo_epi64(__m128i a, __m128i b) -{ - int64x1_t a_l = vget_low_s64(vreinterpretq_s64_m128i(a)); - int64x1_t b_l = vget_low_s64(vreinterpretq_s64_m128i(b)); - return vreinterpretq_m128i_s64(vcombine_s64(a_l, b_l)); -} - -// Selects and interleaves the lower two single-precision, floating-point values -// from a and b. -// -// r0 := a0 -// r1 := b0 -// r2 := a1 -// r3 := b1 -// -// https://msdn.microsoft.com/en-us/library/25st103b%28v=vs.90%29.aspx -FORCE_INLINE __m128 _mm_unpacklo_ps(__m128 a, __m128 b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128_f32(vzip1q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -#else - float32x2_t a1 = vget_low_f32(vreinterpretq_f32_m128(a)); - float32x2_t b1 = vget_low_f32(vreinterpretq_f32_m128(b)); - float32x2x2_t result = vzip_f32(a1, b1); - return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1])); -#endif -} - -// Selects and interleaves the upper two single-precision, floating-point values -// from a and b. -// -// r0 := a2 -// r1 := b2 -// r2 := a3 -// r3 := b3 -// -// https://msdn.microsoft.com/en-us/library/skccxx7d%28v=vs.90%29.aspx -FORCE_INLINE __m128 _mm_unpackhi_ps(__m128 a, __m128 b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128_f32(vzip2q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); -#else - float32x2_t a1 = vget_high_f32(vreinterpretq_f32_m128(a)); - float32x2_t b1 = vget_high_f32(vreinterpretq_f32_m128(b)); - float32x2x2_t result = vzip_f32(a1, b1); - return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1])); -#endif -} - -// Interleaves the upper 8 signed or unsigned 8-bit integers in a with the upper -// 8 signed or unsigned 8-bit integers in b. -// -// r0 := a8 -// r1 := b8 -// r2 := a9 -// r3 := b9 -// ... -// r14 := a15 -// r15 := b15 -// -// https://msdn.microsoft.com/en-us/library/t5h7783k(v=vs.100).aspx -FORCE_INLINE __m128i _mm_unpackhi_epi8(__m128i a, __m128i b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128i_s8(vzip2q_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); -#else - int8x8_t a1 = - vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(a))); - int8x8_t b1 = - vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(b))); - int8x8x2_t result = vzip_s8(a1, b1); - return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1])); -#endif -} - -// Interleaves the upper 4 signed or unsigned 16-bit integers in a with the -// upper 4 signed or unsigned 16-bit integers in b. -// -// r0 := a4 -// r1 := b4 -// r2 := a5 -// r3 := b5 -// r4 := a6 -// r5 := b6 -// r6 := a7 -// r7 := b7 -// -// https://msdn.microsoft.com/en-us/library/03196cz7(v=vs.100).aspx -FORCE_INLINE __m128i _mm_unpackhi_epi16(__m128i a, __m128i b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128i_s16(vzip2q_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); -#else - int16x4_t a1 = vget_high_s16(vreinterpretq_s16_m128i(a)); - int16x4_t b1 = vget_high_s16(vreinterpretq_s16_m128i(b)); - int16x4x2_t result = vzip_s16(a1, b1); - return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1])); -#endif -} - -// Interleaves the upper 2 signed or unsigned 32-bit integers in a with the -// upper 2 signed or unsigned 32-bit integers in b. -// https://msdn.microsoft.com/en-us/library/65sa7cbs(v=vs.100).aspx -FORCE_INLINE __m128i _mm_unpackhi_epi32(__m128i a, __m128i b) -{ -#if defined(__aarch64__) - return vreinterpretq_m128i_s32(vzip2q_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); -#else - int32x2_t a1 = vget_high_s32(vreinterpretq_s32_m128i(a)); - int32x2_t b1 = vget_high_s32(vreinterpretq_s32_m128i(b)); - int32x2x2_t result = vzip_s32(a1, b1); - return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1])); -#endif -} - -// Interleaves the upper signed or unsigned 64-bit integer in a with the -// upper signed or unsigned 64-bit integer in b. -// -// r0 := a1 -// r1 := b1 -FORCE_INLINE __m128i _mm_unpackhi_epi64(__m128i a, __m128i b) -{ - int64x1_t a_h = vget_high_s64(vreinterpretq_s64_m128i(a)); - int64x1_t b_h = vget_high_s64(vreinterpretq_s64_m128i(b)); - return vreinterpretq_m128i_s64(vcombine_s64(a_h, b_h)); -} - -// shift to right -// https://msdn.microsoft.com/en-us/library/bb514041(v=vs.120).aspx -// http://blog.csdn.net/hemmingway/article/details/44828303 -// Clang requires a macro here, as it is extremely picky about c being a literal. -#define _mm_alignr_epi8(a, b, c) ((__m128i) vextq_s8((int8x16_t) (b), (int8x16_t) (a), (c))) - -// Extracts the selected signed or unsigned 8-bit integer from a and zero -// extends. -// FORCE_INLINE int _mm_extract_epi8(__m128i a, __constrange(0,16) int imm) -#define _mm_extract_epi8(a, imm) \ - vgetq_lane_u8(vreinterpretq_u8_m128i(a), (imm)) - -// Inserts the least significant 8 bits of b into the selected 8-bit integer -// of a. -// FORCE_INLINE __m128i _mm_insert_epi8(__m128i a, const int b, -// __constrange(0,16) int imm) -#define _mm_insert_epi8(a, b, imm) \ - __extension__({ \ - vreinterpretq_m128i_s8( \ - vsetq_lane_s8((b), vreinterpretq_s8_m128i(a), (imm))); \ - }) - -// Extracts the selected signed or unsigned 16-bit integer from a and zero -// extends. -// https://msdn.microsoft.com/en-us/library/6dceta0c(v=vs.100).aspx -// FORCE_INLINE int _mm_extract_epi16(__m128i a, __constrange(0,8) int imm) -#define _mm_extract_epi16(a, imm) \ - vgetq_lane_u16(vreinterpretq_u16_m128i(a), (imm)) - -// Inserts the least significant 16 bits of b into the selected 16-bit integer -// of a. -// https://msdn.microsoft.com/en-us/library/kaze8hz1%28v=vs.100%29.aspx -// FORCE_INLINE __m128i _mm_insert_epi16(__m128i a, const int b, -// __constrange(0,8) int imm) -#define _mm_insert_epi16(a, b, imm) \ - __extension__({ \ - vreinterpretq_m128i_s16( \ - vsetq_lane_s16((b), vreinterpretq_s16_m128i(a), (imm))); \ - }) - -// Extracts the selected signed or unsigned 32-bit integer from a and zero -// extends. -// FORCE_INLINE int _mm_extract_epi32(__m128i a, __constrange(0,4) int imm) -#define _mm_extract_epi32(a, imm) \ - vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)) - -// Inserts the least significant 32 bits of b into the selected 32-bit integer -// of a. -// FORCE_INLINE __m128i _mm_insert_epi32(__m128i a, const int b, -// __constrange(0,4) int imm) -#define _mm_insert_epi32(a, b, imm) \ - __extension__({ \ - vreinterpretq_m128i_s32( \ - vsetq_lane_s32((b), vreinterpretq_s32_m128i(a), (imm))); \ - }) - - -// Extracts the selected signed or unsigned 64-bit integer from a and zero -// extends. -// FORCE_INLINE __int64 _mm_extract_epi64(__m128i a, __constrange(0,2) int imm) -#define _mm_extract_epi64(a, imm) \ - vgetq_lane_s64(vreinterpretq_s64_m128i(a), (imm)) - -// Inserts the least significant 64 bits of b into the selected 64-bit integer -// of a. -// FORCE_INLINE __m128i _mm_insert_epi64(__m128i a, const __int64 b, -// __constrange(0,2) int imm) -#define _mm_insert_epi64(a, b, imm) \ - __extension__({ \ - vreinterpretq_m128i_s64( \ - vsetq_lane_s64((b), vreinterpretq_s64_m128i(a), (imm))); \ - }) - -// ****************************************** -// Crypto Extensions -// ****************************************** -#if defined(__ARM_FEATURE_CRYPTO) -// Wraps vmull_p64 -FORCE_INLINE uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b) -{ - poly64_t a = vget_lane_p64(vreinterpret_p64_u64(_a), 0); - poly64_t b = vget_lane_p64(vreinterpret_p64_u64(_b), 0); - return vreinterpretq_u64_p128(vmull_p64(a, b)); -} - -#else // ARMv7 polyfill -// ARMv7/some A64 lacks vmull_p64, but it has vmull_p8. -// -// vmull_p8 calculates 8 8-bit->16-bit polynomial multiplies, but we need a -// 64-bit->128-bit polynomial multiply. -// -// It needs some work and is somewhat slow, but it is still faster than all -// known scalar methods. -// -// Algorithm adapted to C from https://www.workofard.com/2017/07/ghash-for-low-end-cores/, -// which is adapted from "Fast Software Polynomial Multiplication on -// ARM Processors Using the NEON Engine" by Danilo Camara, Conrado Gouvea, -// Julio Lopez and Ricardo Dahab (https://hal.inria.fr/hal-01506572) -static uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b) -{ - poly8x8_t a = vreinterpret_p8_u64(_a); - poly8x8_t b = vreinterpret_p8_u64(_b); - - // Masks - uint8x16_t k48_32 = vcombine_u8(vcreate_u8(0x0000ffffffffffff), vcreate_u8(0x00000000ffffffff)); - uint8x16_t k16_00 = vcombine_u8(vcreate_u8(0x000000000000ffff), vcreate_u8(0x0000000000000000)); - - // Do the multiplies, rotating with vext to get all combinations - uint8x16_t d = vreinterpretq_u8_p16(vmull_p8(a, b)); // D = A0 * B0 - uint8x16_t e = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 1))); // E = A0 * B1 - uint8x16_t f = vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 1), b)); // F = A1 * B0 - uint8x16_t g = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 2))); // G = A0 * B2 - uint8x16_t h = vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 2), b)); // H = A2 * B0 - uint8x16_t i = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 3))); // I = A0 * B3 - uint8x16_t j = vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 3), b)); // J = A3 * B0 - uint8x16_t k = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 4))); // L = A0 * B4 - - // Add cross products - uint8x16_t l = veorq_u8(e, f); // L = E + F - uint8x16_t m = veorq_u8(g, h); // M = G + H - uint8x16_t n = veorq_u8(i, j); // N = I + J - - // Interleave. Using vzip1 and vzip2 prevents Clang from emitting TBL instructions. -#if defined(__aarch64__) - uint8x16_t lm_p0 = vreinterpretq_u8_u64(vzip1q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m))); - uint8x16_t lm_p1 = vreinterpretq_u8_u64(vzip2q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m))); - uint8x16_t nk_p0 = vreinterpretq_u8_u64(vzip1q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k))); - uint8x16_t nk_p1 = vreinterpretq_u8_u64(vzip2q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k))); -#else - uint8x16_t lm_p0 = vcombine_u8(vget_low_u8(l), vget_low_u8(m)); - uint8x16_t lm_p1 = vcombine_u8(vget_high_u8(l), vget_high_u8(m)); - uint8x16_t nk_p0 = vcombine_u8(vget_low_u8(n), vget_low_u8(k)); - uint8x16_t nk_p1 = vcombine_u8(vget_high_u8(n), vget_high_u8(k)); -#endif - // t0 = (L) (P0 + P1) << 8 - // t1 = (M) (P2 + P3) << 16 - uint8x16_t t0t1_tmp = veorq_u8(lm_p0, lm_p1); - uint8x16_t t0t1_h = vandq_u8(lm_p1, k48_32); - uint8x16_t t0t1_l = veorq_u8(t0t1_tmp, t0t1_h); - - // t2 = (N) (P4 + P5) << 24 - // t3 = (K) (P6 + P7) << 32 - uint8x16_t t2t3_tmp = veorq_u8(nk_p0, nk_p1); - uint8x16_t t2t3_h = vandq_u8(nk_p1, k16_00); - uint8x16_t t2t3_l = veorq_u8(t2t3_tmp, t2t3_h); - - // De-interleave -#if defined(__aarch64__) - uint8x16_t t0 = vreinterpretq_u8_u64(vuzp1q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h))); - uint8x16_t t1 = vreinterpretq_u8_u64(vuzp2q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h))); - uint8x16_t t2 = vreinterpretq_u8_u64(vuzp1q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h))); - uint8x16_t t3 = vreinterpretq_u8_u64(vuzp2q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h))); -#else - uint8x16_t t1 = vcombine_u8(vget_high_u8(t0t1_l), vget_high_u8(t0t1_h)); - uint8x16_t t0 = vcombine_u8(vget_low_u8(t0t1_l), vget_low_u8(t0t1_h)); - uint8x16_t t3 = vcombine_u8(vget_high_u8(t2t3_l), vget_high_u8(t2t3_h)); - uint8x16_t t2 = vcombine_u8(vget_low_u8(t2t3_l), vget_low_u8(t2t3_h)); -#endif - // Shift the cross products - uint8x16_t t0_shift = vextq_u8(t0, t0, 15); // t0 << 8 - uint8x16_t t1_shift = vextq_u8(t1, t1, 14); // t1 << 16 - uint8x16_t t2_shift = vextq_u8(t2, t2, 13); // t2 << 24 - uint8x16_t t3_shift = vextq_u8(t3, t3, 12); // t3 << 32 - - // Accumulate the products - uint8x16_t cross1 = veorq_u8(t0_shift, t1_shift); - uint8x16_t cross2 = veorq_u8(t2_shift, t3_shift); - uint8x16_t mix = veorq_u8(d, cross1); - uint8x16_t r = veorq_u8(mix, cross2); - return vreinterpretq_u64_u8(r); -} - -#endif // ARMv7 polyfill -FORCE_INLINE __m128i _mm_clmulepi64_si128(__m128i _a, __m128i _b, const int imm) -{ - uint64x2_t a = vreinterpretq_u64_m128i(_a); - uint64x2_t b = vreinterpretq_u64_m128i(_b); - switch (imm & 0x11) { - case 0x00: return vreinterpretq_m128i_u64(_sse2neon_vmull_p64(vget_low_u64(a), vget_low_u64(b))); - case 0x01: return vreinterpretq_m128i_u64(_sse2neon_vmull_p64(vget_high_u64(a), vget_low_u64(b))); - case 0x10: return vreinterpretq_m128i_u64(_sse2neon_vmull_p64(vget_low_u64(a), vget_high_u64(b))); - case 0x11: return vreinterpretq_m128i_u64(_sse2neon_vmull_p64(vget_high_u64(a), vget_high_u64(b))); - default: abort(); - } -} - -#if !defined(__ARM_FEATURE_CRYPTO) && defined(__aarch64__) -// In the absence of crypto extensions, implement aesenc using regular neon -// intrinsics instead. See: -// https://www.workofard.com/2017/01/accelerated-aes-for-the-arm64-linux-kernel/ -// https://www.workofard.com/2017/07/ghash-for-low-end-cores/ and -// https://github.com/ColinIanKing/linux-next-mirror/blob/b5f466091e130caaf0735976648f72bd5e09aa84/crypto/aegis128-neon-inner.c#L52 -// for more information Reproduced with permission of the author. -FORCE_INLINE __m128i _mm_aesenc_si128(__m128i EncBlock, __m128i RoundKey) -{ - static const uint8_t crypto_aes_sbox[256] = { - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16}; - static const uint8_t shift_rows[] = {0x0, 0x5, 0xa, 0xf, 0x4, 0x9, - 0xe, 0x3, 0x8, 0xd, 0x2, 0x7, - 0xc, 0x1, 0x6, 0xb}; - static const uint8_t ror32by8[] = {0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4, - 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc}; - - uint8x16_t v; - uint8x16_t w = vreinterpretq_u8_m128i(EncBlock); - - // shift rows - w = vqtbl1q_u8(w, vld1q_u8(shift_rows)); - - // sub bytes - v = vqtbl4q_u8(vld1q_u8_x4(crypto_aes_sbox), w); - v = vqtbx4q_u8(v, vld1q_u8_x4(crypto_aes_sbox + 0x40), w - 0x40); - v = vqtbx4q_u8(v, vld1q_u8_x4(crypto_aes_sbox + 0x80), w - 0x80); - v = vqtbx4q_u8(v, vld1q_u8_x4(crypto_aes_sbox + 0xc0), w - 0xc0); - - // mix columns - w = (v << 1) ^ (uint8x16_t)(((int8x16_t) v >> 7) & 0x1b); - w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v); - w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8)); - - // add round key - return vreinterpretq_m128i_u8(w) ^ RoundKey; -} -#elif defined(__ARM_FEATURE_CRYPTO) -// Implements equivalent of 'aesenc' by combining AESE (with an empty key) and -// AESMC and then manually applying the real key as an xor operation This -// unfortunately means an additional xor op; the compiler should be able to -// optimise this away for repeated calls however See -// https://blog.michaelbrase.com/2018/05/08/emulating-x86-aes-intrinsics-on-armv8-a -// for more details. -inline __m128i _mm_aesenc_si128(__m128i a, __m128i b) -{ - return vreinterpretq_m128i_u8( - vaesmcq_u8(vaeseq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0))) ^ - vreinterpretq_u8_m128i(b)); -} -#endif - -// ****************************************** -// Streaming Extensions -// ****************************************** - -// Guarantees that every preceding store is globally visible before any -// subsequent store. -// https://msdn.microsoft.com/en-us/library/5h2w73d1%28v=vs.90%29.aspx -FORCE_INLINE void _mm_sfence(void) -{ - __sync_synchronize(); -} - -// Stores the data in a to the address p without polluting the caches. If the -// cache line containing address p is already in the cache, the cache will be -// updated.Address p must be 16 - byte aligned. -// https://msdn.microsoft.com/en-us/library/ba08y07y%28v=vs.90%29.aspx -FORCE_INLINE void _mm_stream_si128(__m128i *p, __m128i a) -{ - vst1q_s64((int64_t *) p, vreinterpretq_s64_m128i(a)); -} - -// Cache line containing p is flushed and invalidated from all caches in the -// coherency domain. : -// https://msdn.microsoft.com/en-us/library/ba08y07y(v=vs.100).aspx -FORCE_INLINE void _mm_clflush(void const *p) -{ - (void)p; - // no corollary for Neon? -} - -// Allocate aligned blocks of memory. -// https://software.intel.com/en-us/ -// cpp-compiler-developer-guide-and-reference-allocating-and-freeing-aligned-memory-blocks -FORCE_INLINE void *_mm_malloc(size_t size, size_t align) -{ - void *ptr; - if (align == 1) - return malloc(size); - if (align == 2 || (sizeof(void *) == 8 && align == 4)) - align = sizeof(void *); - if (!posix_memalign(&ptr, align, size)) - return ptr; - return NULL; -} - -FORCE_INLINE void _mm_free(void *addr) -{ - free(addr); -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma pop_macro("ALIGN_STRUCT") -#pragma pop_macro("FORCE_INLINE") -#endif - -#endif diff --git a/venv/Include/site/python3.9/pygame/mask.h b/venv/Include/site/python3.9/pygame/mask.h deleted file mode 100644 index 45ad8c5..0000000 --- a/venv/Include/site/python3.9/pygame/mask.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PGMASK_INTERNAL_H -#define PGMASK_INTERNAL_H - -#include "include/pygame_mask.h" -#define PYGAMEAPI_MASK_NUMSLOTS 1 - -#endif /* ~PGMASK_INTERNAL_H */ diff --git a/venv/Include/site/python3.9/pygame/mixer.h b/venv/Include/site/python3.9/pygame/mixer.h deleted file mode 100644 index 3650612..0000000 --- a/venv/Include/site/python3.9/pygame/mixer.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef MIXER_INTERNAL_H -#define MIXER_INTERNAL_H - -#include - -/* test mixer initializations */ -#define MIXER_INIT_CHECK() \ - if(!SDL_WasInit(SDL_INIT_AUDIO)) \ - return RAISE(pgExc_SDLError, "mixer not initialized") - -#define PYGAMEAPI_MIXER_NUMSLOTS 7 -#include "include/pygame_mixer.h" - -#endif /* ~MIXER_INTERNAL_H */ diff --git a/venv/Include/site/python3.9/pygame/palette.h b/venv/Include/site/python3.9/pygame/palette.h deleted file mode 100644 index 1ae4cf6..0000000 --- a/venv/Include/site/python3.9/pygame/palette.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -#ifndef PALETTE_H -#define PALETTE_H - -#include - -/* SDL 2 does not assign a default palette color scheme to a new 8 bit - * surface. Instead, the palette is set all white. This defines the SDL 1.2 - * default palette. - */ -static const SDL_Color default_palette_colors[] = { - {0, 0, 0, 255}, {0, 0, 85, 255}, {0, 0, 170, 255}, - {0, 0, 255, 255}, {0, 36, 0, 255}, {0, 36, 85, 255}, - {0, 36, 170, 255}, {0, 36, 255, 255}, {0, 73, 0, 255}, - {0, 73, 85, 255}, {0, 73, 170, 255}, {0, 73, 255, 255}, - {0, 109, 0, 255}, {0, 109, 85, 255}, {0, 109, 170, 255}, - {0, 109, 255, 255}, {0, 146, 0, 255}, {0, 146, 85, 255}, - {0, 146, 170, 255}, {0, 146, 255, 255}, {0, 182, 0, 255}, - {0, 182, 85, 255}, {0, 182, 170, 255}, {0, 182, 255, 255}, - {0, 219, 0, 255}, {0, 219, 85, 255}, {0, 219, 170, 255}, - {0, 219, 255, 255}, {0, 255, 0, 255}, {0, 255, 85, 255}, - {0, 255, 170, 255}, {0, 255, 255, 255}, {85, 0, 0, 255}, - {85, 0, 85, 255}, {85, 0, 170, 255}, {85, 0, 255, 255}, - {85, 36, 0, 255}, {85, 36, 85, 255}, {85, 36, 170, 255}, - {85, 36, 255, 255}, {85, 73, 0, 255}, {85, 73, 85, 255}, - {85, 73, 170, 255}, {85, 73, 255, 255}, {85, 109, 0, 255}, - {85, 109, 85, 255}, {85, 109, 170, 255}, {85, 109, 255, 255}, - {85, 146, 0, 255}, {85, 146, 85, 255}, {85, 146, 170, 255}, - {85, 146, 255, 255}, {85, 182, 0, 255}, {85, 182, 85, 255}, - {85, 182, 170, 255}, {85, 182, 255, 255}, {85, 219, 0, 255}, - {85, 219, 85, 255}, {85, 219, 170, 255}, {85, 219, 255, 255}, - {85, 255, 0, 255}, {85, 255, 85, 255}, {85, 255, 170, 255}, - {85, 255, 255, 255}, {170, 0, 0, 255}, {170, 0, 85, 255}, - {170, 0, 170, 255}, {170, 0, 255, 255}, {170, 36, 0, 255}, - {170, 36, 85, 255}, {170, 36, 170, 255}, {170, 36, 255, 255}, - {170, 73, 0, 255}, {170, 73, 85, 255}, {170, 73, 170, 255}, - {170, 73, 255, 255}, {170, 109, 0, 255}, {170, 109, 85, 255}, - {170, 109, 170, 255}, {170, 109, 255, 255}, {170, 146, 0, 255}, - {170, 146, 85, 255}, {170, 146, 170, 255}, {170, 146, 255, 255}, - {170, 182, 0, 255}, {170, 182, 85, 255}, {170, 182, 170, 255}, - {170, 182, 255, 255}, {170, 219, 0, 255}, {170, 219, 85, 255}, - {170, 219, 170, 255}, {170, 219, 255, 255}, {170, 255, 0, 255}, - {170, 255, 85, 255}, {170, 255, 170, 255}, {170, 255, 255, 255}, - {255, 0, 0, 255}, {255, 0, 85, 255}, {255, 0, 170, 255}, - {255, 0, 255, 255}, {255, 36, 0, 255}, {255, 36, 85, 255}, - {255, 36, 170, 255}, {255, 36, 255, 255}, {255, 73, 0, 255}, - {255, 73, 85, 255}, {255, 73, 170, 255}, {255, 73, 255, 255}, - {255, 109, 0, 255}, {255, 109, 85, 255}, {255, 109, 170, 255}, - {255, 109, 255, 255}, {255, 146, 0, 255}, {255, 146, 85, 255}, - {255, 146, 170, 255}, {255, 146, 255, 255}, {255, 182, 0, 255}, - {255, 182, 85, 255}, {255, 182, 170, 255}, {255, 182, 255, 255}, - {255, 219, 0, 255}, {255, 219, 85, 255}, {255, 219, 170, 255}, - {255, 219, 255, 255}, {255, 255, 0, 255}, {255, 255, 85, 255}, - {255, 255, 170, 255}, {255, 255, 255, 255}, {0, 0, 0, 255}, - {0, 0, 85, 255}, {0, 0, 170, 255}, {0, 0, 255, 255}, - {0, 36, 0, 255}, {0, 36, 85, 255}, {0, 36, 170, 255}, - {0, 36, 255, 255}, {0, 73, 0, 255}, {0, 73, 85, 255}, - {0, 73, 170, 255}, {0, 73, 255, 255}, {0, 109, 0, 255}, - {0, 109, 85, 255}, {0, 109, 170, 255}, {0, 109, 255, 255}, - {0, 146, 0, 255}, {0, 146, 85, 255}, {0, 146, 170, 255}, - {0, 146, 255, 255}, {0, 182, 0, 255}, {0, 182, 85, 255}, - {0, 182, 170, 255}, {0, 182, 255, 255}, {0, 219, 0, 255}, - {0, 219, 85, 255}, {0, 219, 170, 255}, {0, 219, 255, 255}, - {0, 255, 0, 255}, {0, 255, 85, 255}, {0, 255, 170, 255}, - {0, 255, 255, 255}, {85, 0, 0, 255}, {85, 0, 85, 255}, - {85, 0, 170, 255}, {85, 0, 255, 255}, {85, 36, 0, 255}, - {85, 36, 85, 255}, {85, 36, 170, 255}, {85, 36, 255, 255}, - {85, 73, 0, 255}, {85, 73, 85, 255}, {85, 73, 170, 255}, - {85, 73, 255, 255}, {85, 109, 0, 255}, {85, 109, 85, 255}, - {85, 109, 170, 255}, {85, 109, 255, 255}, {85, 146, 0, 255}, - {85, 146, 85, 255}, {85, 146, 170, 255}, {85, 146, 255, 255}, - {85, 182, 0, 255}, {85, 182, 85, 255}, {85, 182, 170, 255}, - {85, 182, 255, 255}, {85, 219, 0, 255}, {85, 219, 85, 255}, - {85, 219, 170, 255}, {85, 219, 255, 255}, {85, 255, 0, 255}, - {85, 255, 85, 255}, {85, 255, 170, 255}, {85, 255, 255, 255}, - {170, 0, 0, 255}, {170, 0, 85, 255}, {170, 0, 170, 255}, - {170, 0, 255, 255}, {170, 36, 0, 255}, {170, 36, 85, 255}, - {170, 36, 170, 255}, {170, 36, 255, 255}, {170, 73, 0, 255}, - {170, 73, 85, 255}, {170, 73, 170, 255}, {170, 73, 255, 255}, - {170, 109, 0, 255}, {170, 109, 85, 255}, {170, 109, 170, 255}, - {170, 109, 255, 255}, {170, 146, 0, 255}, {170, 146, 85, 255}, - {170, 146, 170, 255}, {170, 146, 255, 255}, {170, 182, 0, 255}, - {170, 182, 85, 255}, {170, 182, 170, 255}, {170, 182, 255, 255}, - {170, 219, 0, 255}, {170, 219, 85, 255}, {170, 219, 170, 255}, - {170, 219, 255, 255}, {170, 255, 0, 255}, {170, 255, 85, 255}, - {170, 255, 170, 255}, {170, 255, 255, 255}, {255, 0, 0, 255}, - {255, 0, 85, 255}, {255, 0, 170, 255}, {255, 0, 255, 255}, - {255, 36, 0, 255}, {255, 36, 85, 255}, {255, 36, 170, 255}, - {255, 36, 255, 255}, {255, 73, 0, 255}, {255, 73, 85, 255}, - {255, 73, 170, 255}, {255, 73, 255, 255}, {255, 109, 0, 255}, - {255, 109, 85, 255}, {255, 109, 170, 255}, {255, 109, 255, 255}, - {255, 146, 0, 255}, {255, 146, 85, 255}, {255, 146, 170, 255}, - {255, 146, 255, 255}, {255, 182, 0, 255}, {255, 182, 85, 255}, - {255, 182, 170, 255}, {255, 182, 255, 255}, {255, 219, 0, 255}, - {255, 219, 85, 255}, {255, 219, 170, 255}, {255, 219, 255, 255}, - {255, 255, 0, 255}, {255, 255, 85, 255}, {255, 255, 170, 255}, - {255, 255, 255, 255}}; - -static const int default_palette_size = - (int)(sizeof(default_palette_colors) / sizeof(SDL_Color)); - -#endif diff --git a/venv/Include/site/python3.9/pygame/pgarrinter.h b/venv/Include/site/python3.9/pygame/pgarrinter.h deleted file mode 100644 index 5ba096b..0000000 --- a/venv/Include/site/python3.9/pygame/pgarrinter.h +++ /dev/null @@ -1,26 +0,0 @@ -/* array structure interface version 3 declarations */ - -#if !defined(PG_ARRAYINTER_HEADER) -#define PG_ARRAYINTER_HEADER - -static const int PAI_CONTIGUOUS = 0x01; -static const int PAI_FORTRAN = 0x02; -static const int PAI_ALIGNED = 0x100; -static const int PAI_NOTSWAPPED = 0x200; -static const int PAI_WRITEABLE = 0x400; -static const int PAI_ARR_HAS_DESCR = 0x800; - -typedef struct { - int two; /* contains the integer 2 -- simple sanity check */ - int nd; /* number of dimensions */ - char typekind; /* kind in array -- character code of typestr */ - int itemsize; /* size of each element */ - int flags; /* flags indicating how the data should be */ - /* interpreted */ - Py_intptr_t *shape; /* A length-nd array of shape information */ - Py_intptr_t *strides; /* A length-nd array of stride information */ - void *data; /* A pointer to the first element of the array */ - PyObject *descr; /* NULL or a data-description */ -} PyArrayInterface; - -#endif diff --git a/venv/Include/site/python3.9/pygame/pgbufferproxy.h b/venv/Include/site/python3.9/pygame/pgbufferproxy.h deleted file mode 100644 index 1507608..0000000 --- a/venv/Include/site/python3.9/pygame/pgbufferproxy.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PG_BUFPROXY_INTERNAL_H -#define PG_BUFPROXY_INTERNAL_H - -#include "include/pygame_bufferproxy.h" -#define PYGAMEAPI_BUFPROXY_NUMSLOTS 4 - -#endif /* ~PG_BUFPROXY_INTERNAL_H */ diff --git a/venv/Include/site/python3.9/pygame/pgcompat.h b/venv/Include/site/python3.9/pygame/pgcompat.h deleted file mode 100644 index 74139b9..0000000 --- a/venv/Include/site/python3.9/pygame/pgcompat.h +++ /dev/null @@ -1,207 +0,0 @@ -/* Python 2.x/3.x compatibility tools (internal) - */ -#ifndef PGCOMPAT_INTERNAL_H -#define PGCOMPAT_INTERNAL_H - -#include "include/pgcompat.h" - -#if PY_MAJOR_VERSION >= 3 - -#define PY3 1 - -/* Define some aliases for the removed PyInt_* functions */ -#define PyInt_Check(op) PyLong_Check(op) -#define PyInt_FromString PyLong_FromString -#define PyInt_FromLong PyLong_FromLong -#define PyInt_FromSize_t PyLong_FromSize_t -#define PyInt_FromSsize_t PyLong_FromSsize_t -#define PyInt_AsLong PyLong_AsLong -#define PyInt_AsSsize_t PyLong_AsSsize_t -#define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask -#define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask -#define PyInt_AS_LONG PyLong_AS_LONG -#define PyNumber_Int PyNumber_Long -/* Int and Long are identical in Py3 so only check one */ -#define INT_CHECK(op) PyLong_Check(op) - -/* Weakrefs flags changed in 3.x */ -#define Py_TPFLAGS_HAVE_WEAKREFS 0 - -/* Module init function returns new module instance. */ -#define MODINIT_RETURN(x) return x -#define MODINIT_DEFINE(mod_name) PyMODINIT_FUNC PyInit_##mod_name (void) -#define DECREF_MOD(mod) Py_DECREF (mod) - -/* Text interface. Use unicode strings. */ -#define Text_Type PyUnicode_Type -#define Text_Check PyUnicode_Check - -#ifndef PYPY_VERSION -#define Text_FromLocale(s) PyUnicode_DecodeLocale((s), "strict") -#else /* PYPY_VERSION */ -/* workaround: missing function for pypy */ -#define Text_FromLocale PyUnicode_FromString -#endif /* PYPY_VERSION */ - -#define Text_FromUTF8 PyUnicode_FromString -#define Text_FromUTF8AndSize PyUnicode_FromStringAndSize -#define Text_FromFormat PyUnicode_FromFormat -#define Text_GetSize PyUnicode_GetSize -#define Text_GET_SIZE PyUnicode_GET_SIZE - -/* Binary interface. Use bytes. */ -#define Bytes_Type PyBytes_Type -#define Bytes_Check PyBytes_Check -#define Bytes_Size PyBytes_Size -#define Bytes_AsString PyBytes_AsString -#define Bytes_AsStringAndSize PyBytes_AsStringAndSize -#define Bytes_FromStringAndSize PyBytes_FromStringAndSize -#define Bytes_FromFormat PyBytes_FromFormat -#define Bytes_AS_STRING PyBytes_AS_STRING -#define Bytes_GET_SIZE PyBytes_GET_SIZE -#define Bytes_AsDecodeObject PyBytes_AsDecodedObject - -#define Object_Unicode PyObject_Str - -#define IsTextObj(x) (PyUnicode_Check(x) || PyBytes_Check(x)) - -/* Renamed builtins */ -#define BUILTINS_MODULE "builtins" -#define BUILTINS_UNICODE "str" -#define BUILTINS_UNICHR "chr" - -/* Defaults for unicode file path encoding */ -#define UNICODE_DEF_FS_CODEC Py_FileSystemDefaultEncoding -#if defined(MS_WIN32) -#define UNICODE_DEF_FS_ERROR "replace" -#else -#define UNICODE_DEF_FS_ERROR "surrogateescape" -#endif - -#else /* #if PY_MAJOR_VERSION >= 3 */ - -#define PY3 0 - -/* Check both Int and Long in PY2 */ -#define INT_CHECK(op) (PyInt_Check(op) || PyLong_Check(op)) - -/* Module init function returns nothing. */ -#define MODINIT_RETURN(x) return -#define MODINIT_DEFINE(mod_name) PyMODINIT_FUNC init##mod_name (void) -#define DECREF_MOD(mod) - -/* Text interface. Use ascii strings. */ -#define Text_Type PyString_Type -#define Text_Check PyString_Check -#define Text_FromLocale PyString_FromString -#define Text_FromUTF8 PyString_FromString -#define Text_FromUTF8AndSize PyString_FromStringAndSize -#define Text_FromFormat PyString_FromFormat -#define Text_GetSize PyString_GetSize -#define Text_GET_SIZE PyString_GET_SIZE - -/* Binary interface. Use ascii strings. */ -#define Bytes_Type PyString_Type -#define Bytes_Check PyString_Check -#define Bytes_Size PyString_Size -#define Bytes_AsString PyString_AsString -#define Bytes_AsStringAndSize PyString_AsStringAndSize -#define Bytes_FromStringAndSize PyString_FromStringAndSize -#define Bytes_FromFormat PyString_FromFormat -#define Bytes_AS_STRING PyString_AS_STRING -#define Bytes_GET_SIZE PyString_GET_SIZE -#define Bytes_AsDecodedObject PyString_AsDecodedObject - -#define Object_Unicode PyObject_Unicode - -/* Renamed builtins */ -#define BUILTINS_MODULE "__builtin__" -#define BUILTINS_UNICODE "unicode" -#define BUILTINS_UNICHR "unichr" - -/* Defaults for unicode file path encoding */ -#define UNICODE_DEF_FS_CODEC Py_FileSystemDefaultEncoding -#define UNICODE_DEF_FS_ERROR "strict" - -#endif /* #if PY_MAJOR_VERSION >= 3 */ - -#define PY2 (!PY3) - -#define MODINIT_ERROR MODINIT_RETURN (NULL) - -/* Module state. These macros are used to define per-module macros. - * v - global state variable (Python 2.x) - * s - global state structure (Python 3.x) - */ -#define PY2_GETSTATE(v) (&(v)) -#define PY3_GETSTATE(s, m) ((struct s *) PyModule_GetState (m)) - -/* Pep 3123: Making PyObject_HEAD conform to standard C */ -#if !defined(Py_TYPE) -#define Py_TYPE(o) (((PyObject *)(o))->ob_type) -#define Py_REFCNT(o) (((PyObject *)(o))->ob_refcnt) -#define Py_SIZE(o) (((PyVarObject *)(o))->ob_size) -#endif - -/* Encode a unicode file path */ -#define Unicode_AsEncodedPath(u) \ - PyUnicode_AsEncodedString ((u), UNICODE_DEF_FS_CODEC, UNICODE_DEF_FS_ERROR) - -#define RELATIVE_MODULE(m) ("." m) - -#define HAVE_OLD_BUFPROTO PY2 - -#if !defined(PG_ENABLE_OLDBUF) /* allow for command line override */ -#if HAVE_OLD_BUFPROTO -#define PG_ENABLE_OLDBUF 1 -#else -#define PG_ENABLE_OLDBUF 0 -#endif -#endif - -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER -#define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif - -#ifndef Py_TPFLAGS_HAVE_CLASS -#define Py_TPFLAGS_HAVE_CLASS 0 -#endif - -#ifndef Py_TPFLAGS_CHECKTYPES -#define Py_TPFLAGS_CHECKTYPES 0 -#endif - -#if PY_VERSION_HEX >= 0x03020000 -#define Slice_GET_INDICES_EX(slice, length, start, stop, step, slicelength) \ - PySlice_GetIndicesEx(slice, length, start, stop, step, slicelength) -#else -#define Slice_GET_INDICES_EX(slice, length, start, stop, step, slicelength) \ - PySlice_GetIndicesEx((PySliceObject *)(slice), length, \ - start, stop, step, slicelength) -#endif - -#if defined(SDL_VERSION_ATLEAST) -#if (SDL_VERSION_ATLEAST(2, 0, 0)) && !(SDL_VERSION_ATLEAST(2, 0, 5)) -/* These functions require SDL 2.0.5 or greater. - - https://wiki.libsdl.org/SDL_SetWindowResizable -*/ -void SDL_SetWindowResizable(SDL_Window *window, SDL_bool resizable); -int SDL_GetWindowOpacity(SDL_Window *window, float *opacity); -int SDL_SetWindowOpacity(SDL_Window *window, float opacity); -int SDL_SetWindowModalFor(SDL_Window *modal_window, SDL_Window *parent_window); -int SDL_SetWindowInputFocus(SDL_Window *window); -SDL_Surface * SDL_CreateRGBSurfaceWithFormat(Uint32 flags, int width, int height, int depth, - Uint32 format); -#endif -#endif /* defined(SDL_VERSION_ATLEAST) */ - -// Currently needed to build scrap.c, event.c, display.c -// with Windows SDK 10.0.18362.0 and SDL1 build -#ifdef _MSC_VER - #ifndef WINDOWS_IGNORE_PACKING_MISMATCH - #define WINDOWS_IGNORE_PACKING_MISMATCH - #endif -#endif - -#endif /* ~PGCOMPAT_INTERNAL_H */ diff --git a/venv/Include/site/python3.9/pygame/pgimport.h b/venv/Include/site/python3.9/pygame/pgimport.h deleted file mode 100644 index 34654c9..0000000 --- a/venv/Include/site/python3.9/pygame/pgimport.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef PGIMPORT_INTERNAL_H -#define PGIMPORT_INTERNAL_H - -#include "include/pgimport.h" - -#if PG_HAVE_CAPSULE -#define encapsulate_api(ptr, module) \ - PyCapsule_New(ptr, PG_CAPSULE_NAME(module), NULL) -#else /* ~PG_HAVE_CAPSULE */ -#define encapsulate_api(ptr, module) PyCObject_FromVoidPtr(ptr, NULL) -#endif /* ~PG_HAVE_CAPSULE */ - -#endif /* PGIMPORT_INTERNAL_H */ diff --git a/venv/Include/site/python3.9/pygame/pgopengl.h b/venv/Include/site/python3.9/pygame/pgopengl.h deleted file mode 100644 index 6440f32..0000000 --- a/venv/Include/site/python3.9/pygame/pgopengl.h +++ /dev/null @@ -1,18 +0,0 @@ -#if !defined(PGOPENGL_H) -#define PGOPENGL_H - -/** This header includes definitions of Opengl functions as pointer types for - ** use with the SDL function SDL_GL_GetProcAddress. - **/ - -#if defined(_WIN32) -#define GL_APIENTRY __stdcall -#else -#define GL_APIENTRY -#endif - -typedef void (GL_APIENTRY *GL_glReadPixels_Func)(int, int, int, int, unsigned int, unsigned int, void*); - -typedef void (GL_APIENTRY *GL_glViewport_Func)(int, int, unsigned int, unsigned int); -#endif - diff --git a/venv/Include/site/python3.9/pygame/pgplatform.h b/venv/Include/site/python3.9/pygame/pgplatform.h deleted file mode 100644 index 2d5ed86..0000000 --- a/venv/Include/site/python3.9/pygame/pgplatform.h +++ /dev/null @@ -1,38 +0,0 @@ -/* platform/compiler adjustments (internal) */ -#ifndef PG_PLATFORM_INTERNAL_H -#define PG_PLATFORM_INTERNAL_H - -/* This must be before all else */ -#if defined(__SYMBIAN32__) && defined(OPENC) -#include -#if defined(__WINS__) -void * -_alloca(size_t size); -#define alloca _alloca -#endif /* __WINS__ */ -#endif /* defined(__SYMBIAN32__) && defined(OPENC) */ - -#include "include/pgplatform.h" - -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif -#ifndef MAX -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#endif -#ifndef ABS -#define ABS(a) (((a) < 0) ? -(a) : (a)) -#endif - -#if defined(macintosh) && defined(__MWERKS__) || defined(__SYMBIAN32__) -#define PYGAME_EXPORT __declspec(export) -#else -#define PYGAME_EXPORT -#endif - -/* warnings */ -#define PG_STRINGIZE_HELPER(x) #x -#define PG_STRINGIZE(x) PG_STRINGIZE_HELPER(x) -#define PG_WARN(desc) message(__FILE__ "(" PG_STRINGIZE(__LINE__) "): WARNING: " #desc) - -#endif /* ~PG_PLATFORM_INTERNAL_H */ diff --git a/venv/Include/site/python3.9/pygame/pygame.h b/venv/Include/site/python3.9/pygame/pygame.h deleted file mode 100644 index d7eaf73..0000000 --- a/venv/Include/site/python3.9/pygame/pygame.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -/* This will use PYGAMEAPI_DEFINE_SLOTS instead - * of PYGAMEAPI_EXTERN_SLOTS for base modules. - */ -#ifndef PYGAME_INTERNAL_H -#define PYGAME_INTERNAL_H - -#define PYGAME_H -#include "_pygame.h" - -#endif /* ~PYGAME_INTERNAL_H */ diff --git a/venv/Include/site/python3.9/pygame/scrap.h b/venv/Include/site/python3.9/pygame/scrap.h deleted file mode 100644 index 725f22f..0000000 --- a/venv/Include/site/python3.9/pygame/scrap.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2006, 2007 Rene Dudfield, Marcus von Appen - - Originally put in the public domain by Sam Lantinga. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef SCRAP_H -#define SCRAP_H - -/* This is unconditionally defined in Python.h */ -#if defined(_POSIX_C_SOURCE) -#undef _POSIX_C_SOURCE -#endif - -#include - -/* Handle clipboard text and data in arbitrary formats */ - -/** - * Predefined supported pygame scrap types. - */ -#define PYGAME_SCRAP_TEXT "text/plain" -#define PYGAME_SCRAP_BMP "image/bmp" -#define PYGAME_SCRAP_PPM "image/ppm" -#define PYGAME_SCRAP_PBM "image/pbm" - -/** - * The supported scrap clipboard types. - * - * This is only relevant in a X11 environment, which supports mouse - * selections as well. For Win32 and MacOS environments the default - * clipboard is used, no matter what value is passed. - */ -typedef enum -{ - SCRAP_CLIPBOARD, - SCRAP_SELECTION /* only supported in X11 environments. */ -} ScrapClipType; - -/** - * Macro for initialization checks. - */ -#define PYGAME_SCRAP_INIT_CHECK() \ - if(!pygame_scrap_initialized()) \ - return (PyErr_SetString (pgExc_SDLError, \ - "scrap system not initialized."), NULL) - -/** - * \brief Checks, whether the pygame scrap module was initialized. - * - * \return 1 if the modules was initialized, 0 otherwise. - */ -extern int -pygame_scrap_initialized (void); - -/** - * \brief Initializes the pygame scrap module internals. Call this before any - * other method. - * - * \return 1 on successful initialization, 0 otherwise. - */ -extern int -pygame_scrap_init (void); - -/** - * \brief Checks, whether the pygame window lost the clipboard focus or not. - * - * \return 1 if the window lost the focus, 0 otherwise. - */ -extern int -pygame_scrap_lost (void); - -/** - * \brief Places content of a specific type into the clipboard. - * - * \note For X11 the following notes are important: The following types - * are reserved for internal usage and thus will throw an error on - * setting them: "TIMESTAMP", "TARGETS", "SDL_SELECTION". - * Setting PYGAME_SCRAP_TEXT ("text/plain") will also automatically - * set the X11 types "STRING" (XA_STRING), "TEXT" and "UTF8_STRING". - * - * For Win32 the following notes are important: Setting - * PYGAME_SCRAP_TEXT ("text/plain") will also automatically set - * the Win32 type "TEXT" (CF_TEXT). - * - * For QNX the following notes are important: Setting - * PYGAME_SCRAP_TEXT ("text/plain") will also automatically set - * the QNX type "TEXT" (Ph_CL_TEXT). - * - * \param type The type of the content. - * \param srclen The length of the content. - * \param src The NULL terminated content. - * \return 1, if the content could be successfully pasted into the clipboard, - * 0 otherwise. - */ -extern int -pygame_scrap_put (char *type, int srclen, char *src); - -/** - * \brief Gets the current content from the clipboard. - * - * \note The received content does not need to be the content previously - * placed in the clipboard using pygame_put_scrap(). See the - * pygame_put_scrap() notes for more details. - * - * \param type The type of the content to receive. - * \param count The size of the returned content. - * \return The content or NULL in case of an error or if no content of the - * specified type was available. - */ -extern char* -pygame_scrap_get (char *type, unsigned long *count); - -/** - * \brief Gets the currently available content types from the clipboard. - * - * \return The different available content types or NULL in case of an - * error or if no content type is available. - */ -extern char** -pygame_scrap_get_types (void); - -/** - * \brief Checks whether content for the specified scrap type is currently - * available in the clipboard. - * - * \param type The type to check for. - * \return 1, if there is content and 0 otherwise. - */ -extern int -pygame_scrap_contains (char *type); - -#endif /* SCRAP_H */ diff --git a/venv/Include/site/python3.9/pygame/surface.h b/venv/Include/site/python3.9/pygame/surface.h deleted file mode 100644 index bbd7f28..0000000 --- a/venv/Include/site/python3.9/pygame/surface.h +++ /dev/null @@ -1,384 +0,0 @@ -/* - pygame - Python Game Library - Copyright (C) 2000-2001 Pete Shinners - Copyright (C) 2007 Marcus von Appen - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Pete Shinners - pete@shinners.org -*/ - -#ifndef SURFACE_H -#define SURFACE_H - -/* This is defined in SDL.h */ -#if defined(_POSIX_C_SOURCE) -#undef _POSIX_C_SOURCE -#endif - -#include -#include "pygame.h" - -/* Blend modes */ -#define PYGAME_BLEND_ADD 0x1 -#define PYGAME_BLEND_SUB 0x2 -#define PYGAME_BLEND_MULT 0x3 -#define PYGAME_BLEND_MIN 0x4 -#define PYGAME_BLEND_MAX 0x5 - -#define PYGAME_BLEND_RGB_ADD 0x1 -#define PYGAME_BLEND_RGB_SUB 0x2 -#define PYGAME_BLEND_RGB_MULT 0x3 -#define PYGAME_BLEND_RGB_MIN 0x4 -#define PYGAME_BLEND_RGB_MAX 0x5 - -#define PYGAME_BLEND_RGBA_ADD 0x6 -#define PYGAME_BLEND_RGBA_SUB 0x7 -#define PYGAME_BLEND_RGBA_MULT 0x8 -#define PYGAME_BLEND_RGBA_MIN 0x9 -#define PYGAME_BLEND_RGBA_MAX 0x10 -#define PYGAME_BLEND_PREMULTIPLIED 0x11 -#define PYGAME_BLEND_ALPHA_SDL2 0x12 - - - - - -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define GET_PIXEL_24(b) (b[0] + (b[1] << 8) + (b[2] << 16)) -#else -#define GET_PIXEL_24(b) (b[2] + (b[1] << 8) + (b[0] << 16)) -#endif - -#define GET_PIXEL(pxl, bpp, source) \ - switch (bpp) \ - { \ - case 2: \ - pxl = *((Uint16 *) (source)); \ - break; \ - case 4: \ - pxl = *((Uint32 *) (source)); \ - break; \ - default: \ - { \ - Uint8 *b = (Uint8 *) source; \ - pxl = GET_PIXEL_24(b); \ - } \ - break; \ - } - -#if IS_SDLv1 -#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, ppa) \ - _sR = ((px & fmt->Rmask) >> fmt->Rshift); \ - _sR = (_sR << fmt->Rloss) + (_sR >> (8 - (fmt->Rloss << 1))); \ - _sG = ((px & fmt->Gmask) >> fmt->Gshift); \ - _sG = (_sG << fmt->Gloss) + (_sG >> (8 - (fmt->Gloss << 1))); \ - _sB = ((px & fmt->Bmask) >> fmt->Bshift); \ - _sB = (_sB << fmt->Bloss) + (_sB >> (8 - (fmt->Bloss << 1))); \ - if (ppa) \ - { \ - _sA = ((px & fmt->Amask) >> fmt->Ashift); \ - _sA = (_sA << fmt->Aloss) + (_sA >> (8 - (fmt->Aloss << 1))); \ - } \ - else \ - { \ - _sA = 255; \ - } - -#define GET_PIXELVALS_1(sr, sg, sb, sa, _src, _fmt) \ - sr = _fmt->palette->colors[*((Uint8 *) (_src))].r; \ - sg = _fmt->palette->colors[*((Uint8 *) (_src))].g; \ - sb = _fmt->palette->colors[*((Uint8 *) (_src))].b; \ - sa = 255; - -/* For 1 byte palette pixels */ -#define SET_PIXELVAL(px, fmt, _dR, _dG, _dB, _dA) \ - *(px) = (Uint8) SDL_MapRGB(fmt, _dR, _dG, _dB) -#else /* IS_SDLv2 */ -#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, ppa) \ - SDL_GetRGBA(px, fmt, &(_sR), &(_sG), &(_sB), &(_sA)); \ - if (!ppa) { \ - _sA = 255; \ - } - -#define GET_PIXELVALS_1(sr, sg, sb, sa, _src, _fmt) \ - sr = _fmt->palette->colors[*((Uint8 *) (_src))].r; \ - sg = _fmt->palette->colors[*((Uint8 *) (_src))].g; \ - sb = _fmt->palette->colors[*((Uint8 *) (_src))].b; \ - sa = 255; - -/* For 1 byte palette pixels */ -#define SET_PIXELVAL(px, fmt, _dR, _dG, _dB, _dA) \ - *(px) = (Uint8) SDL_MapRGBA(fmt, _dR, _dG, _dB, _dA) -#endif /* IS_SDLv2 */ - - - - - - - - -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define SET_OFFSETS_24(or, og, ob, fmt) \ - { \ - or = (fmt->Rshift == 0 ? 0 : \ - fmt->Rshift == 8 ? 1 : \ - 2 ); \ - og = (fmt->Gshift == 0 ? 0 : \ - fmt->Gshift == 8 ? 1 : \ - 2 ); \ - ob = (fmt->Bshift == 0 ? 0 : \ - fmt->Bshift == 8 ? 1 : \ - 2 ); \ - } - -#define SET_OFFSETS_32(or, og, ob, fmt) \ - { \ - or = (fmt->Rshift == 0 ? 0 : \ - fmt->Rshift == 8 ? 1 : \ - fmt->Rshift == 16 ? 2 : \ - 3 ); \ - og = (fmt->Gshift == 0 ? 0 : \ - fmt->Gshift == 8 ? 1 : \ - fmt->Gshift == 16 ? 2 : \ - 3 ); \ - ob = (fmt->Bshift == 0 ? 0 : \ - fmt->Bshift == 8 ? 1 : \ - fmt->Bshift == 16 ? 2 : \ - 3 ); \ - } -#else -#define SET_OFFSETS_24(or, og, ob, fmt) \ - { \ - or = (fmt->Rshift == 0 ? 2 : \ - fmt->Rshift == 8 ? 1 : \ - 0 ); \ - og = (fmt->Gshift == 0 ? 2 : \ - fmt->Gshift == 8 ? 1 : \ - 0 ); \ - ob = (fmt->Bshift == 0 ? 2 : \ - fmt->Bshift == 8 ? 1 : \ - 0 ); \ - } - -#define SET_OFFSETS_32(or, og, ob, fmt) \ - { \ - or = (fmt->Rshift == 0 ? 3 : \ - fmt->Rshift == 8 ? 2 : \ - fmt->Rshift == 16 ? 1 : \ - 0 ); \ - og = (fmt->Gshift == 0 ? 3 : \ - fmt->Gshift == 8 ? 2 : \ - fmt->Gshift == 16 ? 1 : \ - 0 ); \ - ob = (fmt->Bshift == 0 ? 3 : \ - fmt->Bshift == 8 ? 2 : \ - fmt->Bshift == 16 ? 1 : \ - 0 ); \ - } -#endif - - -#define CREATE_PIXEL(buf, r, g, b, a, bp, ft) \ - switch (bp) \ - { \ - case 2: \ - *((Uint16 *) (buf)) = \ - ((r >> ft->Rloss) << ft->Rshift) | \ - ((g >> ft->Gloss) << ft->Gshift) | \ - ((b >> ft->Bloss) << ft->Bshift) | \ - ((a >> ft->Aloss) << ft->Ashift); \ - break; \ - case 4: \ - *((Uint32 *) (buf)) = \ - ((r >> ft->Rloss) << ft->Rshift) | \ - ((g >> ft->Gloss) << ft->Gshift) | \ - ((b >> ft->Bloss) << ft->Bshift) | \ - ((a >> ft->Aloss) << ft->Ashift); \ - break; \ - } - -/* Pretty good idea from Tom Duff :-). */ -#define LOOP_UNROLLED4(code, n, width) \ - n = (width + 3) / 4; \ - switch (width & 3) \ - { \ - case 0: do { code; \ - case 3: code; \ - case 2: code; \ - case 1: code; \ - } while (--n > 0); \ - } - -/* Used in the srcbpp == dstbpp == 1 blend functions */ -#define REPEAT_3(code) \ - code; \ - code; \ - code; - -#define REPEAT_4(code) \ - code; \ - code; \ - code; \ - code; - - -#define BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ - tmp = dR + sR; dR = (tmp <= 255 ? tmp : 255); \ - tmp = dG + sG; dG = (tmp <= 255 ? tmp : 255); \ - tmp = dB + sB; dB = (tmp <= 255 ? tmp : 255); - -#define BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ - tmp = dR - sR; dR = (tmp >= 0 ? tmp : 0); \ - tmp = dG - sG; dG = (tmp >= 0 ? tmp : 0); \ - tmp = dB - sB; dB = (tmp >= 0 ? tmp : 0); - -#define BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA) \ - dR = (dR && sR) ? (dR * sR) >> 8 : 0; \ - dG = (dG && sG) ? (dG * sG) >> 8 : 0; \ - dB = (dB && sB) ? (dB * sB) >> 8 : 0; - -#define BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA) \ - if(sR < dR) { dR = sR; } \ - if(sG < dG) { dG = sG; } \ - if(sB < dB) { dB = sB; } - -#define BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA) \ - if(sR > dR) { dR = sR; } \ - if(sG > dG) { dG = sG; } \ - if(sB > dB) { dB = sB; } - - - - - - -#define BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ - tmp = dR + sR; dR = (tmp <= 255 ? tmp : 255); \ - tmp = dG + sG; dG = (tmp <= 255 ? tmp : 255); \ - tmp = dB + sB; dB = (tmp <= 255 ? tmp : 255); \ - tmp = dA + sA; dA = (tmp <= 255 ? tmp : 255); - -#define BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ - tmp = dR - sR; dR = (tmp >= 0 ? tmp : 0); \ - tmp = dG - sG; dG = (tmp >= 0 ? tmp : 0); \ - tmp = dB - sB; dB = (tmp >= 0 ? tmp : 0); \ - tmp = dA - sA; dA = (tmp >= 0 ? tmp : 0); - -#define BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA) \ - dR = (dR && sR) ? (dR * sR) >> 8 : 0; \ - dG = (dG && sG) ? (dG * sG) >> 8 : 0; \ - dB = (dB && sB) ? (dB * sB) >> 8 : 0; \ - dA = (dA && sA) ? (dA * sA) >> 8 : 0; - -#define BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA) \ - if(sR < dR) { dR = sR; } \ - if(sG < dG) { dG = sG; } \ - if(sB < dB) { dB = sB; } \ - if(sA < dA) { dA = sA; } - -#define BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA) \ - if(sR > dR) { dR = sR; } \ - if(sG > dG) { dG = sG; } \ - if(sB > dB) { dB = sB; } \ - if(sA > dA) { dA = sA; } - - - - - - - - - - - -#if 1 -/* Choose an alpha blend equation. If the sign is preserved on a right shift - * then use a specialized, faster, equation. Otherwise a more general form, - * where all additions are done before the shift, is needed. -*/ -#if (-1 >> 1) < 0 -#define ALPHA_BLEND_COMP(sC, dC, sA) ((((sC - dC) * sA + sC) >> 8) + dC) -#else -#define ALPHA_BLEND_COMP(sC, dC, sA) (((dC << 8) + (sC - dC) * sA + sC) >> 8) -#endif - -#define ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB, dA) \ - do { \ - if (dA) \ - { \ - dR = ALPHA_BLEND_COMP(sR, dR, sA); \ - dG = ALPHA_BLEND_COMP(sG, dG, sA); \ - dB = ALPHA_BLEND_COMP(sB, dB, sA); \ - dA = sA + dA - ((sA * dA) / 255); \ - } \ - else \ - { \ - dR = sR; \ - dG = sG; \ - dB = sB; \ - dA = sA; \ - } \ - } while(0) - -#define ALPHA_BLEND_PREMULTIPLIED_COMP(sC, dC, sA) (sC + dC - ((dC + 1) * sA >> 8)) - -#define ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \ - do { \ - dR = ALPHA_BLEND_PREMULTIPLIED_COMP(sR, dR, sA); \ - dG = ALPHA_BLEND_PREMULTIPLIED_COMP(sG, dG, sA); \ - dB = ALPHA_BLEND_PREMULTIPLIED_COMP(sB, dB, sA); \ - dA = ALPHA_BLEND_PREMULTIPLIED_COMP(sA, dA, sA); \ - } while(0) -#elif 0 - -#define ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB, dA) \ - do { \ - if(sA){ \ - if(dA && sA < 255){ \ - int dContrib = dA*(255 - sA)/255; \ - dA = sA+dA - ((sA*dA)/255); \ - dR = (dR*dContrib + sR*sA)/dA; \ - dG = (dG*dContrib + sG*sA)/dA; \ - dB = (dB*dContrib + sB*sA)/dA; \ - }else{ \ - dR = sR; \ - dG = sG; \ - dB = sB; \ - dA = sA; \ - } \ - } \ - } while(0) -#endif - -int -surface_fill_blend (SDL_Surface *surface, SDL_Rect *rect, Uint32 color, - int blendargs); - -void -surface_respect_clip_rect (SDL_Surface *surface, SDL_Rect *rect); - -int -pygame_AlphaBlit (SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect, int the_args); - -int -pygame_Blit (SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect, int the_args); - -#endif /* SURFACE_H */ diff --git a/venv/Lib/site-packages/_distutils_hack/__init__.py b/venv/Lib/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index 5f40996..0000000 --- a/venv/Lib/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,128 +0,0 @@ -import sys -import os -import re -import importlib -import warnings - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -warnings.filterwarnings('ignore', - r'.+ distutils\b.+ deprecated', - DeprecationWarning) - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - if is_pypy and sys.version_info < (3, 7): - # PyPy for 3.6 unconditionally imports distutils, so bypass the warning - # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 - return - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils.") - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - warnings.warn("Setuptools is replacing distutils.") - mods = [name for name in sys.modules if re.match(r'distutils\b', name)] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') - return which == 'local' - - -def ensure_local_distutils(): - clear_distutils() - distutils = importlib.import_module('setuptools._distutils') - distutils.__name__ = 'distutils' - sys.modules['distutils'] = distutils - - # sanity check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - if path is not None: - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - import importlib.abc - import importlib.util - - class DistutilsLoader(importlib.abc.Loader): - - def create_module(self, spec): - return importlib.import_module('setuptools._distutils') - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader('distutils', DistutilsLoader()) - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @staticmethod - def pip_imported_during_build(): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - return any( - frame.f_globals['__file__'].endswith('setup.py') - for frame, line in traceback.walk_stack(None) - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/venv/Lib/site-packages/_distutils_hack/override.py b/venv/Lib/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a..0000000 --- a/venv/Lib/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/venv/Lib/site-packages/distutils-precedence.pth b/venv/Lib/site-packages/distutils-precedence.pth deleted file mode 100644 index 6de4198..0000000 --- a/venv/Lib/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'stdlib') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/venv/Lib/site-packages/pip/__init__.py b/venv/Lib/site-packages/pip/__init__.py deleted file mode 100644 index 82f53c3..0000000 --- a/venv/Lib/site-packages/pip/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from typing import List, Optional - -__version__ = "21.1.2" - - -def main(args=None): - # type: (Optional[List[str]]) -> int - """This is an internal API only meant for use by pip's own console scripts. - - For additional details, see https://github.com/pypa/pip/issues/7498. - """ - from pip._internal.utils.entrypoints import _wrapper - - return _wrapper(args) diff --git a/venv/Lib/site-packages/pip/__main__.py b/venv/Lib/site-packages/pip/__main__.py deleted file mode 100644 index fe34a7b..0000000 --- a/venv/Lib/site-packages/pip/__main__.py +++ /dev/null @@ -1,31 +0,0 @@ -import os -import sys -import warnings - -# Remove '' and current working directory from the first entry -# of sys.path, if present to avoid using current directory -# in pip commands check, freeze, install, list and show, -# when invoked as python -m pip -if sys.path[0] in ("", os.getcwd()): - sys.path.pop(0) - -# If we are running from a wheel, add the wheel to sys.path -# This allows the usage python pip-*.whl/pip install pip-*.whl -if __package__ == "": - # __file__ is pip-*.whl/pip/__main__.py - # first dirname call strips of '/__main__.py', second strips off '/pip' - # Resulting path is the name of the wheel itself - # Add that to sys.path so we can import pip - path = os.path.dirname(os.path.dirname(__file__)) - sys.path.insert(0, path) - -if __name__ == "__main__": - # Work around the error reported in #9540, pending a proper fix. - # Note: It is essential the warning filter is set *before* importing - # pip, as the deprecation happens at import time, not runtime. - warnings.filterwarnings( - "ignore", category=DeprecationWarning, module=".*packaging\\.version" - ) - from pip._internal.cli.main import main as _main - - sys.exit(_main()) diff --git a/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index bdb7d490cfc13c8cc64a712e1d1d395b2b5ffe52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 589 zcmYjOL2DH;5KeZt+sD&_2k#ADWI=an5!6ydDHViLg?d^RLf$6s3+^T%lYM1NJ+=SA z-{4=`t0(_LPflJ@I%Fo9;mh|;GGcFUNzh!sFB~Q0cT65yiphI)c!og|NqaKTnhr^w zP$H8$mATC1&MmDonO=}$_YdMok<8hdhA=NayP&NR{Z)Q=P#%1Bm3~>6SJnD*r0?7?3?v$1jSYpbJ{%z zW-kqEtpVFB2CdgFK)GBpw2ufCQtJEGm{dXN9$qj|imgL%a8y;D4(oAMwsxr8 zl?E6URIgvXeN%3Ue0)qn=LNs?!a3!Oq~1ql$^Ug(jsdAlWrCla#VYtL-oXzNzPnF; z5uao2?&9>Qk!quQ>l){6=fyB+(=~1iYil@m)O2D{9GqxXvr%T#^m^5R4(cVAzKc#l zgX#@Oc^x<}-85%|&?eGD)Ft`j#4m6!=y|a-=V5ZF;NuK@9QFK&^NsR=Gvj;<+_v^0 W>_*h$c(8Kp)w}rqE%B2iOaB6pNSo#W diff --git a/venv/Lib/site-packages/pip/_internal/__init__.py b/venv/Lib/site-packages/pip/_internal/__init__.py deleted file mode 100644 index 41071cd..0000000 --- a/venv/Lib/site-packages/pip/_internal/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from typing import List, Optional - -import pip._internal.utils.inject_securetransport # noqa - - -def main(args=None): - # type: (Optional[List[str]]) -> int - """This is preserved for old console scripts that may still be referencing - it. - - For additional details, see https://github.com/pypa/pip/issues/7498. - """ - from pip._internal.utils.entrypoints import _wrapper - - return _wrapper(args) diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 9484376b13bf7e05491dddafb48410b35ac25817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 638 zcmZuuv5wR*5Ve!Ny|CgW3i@+}vdP!Lh9w@1mfig0G;U z=aZAreDoWNlwE=~2 z0SLaczF#Reo66N8dCd^o7<;vuGLW=&^gt1S+NKogtg3pOw!2N)g`tXL)K#>xvP3(e z>hYtePs#%j&YIS8D%#JeV+3T~r#xA<)+a!gUG8`rD#0flW8f~~Vm`z7qp`m#ehED0 z-rof%!Tu#;Qa3O{r~B({v&j$CFpht k3ALvfFx5HF9>5MlZiIr7rsCNU%+A5{`L+(^cd{b?2R5IuGynhq diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc deleted file mode 100644 index 5a2514615795a1e791135b0117ca2a517ae5a330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8951 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 diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-39.pyc deleted file mode 100644 index 522d8e765aeacd10c954588e97244a19b8782bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7841 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 E3nHrCQ~&?~ diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc deleted file mode 100644 index 59fa185582dc00a2594cec5070912444ba9ec425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3453 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 diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-39.pyc deleted file mode 100644 index 1502d0dea2ff9455ec54a59ba56ff1c04d5dc486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8276 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 diff --git a/venv/Lib/site-packages/pip/_internal/build_env.py b/venv/Lib/site-packages/pip/_internal/build_env.py deleted file mode 100644 index cc15250..0000000 --- a/venv/Lib/site-packages/pip/_internal/build_env.py +++ /dev/null @@ -1,286 +0,0 @@ -"""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 pip._vendor.certifi import where -from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet - -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.utils.subprocess import call_subprocess -from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds - -if TYPE_CHECKING: - from pip._internal.index.package_finder import PackageFinder - -logger = logging.getLogger(__name__) - - -class _Prefix: - - def __init__(self, path): - # type: (str) -> None - self.path = path - self.setup = False - self.bin_dir = get_paths( - 'nt' if os.name == 'nt' else 'posix_prefix', - vars={'base': path, 'platbase': path} - )['scripts'] - self.lib_dirs = get_prefixed_libs(path) - - -@contextlib.contextmanager -def _create_standalone_pip() -> Iterator[str]: - """Create a "standalone pip" zip file. - - The zip file's content is identical to the currently-running pip. - It will be used to install 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 - - 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") - - -class BuildEnvironment: - """Creates and manages an isolated environment to install build deps - """ - - def __init__(self): - # type: () -> None - temp_dir = TempDirectory( - kind=tempdir_kinds.BUILD_ENV, globally_managed=True - ) - - self._prefixes = OrderedDict( - (name, _Prefix(os.path.join(temp_dir.path, name))) - for name in ('normal', 'overlay') - ) - - self._bin_dirs = [] # type: List[str] - self._lib_dirs = [] # type: List[str] - for prefix in reversed(list(self._prefixes.values())): - self._bin_dirs.append(prefix.bin_dir) - self._lib_dirs.extend(prefix.lib_dirs) - - # Customize site to: - # - ensure .pth files are honored - # - prevent access to system site packages - system_sites = { - os.path.normcase(site) for site in (get_purelib(), get_platlib()) - } - self._site_dir = os.path.join(temp_dir.path, 'site') - if not os.path.exists(self._site_dir): - os.mkdir(self._site_dir) - with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: - fp.write(textwrap.dedent( - ''' - import os, site, sys - - # First, drop system-sites related paths. - original_sys_path = sys.path[:] - known_paths = set() - for path in {system_sites!r}: - site.addsitedir(path, known_paths=known_paths) - system_paths = set( - os.path.normcase(path) - for path in sys.path[len(original_sys_path):] - ) - original_sys_path = [ - path for path in original_sys_path - if os.path.normcase(path) not in system_paths - ] - sys.path = original_sys_path - - # Second, add lib directories. - # ensuring .pth file are processed. - for path in {lib_dirs!r}: - assert not path in sys.path - site.addsitedir(path) - ''' - ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) - - def __enter__(self): - # type: () -> None - self._save_env = { - name: os.environ.get(name, None) - for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') - } - - path = self._bin_dirs[:] - old_path = self._save_env['PATH'] - if old_path: - path.extend(old_path.split(os.pathsep)) - - pythonpath = [self._site_dir] - - os.environ.update({ - 'PATH': os.pathsep.join(path), - 'PYTHONNOUSERSITE': '1', - 'PYTHONPATH': os.pathsep.join(pythonpath), - }) - - def __exit__( - self, - exc_type, # type: Optional[Type[BaseException]] - exc_val, # type: Optional[BaseException] - exc_tb # type: Optional[TracebackType] - ): - # type: (...) -> None - for varname, old_value in self._save_env.items(): - if old_value is None: - os.environ.pop(varname, None) - else: - os.environ[varname] = old_value - - def check_requirements(self, reqs): - # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] - """Return 2 sets: - - conflicting requirements: set of (installed, wanted) reqs tuples - - missing requirements: set of reqs - """ - missing = set() - conflicting = set() - if reqs: - ws = WorkingSet(self._lib_dirs) - for req in reqs: - try: - if ws.find(Requirement.parse(req)) is None: - missing.add(req) - except VersionConflict as e: - conflicting.add((str(e.args[0].as_requirement()), - str(e.args[1]))) - return conflicting, missing - - def install_requirements( - self, - finder, # type: PackageFinder - requirements, # type: Iterable[str] - prefix_as_string, # type: str - message # type: str - ): - # type: (...) -> None - prefix = self._prefixes[prefix_as_string] - assert not prefix.setup - prefix.setup = True - if not requirements: - return - with contextlib.ExitStack() as ctx: - # TODO: Remove this block when dropping 3.6 support. Python 3.6 - # lacks importlib.resources and pep517 has issues loading files in - # a zip, so we fallback to the "old" method by adding the current - # pip directory to the child process's sys.path. - if sys.version_info < (3, 7): - pip_runnable = os.path.dirname(pip_location) - else: - pip_runnable = ctx.enter_context(_create_standalone_pip()) - self._install_requirements( - pip_runnable, - finder, - requirements, - prefix, - message, - ) - - @staticmethod - def _install_requirements( - pip_runnable: str, - finder: "PackageFinder", - requirements: Iterable[str], - prefix: _Prefix, - message: str, - ) -> None: - args = [ - sys.executable, pip_runnable, 'install', - '--ignore-installed', '--no-user', '--prefix', prefix.path, - '--no-warn-script-location', - ] # type: List[str] - if logger.getEffectiveLevel() <= logging.DEBUG: - args.append('-v') - for format_control in ('no_binary', 'only_binary'): - formats = getattr(finder.format_control, format_control) - args.extend(('--' + format_control.replace('_', '-'), - ','.join(sorted(formats or {':none:'})))) - - index_urls = finder.index_urls - if index_urls: - args.extend(['-i', index_urls[0]]) - for extra_index in index_urls[1:]: - args.extend(['--extra-index-url', extra_index]) - else: - args.append('--no-index') - for link in finder.find_links: - args.extend(['--find-links', link]) - - for host in finder.trusted_hosts: - args.extend(['--trusted-host', host]) - if finder.allow_all_prereleases: - args.append('--pre') - if finder.prefer_binary: - args.append('--prefer-binary') - args.append('--') - args.extend(requirements) - extra_environ = {"_PIP_STANDALONE_CERT": where()} - with open_spinner(message) as spinner: - call_subprocess(args, spinner=spinner, extra_environ=extra_environ) - - -class NoOpBuildEnvironment(BuildEnvironment): - """A no-op drop-in replacement for BuildEnvironment - """ - - def __init__(self): - # type: () -> None - pass - - def __enter__(self): - # type: () -> None - pass - - def __exit__( - self, - exc_type, # type: Optional[Type[BaseException]] - exc_val, # type: Optional[BaseException] - exc_tb # type: Optional[TracebackType] - ): - # type: (...) -> None - pass - - def cleanup(self): - # type: () -> None - pass - - def install_requirements( - self, - finder, # type: PackageFinder - requirements, # type: Iterable[str] - prefix_as_string, # type: str - message # type: str - ): - # type: (...) -> None - raise NotImplementedError() diff --git a/venv/Lib/site-packages/pip/_internal/cache.py b/venv/Lib/site-packages/pip/_internal/cache.py deleted file mode 100644 index 7ef51b9..0000000 --- a/venv/Lib/site-packages/pip/_internal/cache.py +++ /dev/null @@ -1,287 +0,0 @@ -"""Cache Management -""" - -import hashlib -import json -import logging -import os -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.format_control import FormatControl -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds -from pip._internal.utils.urls import path_to_url - -logger = logging.getLogger(__name__) - - -def _hash_dict(d): - # type: (Dict[str, str]) -> str - """Return a stable sha224 of a dictionary.""" - s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True) - return hashlib.sha224(s.encode("ascii")).hexdigest() - - -class Cache: - """An abstract class - provides cache directories for data from links - - - :param cache_dir: The root of the cache. - :param format_control: An object of FormatControl class to limit - binaries being read from the cache. - :param allowed_formats: which formats of files the cache should store. - ('binary' and 'source' are the only allowed values) - """ - - def __init__(self, cache_dir, format_control, allowed_formats): - # type: (str, FormatControl, Set[str]) -> None - super().__init__() - assert not cache_dir or os.path.isabs(cache_dir) - self.cache_dir = cache_dir or None - self.format_control = format_control - self.allowed_formats = allowed_formats - - _valid_formats = {"source", "binary"} - assert self.allowed_formats.union(_valid_formats) == _valid_formats - - def _get_cache_path_parts(self, link): - # type: (Link) -> List[str] - """Get parts of part that must be os.path.joined with cache_dir - """ - - # We want to generate an url to use as our cache key, we don't want to - # just re-use the URL because it might have other items in the fragment - # and we don't care about those. - key_parts = {"url": link.url_without_fragment} - if link.hash_name is not None and link.hash is not None: - key_parts[link.hash_name] = link.hash - if link.subdirectory_fragment: - key_parts["subdirectory"] = link.subdirectory_fragment - - # Include interpreter name, major and minor version in cache key - # to cope with ill-behaved sdists that build a different wheel - # depending on the python version their setup.py is being run on, - # and don't encode the difference in compatibility tags. - # https://github.com/pypa/pip/issues/7296 - key_parts["interpreter_name"] = interpreter_name() - key_parts["interpreter_version"] = interpreter_version() - - # Encode our key url with sha224, we'll use this because it has similar - # security properties to sha256, but with a shorter total output (and - # thus less secure). However the differences don't make a lot of - # difference for our use case here. - hashed = _hash_dict(key_parts) - - # We want to nest the directories some to prevent having a ton of top - # level directories where we might run out of sub directories on some - # FS. - parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] - - return parts - - def _get_candidates(self, link, canonical_package_name): - # type: (Link, str) -> List[Any] - can_not_cache = ( - not self.cache_dir or - not canonical_package_name or - not link - ) - if can_not_cache: - return [] - - formats = self.format_control.get_allowed_formats( - canonical_package_name - ) - if not self.allowed_formats.intersection(formats): - return [] - - candidates = [] - path = self.get_path_for_link(link) - if os.path.isdir(path): - for candidate in os.listdir(path): - candidates.append((candidate, path)) - return candidates - - def get_path_for_link(self, link): - # type: (Link) -> str - """Return a directory to store cached items in for link. - """ - raise NotImplementedError() - - def get( - self, - link, # type: Link - package_name, # type: Optional[str] - supported_tags, # type: List[Tag] - ): - # type: (...) -> Link - """Returns a link to a cached item if it exists, otherwise returns the - passed link. - """ - raise NotImplementedError() - - -class SimpleWheelCache(Cache): - """A cache of wheels for future installs. - """ - - def __init__(self, cache_dir, format_control): - # type: (str, FormatControl) -> None - super().__init__(cache_dir, format_control, {"binary"}) - - def get_path_for_link(self, link): - # type: (Link) -> str - """Return a directory to store cached wheels for link - - Because there are M wheels for any one sdist, we provide a directory - to cache them in, and then consult that directory when looking up - cache hits. - - We only insert things into the cache if they have plausible version - numbers, so that we don't contaminate the cache with things that were - not unique. E.g. ./package might have dozens of installs done for it - and build a version of 0.0...and if we built and cached a wheel, we'd - end up using the same wheel even if the source has been edited. - - :param link: The link of the sdist for which this will cache wheels. - """ - parts = self._get_cache_path_parts(link) - assert self.cache_dir - # Store wheels within the root cache_dir - return os.path.join(self.cache_dir, "wheels", *parts) - - def get( - self, - link, # type: Link - package_name, # type: Optional[str] - supported_tags, # type: List[Tag] - ): - # type: (...) -> Link - candidates = [] - - if not package_name: - return link - - canonical_package_name = canonicalize_name(package_name) - for wheel_name, wheel_dir in self._get_candidates( - link, canonical_package_name - ): - try: - wheel = Wheel(wheel_name) - except InvalidWheelFilename: - continue - if canonicalize_name(wheel.name) != canonical_package_name: - logger.debug( - "Ignoring cached wheel %s for %s as it " - "does not match the expected distribution name %s.", - wheel_name, link, package_name, - ) - continue - if not wheel.supported(supported_tags): - # Built for a different python/arch/etc - continue - candidates.append( - ( - wheel.support_index_min(supported_tags), - wheel_name, - wheel_dir, - ) - ) - - if not candidates: - return link - - _, wheel_name, wheel_dir = min(candidates) - return Link(path_to_url(os.path.join(wheel_dir, wheel_name))) - - -class EphemWheelCache(SimpleWheelCache): - """A SimpleWheelCache that creates it's own temporary cache directory - """ - - def __init__(self, format_control): - # type: (FormatControl) -> None - self._temp_dir = TempDirectory( - kind=tempdir_kinds.EPHEM_WHEEL_CACHE, - globally_managed=True, - ) - - super().__init__(self._temp_dir.path, format_control) - - -class CacheEntry: - def __init__( - self, - link, # type: Link - persistent, # type: bool - ): - self.link = link - self.persistent = persistent - - -class WheelCache(Cache): - """Wraps EphemWheelCache and SimpleWheelCache into a single Cache - - This Cache allows for gracefully degradation, using the ephem wheel cache - when a certain link is not found in the simple wheel cache first. - """ - - def __init__(self, cache_dir, format_control): - # type: (str, FormatControl) -> None - super().__init__(cache_dir, format_control, {'binary'}) - self._wheel_cache = SimpleWheelCache(cache_dir, format_control) - self._ephem_cache = EphemWheelCache(format_control) - - def get_path_for_link(self, link): - # type: (Link) -> str - return self._wheel_cache.get_path_for_link(link) - - def get_ephem_path_for_link(self, link): - # type: (Link) -> str - return self._ephem_cache.get_path_for_link(link) - - def get( - self, - link, # type: Link - package_name, # type: Optional[str] - supported_tags, # type: List[Tag] - ): - # type: (...) -> Link - cache_entry = self.get_cache_entry(link, package_name, supported_tags) - if cache_entry is None: - return link - return cache_entry.link - - def get_cache_entry( - self, - link, # type: Link - package_name, # type: Optional[str] - supported_tags, # type: List[Tag] - ): - # type: (...) -> Optional[CacheEntry] - """Returns a CacheEntry with a link to a cached item if it exists or - None. The cache entry indicates if the item was found in the persistent - or ephemeral cache. - """ - retval = self._wheel_cache.get( - link=link, - package_name=package_name, - supported_tags=supported_tags, - ) - if retval is not link: - return CacheEntry(retval, persistent=True) - - retval = self._ephem_cache.get( - link=link, - package_name=package_name, - supported_tags=supported_tags, - ) - if retval is not link: - return CacheEntry(retval, persistent=False) - - return None diff --git a/venv/Lib/site-packages/pip/_internal/cli/__init__.py b/venv/Lib/site-packages/pip/_internal/cli/__init__.py deleted file mode 100644 index e589bb9..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Subpackage containing all of pip's command line interface related code -""" - -# This file intentionally does not import submodules diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 253fc210618289a13d08a7832980205a96cde297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmYjMy-I^Y5WFvqA&_Utb&^6KKtybUolQDfI5u~i&&9nT?k*q1+L!T_()tK?R&IiY z12fC)7Bh>><-#b6tnfqU*V+8XpypB8<|@Iwm@sV3diMUbJ?sklHyp|OoH}yiG+Gp~ zd2b7s>!$k{F$F7}$a3mb_vp!166_T89BA>p9!^)zh3uXCG9R!+4a)DCw zSTROTfO71wIk}NLj2Ou^Z9yFe9z+I9P3V2~~YPmaiTaKsseazt? L^l*OiTWNj)OgK{w diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc deleted file mode 100644 index 37492a6c2fcb990825e4b482817357d952059237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4969 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 diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-39.pyc deleted file mode 100644 index fd56139ec79df0bb49fb07f6288fe96e5f01f36e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5792 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 diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc deleted file mode 100644 index 85050c8484aa305d3da244d4d11b253328bb762f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21026 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 Q_cN~-Z|U^-PUiJL0gjP$J^%m! diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc deleted file mode 100644 index 810ad2f53bedc9c435caccd00a10826061243d6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1220 zcmZuwO>Yx15VgG@*`!H{Xz2k}0xn2<0E&b-AcPQAi;6@pjfz;UWSO;_F5NG@+o*|p zB9VGR{Dt<|zvL??{sJdvHVLFqul#I}?eUwLx1!T&5okqnPdu>*`GJe&X2aq&^zsdW zB$6g1r2$P@z$mU+Vx@Lqr%vFcZs1a)Txm&LI^S5(cuS-!8&e`16Bc;V+b4eWC-@;g zGtHgTxZ1BobZl0mJgd}cm5NLZl=dyNx;?YJpIMBzS1B#3T$@IJRHy@?4dea3Pfat* zheF39t0Hu~+#sB~m0K_<5>QD3c1{kdq>@d&z*06+ostO+9O+1RN&@$s*d%BG(S}*u z&QqWy7hK}gy)2@0r#Rr8LC1&6O@N9_$OXNG4N1=kXO%S}FxrxUL)P2%9pjWIh0@03 zJkH{ZbJK+hPX)j{3mRRT&NbT=HFl|zLl~Q!M~Ns)&acR?qn#I_R6~{IMOf&3phcR- z*&r-N)lr`DL0p9ckt$vmB2wW{Wy3IuKZRvnsYhTshIE%<5f>qlfDC6M38N$qqgmh! zMvse;UI9`b#_0kO)}k&QZ{Cog$BV%J%M{+m8kK#3GxC|});sbQiUAoS} z=WWivoQPz$QLx$~dWi-0XxnA9wNhJqe$%w( x0fFplVb>2Bw;C0oQ;k7r2LWZJ(M^4G>7lxOb>+O5GvcrCzpHiFrR%J1{RZ&1AZP#p diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-39.pyc deleted file mode 100644 index c6678674555cc14319e4104206e408cf50125d6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1320 zcmZWpy>1*g5GJ|5_a~hsN0AFVivTXJ(7{NN!Z3^khKc|O*-#22#0HD?kyx+H{Q=24 z`3`q3;si*OCkO(Z%G7y@JOkUL@hhatkSiE+LV`2Hnc>X0Gvwx@Q6Ir*#b@~+J%s+U zo7=;K%~!D0&p;TWh+#$qrr2>piQ^vi9QUaY+!H|+(y)qXgss0X;;Kh`P7XxB8qk50 zLouvIbmZhn>{a`8-^sBUR|oU}BTjaQ{OB6fJ8Zyutp6jXpD^+*nhe*;b6HloTqSwi zigKRovZ)hZYq@Hhvewi7d%%m%C&c)(QfU)EYpqKzCfE$~g>L3e)e5dT>_=@b70*CZ z%l1slMuK&~cq@6Aa*l19n-K!H)qDy|{S9OT6d7y60Z zMO&oF&bvk!Y5yJ2^;icR^bV(Fi?`$js?U9-!_^NMZ9TAl31_2S%*e+375zr8F`RQ6 z-Mj2}yWN0cE4@J9LB6f`)~ov+e~2EU^`Rc_MtXR;$GmG|z3ML@!|-x{^(W-;A;*ax z?+%#1@jJVV;=lD>6yP?BKHOjyY{(L^@E5WTHo@*_18ATZ(fNB@gmrXwaq;ZpQDV^g z!8b+S$g(aHZfll2P|4LRUMGrcZMCAA=Yp^Mr>CWA1XS7l0@NR%~Kyfr?5Q)&}-sZ9@{ z+=$`qY4-JOW&+n=>tREifbo}$LfW1hzsk#c5;{bR#`B70bzbpK0+h;l{LS28PNSPk z^gELG;N(BwpFK($Uvkm3X)BvT=2Zpw({`m_HFZ{$IxQelrrLbY(UCalm9}M@W^k#wg!`M$MVVSW({?5ALXJ~dDglB>jQ6~lgoNNR-ouBm5}yDclh0u} z?+HGi9GfW1SToNuc?8F3WIq{D$uaEY5Qqu&sk7HsC8m~_3O$N%x^-kox_rY9d8p|0G$T;*C!k3KdpbSYGKM|uU=K2HQ p_o>BitK`~oi`)mDi62)DTL}KdUSM?s#D^Mob4-T#W|IE>e*w;*X21Xd diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc deleted file mode 100644 index b12686b6bf3696728b5690c13872dc40f945e60a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2101 zcmZWqOOG5i5N^Al(>pW!AmpVWnw3Zxq>Km`B($tRn?xW*0g-TNCTjJLy`A25Kd?QU z%&6zW1c?g=&QYY<3levJ2}fT!ua*EbEA$Lppau#I9f-YmA_Ezmn8%y9e$StFfiR(yeUNeJIJ34UM=db3YH zi$q>#j7Bv}$22;qcr>m`A^Bu1VIoRP649r1rB_ArF^!5eFQYo;g7WYsIAh%(VCCG) zg;egtNzLd0sc>A7s+Ktzg2}DDsyxWEFU`PLW~X}Vo0_EhfZOySoiHgrr>wqP@gkLy za@f=xS49Dbi-hE3sV-zxCL%9#mh$9u3Qp?owae~sUg>S?dR?8@$uZ>u&R2mM;8mu! z#+;^-Cfb3dbwKsZ_tfB6yL0;3(D9+|K@$vwG&z%KVG&zmkj_u;+-j_)ePSU?It%D0 zuJo3^^bUi@I>B=Uvz-Q=AjpFYvmx;^M0^rFv*g;cdt%+T7U+^S$E36DHTVS9C;i5P z%!IRBd*-^rWPnpS;iWjA0Fy58_J)Y|?tL-48opbDr_s(TK)cbmt1LXatGtX=`zaf^ z%AJTbqiQ`RBzX*BPufMQ1IcgWubeV1sB*NmhsqiwaR2ntadDwNfF`yT^oy%y#%kf78C1b+v%nE1Bh zvR1nwHldkpS`J3~b#(jF^8*~%eH7ZB9b)gV!0F=up&@{M+Iz#2-=QO|g$1}rOTh98 z0#x9+4QRl8SK5cp(rwTo;2ij3G+>I~YRf>gsIht6*aTg%2tLC6P<9%70hLkr!DeWf zW}mLr>*h}5$hBj{f0NzDS)jQ~VB|UQ?S-A8x!1V-m&RN62=v-fb6%hL%k{=PK@0Rf z+?2rk0|sk;<1aTFN3Us|#y`+iGPut*0hFW3@=|wao0IaWte%umD@~P(wqK#`8Dw(0 zPorryi3*yQGTNTm(amVEX+o^Rw%8aPT+;?^F%`-al2j8Yo=-SrQsGJ{pXDVLv{nv% znoDIfTEb=yI5vDWdFMLv%1i5-mV|de;gK2Pw5X2hAW)7uNHa8ss@URbRSx2go=Yeb zR0UA06HWKn%_dX`WfvlAM~wkZ#xr2)fqDy?xDLX?UZ-z+s1I*oUqb;%01OIn9{{w4 z`*s(FcyLkqNkXb|lJNIo6TbmMd2(6as40f z)WvgaRzHt3p*m-UJ{{Bc4`qU<&P`8b&cv|DflZpSEw90glriu^GluI(oS~A5ljf5O ec8ZEj7~R!S5f?!?HpB#N;4a#L7bK7>i2ec5t4D_b diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-39.pyc deleted file mode 100644 index 63dcb5d79b6bd48a355f8c267951a061bd75e5f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9365 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 diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc deleted file mode 100644 index 48b0f5e7c3cfb8581e7b09d9addc69a307f25113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7437 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 diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-39.pyc deleted file mode 100644 index 984e6095f8b06a65cecf7b570a4cdfc8cb0e4bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11210 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 diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-39.pyc deleted file mode 100644 index 1f4bce29ae37dab874c99ca503779a1d0f37cab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 zcmai1TW{OQ6`tWulq@;6>(M5}<+cs_DbiEA}AWj>U6+kc|ZPTGh z?F^Ny1?45qdtVDI3dnEGzvxqc#Jui9v46o&{mxLb6-jO>%xG@poH^(F&N&m*Y88g3 zmwX(2x6asi)R}%Pbnc_bf1?Un$P?xj|J>ucZ+M3OH$7ATTb_k~BeA=V=X6V6iPL&B zal2)&+^u*O-M5mZZq=*mww=_v%ic0)kukautsHZ2^$#p`!qPhymW~W>4Lvt3qgRgB zj!f?&`jv1A{UzOBN52}@(63?jrHCC|4wu6V@7NLdHgs<#T-CkJknga@+V?mMYc&jI zY(G)%b{>f!&jk8QUv59#@*n)^>CTgTtX? zd8ke00g5D3?Gzdm`v|<8-gxJIwd9)ZdHq_FmA9eA&bH?N?Fys-46y+A_|gI~aNy>_xKO zi+gPx8bYQ)((WX2TNZ-LX73RDp|eUt(%G3YxHNmLCavh`Sz3XI+UJ~2lrbmhyzdQB z!=G2(jj^vUq4B=d$117|m{blXW4V6`?aBTdbNd%-S`AydzMs;0eO2-OZWi_vYFB;# z>wb_FGhzkb5^GeE3a2XCP`IdQg(QBs+_m(`91cv(-lt_vRHrzohOqrR4kT!d0|^@4 zo?W2Yb2Lh8YE45T=;ZOMXndO1iFKzv{OmvY9G-vuwqqA9T~nLn(O7AtG2}z$vmyA| zXJS3)2gVy?Xkg6Dt)X>9vvx?elb1&B&^)GgdB_gTQ6)6;r6ab^&|@3m?*=>OV5@}{ zRYG6GZaq5T^?_Y)Hk)-pc5Kw3*={5y@S;q4D3v4gFze^a_IKkXQcF*RJbD~=fh(bE zK3Es|$+%m_60%_wsxr;zS(Zp;cMd!BBA^+ke$laC3tCXZj>_?0$6>zTur)|jX|lUT z`+1e(t^Ghqbq$F3`@N9%)F^&MXo@;n8qUE9_<$_A?_a|nl0d-94tKeOUxhnH)ws?F z*XFI$oV@n|%n1Z!nlrONrK0i`(HIIp;Oh)#VF$*@gsG^7kqwxwQ2BUo+xBF13J@T_fV+Ys$07E-+O43Mqk z3tH$i>j+YYAU`@QIH7P0MbfDzf|J%4>b&4m!)%EStQMQ78YOX&+KBQ@kf#(4sz_=7 z$Jt%RlB+1%;I0Lv8SJET$*sArpt%mp2M_7!KFWt~Zz(iFQ@cHKe-r=<_h*mYpA%N# zR;ub!D@*6C@%x|Wc ze2gIB&Lwhy$yp*_T`c)RE}v?CR_qaZX8tYG*nc1>LgPTun7vkOaCs7`>aXK`zg{@Z z`mGaw>lyT1KNb5t8pkB|1Tq$1^tm$`-x2yBNX*wGcloH;*9AJWVu(WaR>Hhz&Y80xzJKLRsy zvLulCgpXqopGQSOa#L6#Dh}4Cl8rO+QJyk+2(_nTQl_4>5j$pYV0t3oCWU1km|r4O zFQSgAtUT^U;#XKL?xC85O*742D?5x5c$OJ2K{$SmGUgZb&j+j1!ifmcYmQT=lF{c1 z$pAu~`4_Snf?Q%D%A!z5uHX&rOJ71pKC>rcehaSSBIagef@U7QK6Mm*C>=t{++U;U z^C0)NU8jJ+v~Fonf;a(8{u5O`c4y)fa%aaZw-20`9KF&I_p~=Wb#u394L;AywEBqu z?K09E{$~W7=Lnq^en)VB>B>);e0mq7^!tmRP48JOuN)4Gu^}HV6`tlT=F{7ls~-M+ zYEFj(Jy*Sp9k9BfIr$~4<++_8?L-MuQ9Gjhl(NDsjT$vU`Jf=AC?}Rdo*#-|P-hkQ z!L8lhNN4Jg>7u1d{Z3y$sCB5xrcQboaB5RnCW=mrV8&^~X`F)Or5Z77p0}K_LXfqOdl#?Gqt9ydrD##yr>$vAOecXY= zOf>an85f!}VboPUACK?B%|0TSY<9A4FUa+&)U`zm#%L%mEoH#vv5wFM`?Ly(EN3v$ zgi_06>AOLSE0xfe(ze*gdg diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc deleted file mode 100644 index 77057b03b527160c41286a64c65431619ee4ed69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmYk1QA@)x5XaN5+e8@nAn1eO^B(jAh=_BISe&V}>x2*paS1h;wxP)i`$&GJzWTJU z;FHNz@Q(W(|Koog$0n0Q;6kf&W?ldE;(r8A+`2Mn4jf>>103)WhkSqsJi-wl;vpa9 zU^?D82iWggMO!mP)=Cm%ncWz= ZZn!X)dfOjdR}J4NapNC1{(Kbt None - """Entry Point for completion of main and subcommand options.""" - # Don't complete if user hasn't sourced bash_completion file. - if "PIP_AUTO_COMPLETE" not in os.environ: - return - cwords = os.environ["COMP_WORDS"].split()[1:] - cword = int(os.environ["COMP_CWORD"]) - try: - current = cwords[cword - 1] - except IndexError: - current = "" - - parser = create_main_parser() - subcommands = list(commands_dict) - options = [] - - # subcommand - subcommand_name = None # type: Optional[str] - for word in cwords: - if word in subcommands: - subcommand_name = word - break - # subcommand options - if subcommand_name is not None: - # special case: 'help' subcommand has no options - if subcommand_name == "help": - sys.exit(1) - # special case: list locally installed dists for show and uninstall - should_list_installed = not current.startswith("-") and subcommand_name in [ - "show", - "uninstall", - ] - if should_list_installed: - lc = current.lower() - installed = [ - dist.key - for dist in get_installed_distributions(local_only=True) - if dist.key.startswith(lc) and dist.key not in cwords[1:] - ] - # if there are no dists installed, fall back to option completion - if installed: - for dist in installed: - print(dist) - sys.exit(1) - - subcommand = create_command(subcommand_name) - - for opt in subcommand.parser.option_list_all: - if opt.help != optparse.SUPPRESS_HELP: - for opt_str in opt._long_opts + opt._short_opts: - options.append((opt_str, opt.nargs)) - - # filter out previously specified options from available options - prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]] - options = [(x, v) for (x, v) in options if x not in prev_opts] - # filter options by current input - options = [(k, v) for k, v in options if k.startswith(current)] - # get completion type given cwords and available subcommand options - completion_type = get_path_completion_type( - cwords, - cword, - subcommand.parser.option_list_all, - ) - # get completion files and directories if ``completion_type`` is - # ````, ```` or ```` - if completion_type: - paths = auto_complete_paths(current, completion_type) - options = [(path, 0) for path in paths] - for option in options: - opt_label = option[0] - # append '=' to options which require args - if option[1] and option[0][:2] == "--": - opt_label += "=" - print(opt_label) - else: - # show main parser options only when necessary - - opts = [i.option_list for i in parser.option_groups] - opts.append(parser.option_list) - flattened_opts = chain.from_iterable(opts) - if current.startswith("-"): - for opt in flattened_opts: - if opt.help != optparse.SUPPRESS_HELP: - subcommands += opt._long_opts + opt._short_opts - else: - # get completion type given cwords and all available options - completion_type = get_path_completion_type(cwords, cword, flattened_opts) - if completion_type: - subcommands = list(auto_complete_paths(current, completion_type)) - - print(" ".join([x for x in subcommands if x.startswith(current)])) - sys.exit(1) - - -def get_path_completion_type(cwords, cword, opts): - # type: (List[str], int, Iterable[Any]) -> Optional[str] - """Get the type of path completion (``file``, ``dir``, ``path`` or None) - - :param cwords: same as the environmental variable ``COMP_WORDS`` - :param cword: same as the environmental variable ``COMP_CWORD`` - :param opts: The available options to check - :return: path completion type (``file``, ``dir``, ``path`` or None) - """ - if cword < 2 or not cwords[cword - 2].startswith("-"): - return None - for opt in opts: - if opt.help == optparse.SUPPRESS_HELP: - continue - for o in str(opt).split("/"): - if cwords[cword - 2].split("=")[0] == o: - if not opt.metavar or any( - x in ("path", "file", "dir") for x in opt.metavar.split("/") - ): - return opt.metavar - return None - - -def auto_complete_paths(current, completion_type): - # type: (str, str) -> Iterable[str] - """If ``completion_type`` is ``file`` or ``path``, list all regular files - and directories starting with ``current``; otherwise only list directories - starting with ``current``. - - :param current: The word to be completed - :param completion_type: path completion type(`file`, `path` or `dir`)i - :return: A generator of regular files and/or directories - """ - directory, filename = os.path.split(current) - current_path = os.path.abspath(directory) - # Don't complete paths if they can't be accessed - if not os.access(current_path, os.R_OK): - return - filename = os.path.normcase(filename) - # list all files that start with ``filename`` - file_list = ( - x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename) - ) - for f in file_list: - opt = os.path.join(current_path, f) - comp_file = os.path.normcase(os.path.join(directory, f)) - # complete regular files when there is not ```` after option - # complete directories when there is ````, ```` or - # ````after option - if completion_type != "dir" and os.path.isfile(opt): - yield comp_file - elif os.path.isdir(opt): - yield os.path.join(comp_file, "") diff --git a/venv/Lib/site-packages/pip/_internal/cli/base_command.py b/venv/Lib/site-packages/pip/_internal/cli/base_command.py deleted file mode 100644 index b59420d..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/base_command.py +++ /dev/null @@ -1,221 +0,0 @@ -"""Base Command class, and related routines""" - -import logging -import logging.config -import optparse -import os -import sys -import traceback -from optparse import Values -from typing import Any, List, Optional, Tuple - -from pip._internal.cli import cmdoptions -from pip._internal.cli.command_context import CommandContextMixIn -from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter -from pip._internal.cli.status_codes import ( - ERROR, - PREVIOUS_BUILD_DIR_ERROR, - UNKNOWN_ERROR, - VIRTUALENV_NOT_FOUND, -) -from pip._internal.exceptions import ( - BadCommand, - CommandError, - InstallationError, - NetworkConnectionError, - PreviousBuildDirError, - UninstallationError, -) -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging -from pip._internal.utils.misc import get_prog, normalize_path -from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry -from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry -from pip._internal.utils.virtualenv import running_under_virtualenv - -__all__ = ["Command"] - -logger = logging.getLogger(__name__) - - -class Command(CommandContextMixIn): - usage = None # type: str - ignore_require_venv = False # type: bool - - def __init__(self, name, summary, isolated=False): - # type: (str, str, bool) -> None - super().__init__() - - self.name = name - self.summary = summary - self.parser = ConfigOptionParser( - usage=self.usage, - prog=f"{get_prog()} {name}", - formatter=UpdatingDefaultsHelpFormatter(), - add_help_option=False, - name=name, - description=self.__doc__, - isolated=isolated, - ) - - self.tempdir_registry = None # type: Optional[TempDirRegistry] - - # Commands should add options to this option group - optgroup_name = f"{self.name.capitalize()} Options" - self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) - - # Add the general options - gen_opts = cmdoptions.make_option_group( - cmdoptions.general_group, - self.parser, - ) - self.parser.add_option_group(gen_opts) - - self.add_options() - - def add_options(self): - # type: () -> None - pass - - def handle_pip_version_check(self, options): - # type: (Values) -> None - """ - This is a no-op so that commands by default do not do the pip version - check. - """ - # Make sure we do the pip version check if the index_group options - # are present. - assert not hasattr(options, "no_index") - - def run(self, options, args): - # type: (Values, List[Any]) -> int - raise NotImplementedError - - def parse_args(self, args): - # type: (List[str]) -> Tuple[Any, Any] - # factored out for testability - return self.parser.parse_args(args) - - def main(self, args): - # type: (List[str]) -> int - try: - with self.main_context(): - return self._main(args) - finally: - logging.shutdown() - - def _main(self, args): - # type: (List[str]) -> int - # We must initialize this before the tempdir manager, otherwise the - # configuration would not be accessible by the time we clean up the - # tempdir manager. - self.tempdir_registry = self.enter_context(tempdir_registry()) - # Intentionally set as early as possible so globally-managed temporary - # directories are available to the rest of the code. - self.enter_context(global_tempdir_manager()) - - options, args = self.parse_args(args) - - # Set verbosity so that it can be used elsewhere. - self.verbosity = options.verbose - options.quiet - - level_number = setup_logging( - verbosity=self.verbosity, - no_color=options.no_color, - user_log_file=options.log, - ) - - # TODO: Try to get these passing down from the command? - # without resorting to os.environ to hold these. - # This also affects isolated builds and it should. - - if options.no_input: - os.environ["PIP_NO_INPUT"] = "1" - - if options.exists_action: - os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action) - - if options.require_venv and not self.ignore_require_venv: - # If a venv is required check if it can really be found - if not running_under_virtualenv(): - logger.critical("Could not find an activated virtualenv (required).") - sys.exit(VIRTUALENV_NOT_FOUND) - - if options.cache_dir: - options.cache_dir = normalize_path(options.cache_dir) - if not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "or is not writable by the current user. The cache " - "has been disabled. Check the permissions and owner of " - "that directory. If executing pip with sudo, you should " - "use sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - if getattr(options, "build_dir", None): - deprecated( - reason=( - "The -b/--build/--build-dir/--build-directory " - "option is deprecated and has no effect anymore." - ), - replacement=( - "use the TMPDIR/TEMP/TMP environment variable, " - "possibly combined with --no-clean" - ), - gone_in="21.3", - issue=8333, - ) - - if "2020-resolver" in options.features_enabled: - logger.warning( - "--use-feature=2020-resolver no longer has any effect, " - "since it is now the default dependency resolver in pip. " - "This will become an error in pip 21.0." - ) - - try: - status = self.run(options, args) - assert isinstance(status, int) - return status - except PreviousBuildDirError as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return PREVIOUS_BUILD_DIR_ERROR - except ( - InstallationError, - UninstallationError, - BadCommand, - NetworkConnectionError, - ) as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except CommandError as exc: - logger.critical("%s", exc) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BrokenStdoutLoggingError: - # Bypass our logger and write any remaining messages to stderr - # because stdout no longer works. - print("ERROR: Pipe to stdout was broken", file=sys.stderr) - if level_number <= logging.DEBUG: - traceback.print_exc(file=sys.stderr) - - return ERROR - except KeyboardInterrupt: - logger.critical("Operation cancelled by user") - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BaseException: - logger.critical("Exception:", exc_info=True) - - return UNKNOWN_ERROR - finally: - self.handle_pip_version_check(options) diff --git a/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py b/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py deleted file mode 100644 index f71c0b0..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +++ /dev/null @@ -1,1024 +0,0 @@ -""" -shared options and groups - -The principle here is to define options once, but *not* instantiate them -globally. One reason being that options with action='append' can carry state -between parses. pip parses general options twice internally, and shouldn't -pass on state. To be consistent, all options will follow this design. -""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import os -import textwrap -import warnings -from functools import partial -from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values -from textwrap import dedent -from typing import Any, Callable, Dict, Optional, Tuple - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.parser import ConfigOptionParser -from pip._internal.cli.progress_bars import BAR_TYPES -from pip._internal.exceptions import CommandError -from pip._internal.locations import USER_CACHE_DIR, get_src_prefix -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.models.target_python import TargetPython -from pip._internal.utils.hashes import STRONG_HASHES -from pip._internal.utils.misc import strtobool - - -def raise_option_error(parser, option, msg): - # type: (OptionParser, Option, str) -> None - """ - Raise an option parsing error using parser.error(). - - Args: - parser: an OptionParser instance. - option: an Option instance. - msg: the error text. - """ - msg = f"{option} error: {msg}" - msg = textwrap.fill(" ".join(msg.split())) - parser.error(msg) - - -def make_option_group(group, parser): - # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup - """ - Return an OptionGroup object - group -- assumed to be dict with 'name' and 'options' keys - parser -- an optparse Parser - """ - option_group = OptionGroup(parser, group["name"]) - for option in group["options"]: - option_group.add_option(option()) - return option_group - - -def check_install_build_global(options, check_options=None): - # type: (Values, Optional[Values]) -> None - """Disable wheels if per-setup.py call options are set. - - :param options: The OptionParser options to update. - :param check_options: The options to check, if not supplied defaults to - options. - """ - if check_options is None: - check_options = options - - def getname(n): - # type: (str) -> Optional[Any] - return getattr(check_options, n, None) - - names = ["build_options", "global_options", "install_options"] - if any(map(getname, names)): - control = options.format_control - control.disallow_binaries() - warnings.warn( - "Disabling all use of wheels due to the use of --build-option " - "/ --global-option / --install-option.", - stacklevel=2, - ) - - -def check_dist_restriction(options, check_target=False): - # type: (Values, bool) -> None - """Function for determining if custom platform options are allowed. - - :param options: The OptionParser options. - :param check_target: Whether or not to check if --target is being used. - """ - dist_restriction_set = any( - [ - options.python_version, - options.platforms, - options.abis, - options.implementation, - ] - ) - - binary_only = FormatControl(set(), {":all:"}) - sdist_dependencies_allowed = ( - options.format_control != binary_only and not options.ignore_dependencies - ) - - # Installations or downloads using dist restrictions must not combine - # source distributions and dist-specific wheels, as they are not - # guaranteed to be locally compatible. - if dist_restriction_set and sdist_dependencies_allowed: - raise CommandError( - "When restricting platform and interpreter constraints using " - "--python-version, --platform, --abi, or --implementation, " - "either --no-deps must be set, or --only-binary=:all: must be " - "set and --no-binary must not be set (or must be set to " - ":none:)." - ) - - if check_target: - if dist_restriction_set and not options.target_dir: - raise CommandError( - "Can not use any platform or abi specific options unless " - "installing via '--target'" - ) - - -def _path_option_check(option, opt, value): - # type: (Option, str, str) -> str - return os.path.expanduser(value) - - -def _package_name_option_check(option, opt, value): - # type: (Option, str, str) -> str - return canonicalize_name(value) - - -class PipOption(Option): - TYPES = Option.TYPES + ("path", "package_name") - TYPE_CHECKER = Option.TYPE_CHECKER.copy() - TYPE_CHECKER["package_name"] = _package_name_option_check - TYPE_CHECKER["path"] = _path_option_check - - -########### -# options # -########### - -help_ = partial( - Option, - "-h", - "--help", - dest="help", - action="help", - help="Show help.", -) # type: Callable[..., Option] - -isolated_mode = partial( - Option, - "--isolated", - dest="isolated_mode", - action="store_true", - default=False, - help=( - "Run pip in an isolated mode, ignoring environment variables and user " - "configuration." - ), -) # type: Callable[..., Option] - -require_virtualenv = partial( - Option, - # Run only if inside a virtualenv, bail if not. - "--require-virtualenv", - "--require-venv", - dest="require_venv", - action="store_true", - default=False, - help=SUPPRESS_HELP, -) # type: Callable[..., Option] - -verbose = partial( - Option, - "-v", - "--verbose", - dest="verbose", - action="count", - default=0, - help="Give more output. Option is additive, and can be used up to 3 times.", -) # type: Callable[..., Option] - -no_color = partial( - Option, - "--no-color", - dest="no_color", - action="store_true", - default=False, - help="Suppress colored output.", -) # type: Callable[..., Option] - -version = partial( - Option, - "-V", - "--version", - dest="version", - action="store_true", - help="Show version and exit.", -) # type: Callable[..., Option] - -quiet = partial( - Option, - "-q", - "--quiet", - dest="quiet", - action="count", - default=0, - help=( - "Give less output. Option is additive, and can be used up to 3" - " times (corresponding to WARNING, ERROR, and CRITICAL logging" - " levels)." - ), -) # type: Callable[..., Option] - -progress_bar = partial( - Option, - "--progress-bar", - dest="progress_bar", - type="choice", - choices=list(BAR_TYPES.keys()), - default="on", - help=( - "Specify type of progress to be displayed [" - + "|".join(BAR_TYPES.keys()) - + "] (default: %default)" - ), -) # type: Callable[..., Option] - -log = partial( - PipOption, - "--log", - "--log-file", - "--local-log", - dest="log", - metavar="path", - type="path", - help="Path to a verbose appending log.", -) # type: Callable[..., Option] - -no_input = partial( - Option, - # Don't ask for input - "--no-input", - dest="no_input", - action="store_true", - default=False, - help="Disable prompting for input.", -) # type: Callable[..., Option] - -proxy = partial( - Option, - "--proxy", - dest="proxy", - type="str", - default="", - help="Specify a proxy in the form [user:passwd@]proxy.server:port.", -) # type: Callable[..., Option] - -retries = partial( - Option, - "--retries", - dest="retries", - type="int", - default=5, - help="Maximum number of retries each connection should attempt " - "(default %default times).", -) # type: Callable[..., Option] - -timeout = partial( - Option, - "--timeout", - "--default-timeout", - metavar="sec", - dest="timeout", - type="float", - default=15, - help="Set the socket timeout (default %default seconds).", -) # type: Callable[..., Option] - - -def exists_action(): - # type: () -> Option - return Option( - # Option when path already exist - "--exists-action", - dest="exists_action", - type="choice", - choices=["s", "i", "w", "b", "a"], - default=[], - action="append", - metavar="action", - help="Default action when a path already exists: " - "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", - ) - - -cert = partial( - PipOption, - "--cert", - dest="cert", - type="path", - metavar="path", - help=( - "Path to PEM-encoded CA certificate bundle. " - "If provided, overrides the default. " - "See 'SSL Certificate Verification' in pip documentation " - "for more information." - ), -) # type: Callable[..., Option] - -client_cert = partial( - PipOption, - "--client-cert", - dest="client_cert", - type="path", - default=None, - metavar="path", - help="Path to SSL client certificate, a single file containing the " - "private key and the certificate in PEM format.", -) # type: Callable[..., Option] - -index_url = partial( - Option, - "-i", - "--index-url", - "--pypi-url", - dest="index_url", - metavar="URL", - default=PyPI.simple_url, - help="Base URL of the Python Package Index (default %default). " - "This should point to a repository compliant with PEP 503 " - "(the simple repository API) or a local directory laid out " - "in the same format.", -) # type: Callable[..., Option] - - -def extra_index_url(): - # type: () -> Option - return Option( - "--extra-index-url", - dest="extra_index_urls", - metavar="URL", - action="append", - default=[], - help="Extra URLs of package indexes to use in addition to " - "--index-url. Should follow the same rules as " - "--index-url.", - ) - - -no_index = partial( - Option, - "--no-index", - dest="no_index", - action="store_true", - default=False, - help="Ignore package index (only looking at --find-links URLs instead).", -) # type: Callable[..., Option] - - -def find_links(): - # type: () -> Option - return Option( - "-f", - "--find-links", - dest="find_links", - action="append", - default=[], - metavar="url", - help="If a URL or path to an html file, then parse for links to " - "archives such as sdist (.tar.gz) or wheel (.whl) files. " - "If a local path or file:// URL that's a directory, " - "then look for archives in the directory listing. " - "Links to VCS project URLs are not supported.", - ) - - -def trusted_host(): - # type: () -> Option - return Option( - "--trusted-host", - dest="trusted_hosts", - action="append", - metavar="HOSTNAME", - default=[], - help="Mark this host or host:port pair as trusted, even though it " - "does not have valid or any HTTPS.", - ) - - -def constraints(): - # type: () -> Option - return Option( - "-c", - "--constraint", - dest="constraints", - action="append", - default=[], - metavar="file", - help="Constrain versions using the given constraints file. " - "This option can be used multiple times.", - ) - - -def requirements(): - # type: () -> Option - return Option( - "-r", - "--requirement", - dest="requirements", - action="append", - default=[], - metavar="file", - help="Install from the given requirements file. " - "This option can be used multiple times.", - ) - - -def editable(): - # type: () -> Option - return Option( - "-e", - "--editable", - dest="editables", - action="append", - default=[], - metavar="path/url", - help=( - "Install a project in editable mode (i.e. setuptools " - '"develop mode") from a local project path or a VCS url.' - ), - ) - - -def _handle_src(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - value = os.path.abspath(value) - setattr(parser.values, option.dest, value) - - -src = partial( - PipOption, - "--src", - "--source", - "--source-dir", - "--source-directory", - dest="src_dir", - type="path", - metavar="dir", - default=get_src_prefix(), - action="callback", - callback=_handle_src, - help="Directory to check out editable projects into. " - 'The default in a virtualenv is "/src". ' - 'The default for global installs is "/src".', -) # type: Callable[..., Option] - - -def _get_format_control(values, option): - # type: (Values, Option) -> Any - """Get a format_control object.""" - return getattr(values, option.dest) - - -def _handle_no_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, - existing.no_binary, - existing.only_binary, - ) - - -def _handle_only_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, - existing.only_binary, - existing.no_binary, - ) - - -def no_binary(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--no-binary", - dest="format_control", - action="callback", - callback=_handle_no_binary, - type="str", - default=format_control, - help="Do not use binary packages. Can be supplied multiple times, and " - 'each time adds to the existing value. Accepts either ":all:" to ' - 'disable all binary packages, ":none:" to empty the set (notice ' - "the colons), or one or more package names with commas between " - "them (no colons). Note that some packages are tricky to compile " - "and may fail to install when this option is used on them.", - ) - - -def only_binary(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--only-binary", - dest="format_control", - action="callback", - callback=_handle_only_binary, - type="str", - default=format_control, - help="Do not use source packages. Can be supplied multiple times, and " - 'each time adds to the existing value. Accepts either ":all:" to ' - 'disable all source packages, ":none:" to empty the set, or one ' - "or more package names with commas between them. Packages " - "without binary distributions will fail to install when this " - "option is used on them.", - ) - - -platforms = partial( - Option, - "--platform", - dest="platforms", - metavar="platform", - action="append", - default=None, - help=( - "Only use wheels compatible with . Defaults to the " - "platform of the running system. Use this option multiple times to " - "specify multiple platforms supported by the target interpreter." - ), -) # type: Callable[..., Option] - - -# This was made a separate function for unit-testing purposes. -def _convert_python_version(value): - # type: (str) -> Tuple[Tuple[int, ...], Optional[str]] - """ - Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. - - :return: A 2-tuple (version_info, error_msg), where `error_msg` is - non-None if and only if there was a parsing error. - """ - if not value: - # The empty string is the same as not providing a value. - return (None, None) - - parts = value.split(".") - if len(parts) > 3: - return ((), "at most three version parts are allowed") - - if len(parts) == 1: - # Then we are in the case of "3" or "37". - value = parts[0] - if len(value) > 1: - parts = [value[0], value[1:]] - - try: - version_info = tuple(int(part) for part in parts) - except ValueError: - return ((), "each version part must be an integer") - - return (version_info, None) - - -def _handle_python_version(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - """ - Handle a provided --python-version value. - """ - version_info, error_msg = _convert_python_version(value) - if error_msg is not None: - msg = "invalid --python-version value: {!r}: {}".format( - value, - error_msg, - ) - raise_option_error(parser, option=option, msg=msg) - - parser.values.python_version = version_info - - -python_version = partial( - Option, - "--python-version", - dest="python_version", - metavar="python_version", - action="callback", - callback=_handle_python_version, - type="str", - default=None, - help=dedent( - """\ - The Python interpreter version to use for wheel and "Requires-Python" - compatibility checks. Defaults to a version derived from the running - interpreter. The version can be specified using up to three dot-separated - integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor - version can also be given as a string without dots (e.g. "37" for 3.7.0). - """ - ), -) # type: Callable[..., Option] - - -implementation = partial( - Option, - "--implementation", - dest="implementation", - metavar="implementation", - default=None, - help=( - "Only use wheels compatible with Python " - "implementation , e.g. 'pp', 'jy', 'cp', " - " or 'ip'. If not specified, then the current " - "interpreter implementation is used. Use 'py' to force " - "implementation-agnostic wheels." - ), -) # type: Callable[..., Option] - - -abis = partial( - Option, - "--abi", - dest="abis", - metavar="abi", - action="append", - default=None, - help=( - "Only use wheels compatible with Python abi , e.g. 'pypy_41'. " - "If not specified, then the current interpreter abi tag is used. " - "Use this option multiple times to specify multiple abis supported " - "by the target interpreter. Generally you will need to specify " - "--implementation, --platform, and --python-version when using this " - "option." - ), -) # type: Callable[..., Option] - - -def add_target_python_options(cmd_opts): - # type: (OptionGroup) -> None - cmd_opts.add_option(platforms()) - cmd_opts.add_option(python_version()) - cmd_opts.add_option(implementation()) - cmd_opts.add_option(abis()) - - -def make_target_python(options): - # type: (Values) -> TargetPython - target_python = TargetPython( - platforms=options.platforms, - py_version_info=options.python_version, - abis=options.abis, - implementation=options.implementation, - ) - - return target_python - - -def prefer_binary(): - # type: () -> Option - return Option( - "--prefer-binary", - dest="prefer_binary", - action="store_true", - default=False, - help="Prefer older binary packages over newer source packages.", - ) - - -cache_dir = partial( - PipOption, - "--cache-dir", - dest="cache_dir", - default=USER_CACHE_DIR, - metavar="dir", - type="path", - help="Store the cache data in .", -) # type: Callable[..., Option] - - -def _handle_no_cache_dir(option, opt, value, parser): - # type: (Option, str, str, OptionParser) -> None - """ - Process a value provided for the --no-cache-dir option. - - This is an optparse.Option callback for the --no-cache-dir option. - """ - # The value argument will be None if --no-cache-dir is passed via the - # command-line, since the option doesn't accept arguments. However, - # the value can be non-None if the option is triggered e.g. by an - # environment variable, like PIP_NO_CACHE_DIR=true. - if value is not None: - # Then parse the string value to get argument error-checking. - try: - strtobool(value) - except ValueError as exc: - raise_option_error(parser, option=option, msg=str(exc)) - - # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() - # converted to 0 (like "false" or "no") caused cache_dir to be disabled - # rather than enabled (logic would say the latter). Thus, we disable - # the cache directory not just on values that parse to True, but (for - # backwards compatibility reasons) also on values that parse to False. - # In other words, always set it to False if the option is provided in - # some (valid) form. - parser.values.cache_dir = False - - -no_cache = partial( - Option, - "--no-cache-dir", - dest="cache_dir", - action="callback", - callback=_handle_no_cache_dir, - help="Disable the cache.", -) # type: Callable[..., Option] - -no_deps = partial( - Option, - "--no-deps", - "--no-dependencies", - dest="ignore_dependencies", - action="store_true", - default=False, - help="Don't install package dependencies.", -) # type: Callable[..., Option] - -build_dir = partial( - PipOption, - "-b", - "--build", - "--build-dir", - "--build-directory", - dest="build_dir", - type="path", - metavar="dir", - help=SUPPRESS_HELP, -) # type: Callable[..., Option] - -ignore_requires_python = partial( - Option, - "--ignore-requires-python", - dest="ignore_requires_python", - action="store_true", - help="Ignore the Requires-Python information.", -) # type: Callable[..., Option] - -no_build_isolation = partial( - Option, - "--no-build-isolation", - dest="build_isolation", - action="store_false", - default=True, - help="Disable isolation when building a modern source distribution. " - "Build dependencies specified by PEP 518 must be already installed " - "if this option is used.", -) # type: Callable[..., Option] - - -def _handle_no_use_pep517(option, opt, value, parser): - # type: (Option, str, str, OptionParser) -> None - """ - Process a value provided for the --no-use-pep517 option. - - This is an optparse.Option callback for the no_use_pep517 option. - """ - # Since --no-use-pep517 doesn't accept arguments, the value argument - # will be None if --no-use-pep517 is passed via the command-line. - # However, the value can be non-None if the option is triggered e.g. - # by an environment variable, for example "PIP_NO_USE_PEP517=true". - if value is not None: - msg = """A value was passed for --no-use-pep517, - probably using either the PIP_NO_USE_PEP517 environment variable - or the "no-use-pep517" config file option. Use an appropriate value - of the PIP_USE_PEP517 environment variable or the "use-pep517" - config file option instead. - """ - raise_option_error(parser, option=option, msg=msg) - - # Otherwise, --no-use-pep517 was passed via the command-line. - parser.values.use_pep517 = False - - -use_pep517 = partial( - Option, - "--use-pep517", - dest="use_pep517", - action="store_true", - default=None, - help="Use PEP 517 for building source distributions " - "(use --no-use-pep517 to force legacy behaviour).", -) # type: Any - -no_use_pep517 = partial( - Option, - "--no-use-pep517", - dest="use_pep517", - action="callback", - callback=_handle_no_use_pep517, - default=None, - help=SUPPRESS_HELP, -) # type: Any - -install_options = partial( - Option, - "--install-option", - dest="install_options", - action="append", - metavar="options", - help="Extra arguments to be supplied to the setup.py install " - 'command (use like --install-option="--install-scripts=/usr/local/' - 'bin"). Use multiple --install-option options to pass multiple ' - "options to setup.py install. If you are using an option with a " - "directory path, be sure to use absolute path.", -) # type: Callable[..., Option] - -build_options = partial( - Option, - "--build-option", - dest="build_options", - metavar="options", - action="append", - help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", -) # type: Callable[..., Option] - -global_options = partial( - Option, - "--global-option", - dest="global_options", - action="append", - metavar="options", - help="Extra global options to be supplied to the setup.py " - "call before the install or bdist_wheel command.", -) # type: Callable[..., Option] - -no_clean = partial( - Option, - "--no-clean", - action="store_true", - default=False, - help="Don't clean up build directories.", -) # type: Callable[..., Option] - -pre = partial( - Option, - "--pre", - action="store_true", - default=False, - help="Include pre-release and development versions. By default, " - "pip only finds stable versions.", -) # type: Callable[..., Option] - -disable_pip_version_check = partial( - Option, - "--disable-pip-version-check", - dest="disable_pip_version_check", - action="store_true", - default=False, - help="Don't periodically check PyPI to determine whether a new version " - "of pip is available for download. Implied with --no-index.", -) # type: Callable[..., Option] - - -def _handle_merge_hash(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - """Given a value spelled "algo:digest", append the digest to a list - pointed to in a dict by the algo name.""" - if not parser.values.hashes: - parser.values.hashes = {} - try: - algo, digest = value.split(":", 1) - except ValueError: - parser.error( - "Arguments to {} must be a hash name " # noqa - "followed by a value, like --hash=sha256:" - "abcde...".format(opt_str) - ) - if algo not in STRONG_HASHES: - parser.error( - "Allowed hash algorithms for {} are {}.".format( # noqa - opt_str, ", ".join(STRONG_HASHES) - ) - ) - parser.values.hashes.setdefault(algo, []).append(digest) - - -hash = partial( - Option, - "--hash", - # Hash values eventually end up in InstallRequirement.hashes due to - # __dict__ copying in process_line(). - dest="hashes", - action="callback", - callback=_handle_merge_hash, - type="string", - help="Verify that the package's archive matches this " - "hash before installing. Example: --hash=sha256:abcdef...", -) # type: Callable[..., Option] - - -require_hashes = partial( - Option, - "--require-hashes", - dest="require_hashes", - action="store_true", - default=False, - help="Require a hash to check each requirement against, for " - "repeatable installs. This option is implied when any package in a " - "requirements file has a --hash option.", -) # type: Callable[..., Option] - - -list_path = partial( - PipOption, - "--path", - dest="path", - type="path", - action="append", - help="Restrict to the specified installation path for listing " - "packages (can be used multiple times).", -) # type: Callable[..., Option] - - -def check_list_path_option(options): - # type: (Values) -> None - if options.path and (options.user or options.local): - raise CommandError("Cannot combine '--path' with '--user' or '--local'") - - -list_exclude = partial( - PipOption, - "--exclude", - dest="excludes", - action="append", - metavar="package", - type="package_name", - help="Exclude specified package from the output", -) # type: Callable[..., Option] - - -no_python_version_warning = partial( - Option, - "--no-python-version-warning", - dest="no_python_version_warning", - action="store_true", - default=False, - help="Silence deprecation warnings for upcoming unsupported Pythons.", -) # type: Callable[..., Option] - - -use_new_feature = partial( - Option, - "--use-feature", - dest="features_enabled", - metavar="feature", - action="append", - default=[], - choices=["2020-resolver", "fast-deps", "in-tree-build"], - help="Enable new functionality, that may be backward incompatible.", -) # type: Callable[..., Option] - -use_deprecated_feature = partial( - Option, - "--use-deprecated", - dest="deprecated_features_enabled", - metavar="feature", - action="append", - default=[], - choices=["legacy-resolver"], - help=("Enable deprecated functionality, that will be removed in the future."), -) # type: Callable[..., Option] - - -########## -# groups # -########## - -general_group = { - "name": "General Options", - "options": [ - help_, - isolated_mode, - require_virtualenv, - verbose, - version, - quiet, - log, - no_input, - proxy, - retries, - timeout, - exists_action, - trusted_host, - cert, - client_cert, - cache_dir, - no_cache, - disable_pip_version_check, - no_color, - no_python_version_warning, - use_new_feature, - use_deprecated_feature, - ], -} # type: Dict[str, Any] - -index_group = { - "name": "Package Index Options", - "options": [ - index_url, - extra_index_url, - no_index, - find_links, - ], -} # type: Dict[str, Any] diff --git a/venv/Lib/site-packages/pip/_internal/cli/command_context.py b/venv/Lib/site-packages/pip/_internal/cli/command_context.py deleted file mode 100644 index 375a2e3..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/command_context.py +++ /dev/null @@ -1,30 +0,0 @@ -from contextlib import ExitStack, contextmanager -from typing import ContextManager, Iterator, TypeVar - -_T = TypeVar("_T", covariant=True) - - -class CommandContextMixIn: - def __init__(self): - # type: () -> None - super().__init__() - self._in_main_context = False - self._main_context = ExitStack() - - @contextmanager - def main_context(self): - # type: () -> Iterator[None] - assert not self._in_main_context - - self._in_main_context = True - try: - with self._main_context: - yield - finally: - self._in_main_context = False - - def enter_context(self, context_provider): - # type: (ContextManager[_T]) -> _T - assert self._in_main_context - - return self._main_context.enter_context(context_provider) diff --git a/venv/Lib/site-packages/pip/_internal/cli/main.py b/venv/Lib/site-packages/pip/_internal/cli/main.py deleted file mode 100644 index 7ae074b..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/main.py +++ /dev/null @@ -1,71 +0,0 @@ -"""Primary application entrypoint. -""" -import locale -import logging -import os -import sys -from typing import List, Optional - -from pip._internal.cli.autocompletion import autocomplete -from pip._internal.cli.main_parser import parse_command -from pip._internal.commands import create_command -from pip._internal.exceptions import PipError -from pip._internal.utils import deprecation - -logger = logging.getLogger(__name__) - - -# Do not import and use main() directly! Using it directly is actively -# discouraged by pip's maintainers. The name, location and behavior of -# this function is subject to change, so calling it directly is not -# portable across different pip versions. - -# In addition, running pip in-process is unsupported and unsafe. This is -# elaborated in detail at -# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program. -# That document also provides suggestions that should work for nearly -# all users that are considering importing and using main() directly. - -# However, we know that certain users will still want to invoke pip -# in-process. If you understand and accept the implications of using pip -# in an unsupported manner, the best approach is to use runpy to avoid -# depending on the exact location of this entry point. - -# The following example shows how to use runpy to invoke pip in that -# case: -# -# sys.argv = ["pip", your, args, here] -# runpy.run_module("pip", run_name="__main__") -# -# Note that this will exit the process after running, unlike a direct -# call to main. As it is not safe to do any processing after calling -# main, this should not be an issue in practice. - - -def main(args=None): - # type: (Optional[List[str]]) -> int - if args is None: - args = sys.argv[1:] - - # Configure our deprecation warnings to be sent through loggers - deprecation.install_warning_logger() - - autocomplete() - - try: - cmd_name, cmd_args = parse_command(args) - except PipError as exc: - sys.stderr.write(f"ERROR: {exc}") - sys.stderr.write(os.linesep) - sys.exit(1) - - # Needed for locale.getpreferredencoding(False) to work - # in pip._internal.utils.encoding.auto_decode - try: - locale.setlocale(locale.LC_ALL, "") - except locale.Error as e: - # setlocale can apparently crash if locale are uninitialized - logger.debug("Ignoring error %s when setting locale", e) - command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) - - return command.main(cmd_args) diff --git a/venv/Lib/site-packages/pip/_internal/cli/main_parser.py b/venv/Lib/site-packages/pip/_internal/cli/main_parser.py deleted file mode 100644 index d0f58fe..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/main_parser.py +++ /dev/null @@ -1,89 +0,0 @@ -"""A single place for constructing and exposing the main parser -""" - -import os -import sys -from typing import List, Tuple - -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter -from pip._internal.commands import commands_dict, get_similar_commands -from pip._internal.exceptions import CommandError -from pip._internal.utils.misc import get_pip_version, get_prog - -__all__ = ["create_main_parser", "parse_command"] - - -def create_main_parser(): - # type: () -> ConfigOptionParser - """Creates and returns the main parser for pip's CLI""" - - parser = ConfigOptionParser( - usage="\n%prog [options]", - add_help_option=False, - formatter=UpdatingDefaultsHelpFormatter(), - name="global", - prog=get_prog(), - ) - parser.disable_interspersed_args() - - parser.version = get_pip_version() - - # add the general options - gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) - parser.add_option_group(gen_opts) - - # so the help formatter knows - parser.main = True # type: ignore - - # create command listing for description - description = [""] + [ - f"{name:27} {command_info.summary}" - for name, command_info in commands_dict.items() - ] - parser.description = "\n".join(description) - - return parser - - -def parse_command(args): - # type: (List[str]) -> Tuple[str, List[str]] - parser = create_main_parser() - - # Note: parser calls disable_interspersed_args(), so the result of this - # call is to split the initial args into the general options before the - # subcommand and everything else. - # For example: - # args: ['--timeout=5', 'install', '--user', 'INITools'] - # general_options: ['--timeout==5'] - # args_else: ['install', '--user', 'INITools'] - general_options, args_else = parser.parse_args(args) - - # --version - if general_options.version: - sys.stdout.write(parser.version) - sys.stdout.write(os.linesep) - sys.exit() - - # pip || pip help -> print_help() - if not args_else or (args_else[0] == "help" and len(args_else) == 1): - parser.print_help() - sys.exit() - - # the subcommand name - cmd_name = args_else[0] - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = [f'unknown command "{cmd_name}"'] - if guess: - msg.append(f'maybe you meant "{guess}"') - - raise CommandError(" - ".join(msg)) - - # all the args without the subcommand - cmd_args = args[:] - cmd_args.remove(cmd_name) - - return cmd_name, cmd_args diff --git a/venv/Lib/site-packages/pip/_internal/cli/parser.py b/venv/Lib/site-packages/pip/_internal/cli/parser.py deleted file mode 100644 index 16523c5..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/parser.py +++ /dev/null @@ -1,305 +0,0 @@ -"""Base option parser setup""" - -import logging -import optparse -import shutil -import sys -import textwrap -from contextlib import suppress -from typing import Any, Dict, Iterator, List, Tuple - -from pip._internal.cli.status_codes import UNKNOWN_ERROR -from pip._internal.configuration import Configuration, ConfigurationError -from pip._internal.utils.misc import redact_auth_from_url, strtobool - -logger = logging.getLogger(__name__) - - -class PrettyHelpFormatter(optparse.IndentedHelpFormatter): - """A prettier/less verbose help formatter for optparse.""" - - def __init__(self, *args, **kwargs): - # type: (*Any, **Any) -> None - # help position must be aligned with __init__.parseopts.description - kwargs["max_help_position"] = 30 - kwargs["indent_increment"] = 1 - kwargs["width"] = shutil.get_terminal_size()[0] - 2 - super().__init__(*args, **kwargs) - - def format_option_strings(self, option): - # type: (optparse.Option) -> str - return self._format_option_strings(option) - - def _format_option_strings(self, option, mvarfmt=" <{}>", optsep=", "): - # type: (optparse.Option, str, str) -> str - """ - Return a comma-separated list of option strings and metavars. - - :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') - :param mvarfmt: metavar format string - :param optsep: separator - """ - opts = [] - - if option._short_opts: - opts.append(option._short_opts[0]) - if option._long_opts: - opts.append(option._long_opts[0]) - if len(opts) > 1: - opts.insert(1, optsep) - - if option.takes_value(): - assert option.dest is not None - metavar = option.metavar or option.dest.lower() - opts.append(mvarfmt.format(metavar.lower())) - - return "".join(opts) - - def format_heading(self, heading): - # type: (str) -> str - if heading == "Options": - return "" - return heading + ":\n" - - def format_usage(self, usage): - # type: (str) -> str - """ - Ensure there is only one newline between usage and the first heading - if there is no description. - """ - msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " ")) - return msg - - def format_description(self, description): - # type: (str) -> str - # leave full control over description to us - if description: - if hasattr(self.parser, "main"): - label = "Commands" - else: - label = "Description" - # some doc strings have initial newlines, some don't - description = description.lstrip("\n") - # some doc strings have final newlines and spaces, some don't - description = description.rstrip() - # dedent, then reindent - description = self.indent_lines(textwrap.dedent(description), " ") - description = f"{label}:\n{description}\n" - return description - else: - return "" - - def format_epilog(self, epilog): - # type: (str) -> str - # leave full control over epilog to us - if epilog: - return epilog - else: - return "" - - def indent_lines(self, text, indent): - # type: (str, str) -> str - new_lines = [indent + line for line in text.split("\n")] - return "\n".join(new_lines) - - -class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): - """Custom help formatter for use in ConfigOptionParser. - - This is updates the defaults before expanding them, allowing - them to show up correctly in the help listing. - - Also redact auth from url type options - """ - - def expand_default(self, option): - # type: (optparse.Option) -> str - default_values = None - if self.parser is not None: - assert isinstance(self.parser, ConfigOptionParser) - self.parser._update_defaults(self.parser.defaults) - assert option.dest is not None - default_values = self.parser.defaults.get(option.dest) - help_text = super().expand_default(option) - - if default_values and option.metavar == "URL": - if isinstance(default_values, str): - default_values = [default_values] - - # If its not a list, we should abort and just return the help text - if not isinstance(default_values, list): - default_values = [] - - for val in default_values: - help_text = help_text.replace(val, redact_auth_from_url(val)) - - return help_text - - -class CustomOptionParser(optparse.OptionParser): - def insert_option_group(self, idx, *args, **kwargs): - # type: (int, Any, Any) -> optparse.OptionGroup - """Insert an OptionGroup at a given position.""" - group = self.add_option_group(*args, **kwargs) - - self.option_groups.pop() - self.option_groups.insert(idx, group) - - return group - - @property - def option_list_all(self): - # type: () -> List[optparse.Option] - """Get a list of all options, including those in option groups.""" - res = self.option_list[:] - for i in self.option_groups: - res.extend(i.option_list) - - return res - - -class ConfigOptionParser(CustomOptionParser): - """Custom option parser which updates its defaults by checking the - configuration files and environmental variables""" - - def __init__( - self, - *args, # type: Any - name, # type: str - isolated=False, # type: bool - **kwargs, # type: Any - ): - # type: (...) -> None - self.name = name - self.config = Configuration(isolated) - - assert self.name - super().__init__(*args, **kwargs) - - def check_default(self, option, key, val): - # type: (optparse.Option, str, Any) -> Any - try: - return option.check_value(key, val) - except optparse.OptionValueError as exc: - print(f"An error occurred during configuration: {exc}") - sys.exit(3) - - def _get_ordered_configuration_items(self): - # type: () -> Iterator[Tuple[str, Any]] - # Configuration gives keys in an unordered manner. Order them. - override_order = ["global", self.name, ":env:"] - - # Pool the options into different groups - section_items = { - name: [] for name in override_order - } # type: Dict[str, List[Tuple[str, Any]]] - for section_key, val in self.config.items(): - # ignore empty values - if not val: - logger.debug( - "Ignoring configuration key '%s' as it's value is empty.", - section_key, - ) - continue - - section, key = section_key.split(".", 1) - if section in override_order: - section_items[section].append((key, val)) - - # Yield each group in their override order - for section in override_order: - for key, val in section_items[section]: - yield key, val - - def _update_defaults(self, defaults): - # type: (Dict[str, Any]) -> Dict[str, Any] - """Updates the given defaults with values from the config files and - the environ. Does a little special handling for certain types of - options (lists).""" - - # Accumulate complex default state. - self.values = optparse.Values(self.defaults) - late_eval = set() - # Then set the options with those values - for key, val in self._get_ordered_configuration_items(): - # '--' because configuration supports only long names - option = self.get_option("--" + key) - - # Ignore options not present in this parser. E.g. non-globals put - # in [global] by users that want them to apply to all applicable - # commands. - if option is None: - continue - - assert option.dest is not None - - if option.action in ("store_true", "store_false"): - try: - val = strtobool(val) - except ValueError: - self.error( - "{} is not a valid value for {} option, " # noqa - "please specify a boolean value like yes/no, " - "true/false or 1/0 instead.".format(val, key) - ) - elif option.action == "count": - with suppress(ValueError): - val = strtobool(val) - with suppress(ValueError): - val = int(val) - if not isinstance(val, int) or val < 0: - self.error( - "{} is not a valid value for {} option, " # noqa - "please instead specify either a non-negative integer " - "or a boolean value like yes/no or false/true " - "which is equivalent to 1/0.".format(val, key) - ) - elif option.action == "append": - val = val.split() - val = [self.check_default(option, key, v) for v in val] - elif option.action == "callback": - assert option.callback is not None - late_eval.add(option.dest) - opt_str = option.get_opt_string() - val = option.convert_value(opt_str, val) - # From take_action - args = option.callback_args or () - kwargs = option.callback_kwargs or {} - option.callback(option, opt_str, val, self, *args, **kwargs) - else: - val = self.check_default(option, key, val) - - defaults[option.dest] = val - - for key in late_eval: - defaults[key] = getattr(self.values, key) - self.values = None - return defaults - - def get_default_values(self): - # type: () -> optparse.Values - """Overriding to make updating the defaults after instantiation of - the option parser possible, _update_defaults() does the dirty work.""" - if not self.process_default_values: - # Old, pre-Optik 1.5 behaviour. - return optparse.Values(self.defaults) - - # Load the configuration, or error out in case of an error - try: - self.config.load() - except ConfigurationError as err: - self.exit(UNKNOWN_ERROR, str(err)) - - defaults = self._update_defaults(self.defaults.copy()) # ours - for option in self._get_all_options(): - assert option.dest is not None - default = defaults.get(option.dest) - if isinstance(default, str): - opt_str = option.get_opt_string() - defaults[option.dest] = option.check_value(opt_str, default) - return optparse.Values(defaults) - - def error(self, msg): - # type: (str) -> None - self.print_usage(sys.stderr) - self.exit(UNKNOWN_ERROR, f"{msg}\n") diff --git a/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py b/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py deleted file mode 100644 index 3064c85..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +++ /dev/null @@ -1,261 +0,0 @@ -import itertools -import sys -from signal import SIGINT, default_int_handler, signal -from typing import Any, Dict, List - -from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar -from pip._vendor.progress.spinner import Spinner - -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 - - -def _select_progress_class(preferred, fallback): - # type: (Bar, 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 = _select_progress_class(IncrementalBar, Bar) # type: Any - - -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, **kwargs): - # type: (List[Any], Dict[Any, 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): - # type: () -> 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): - # type: () -> None - pass - - -class BlueEmojiBar(IncrementalBar): - - suffix = "%(percent)d%%" - bar_prefix = " " - bar_suffix = " " - phases = ("\U0001F539", "\U0001F537", "\U0001F535") - - -class DownloadProgressMixin: - def __init__(self, *args, **kwargs): - # type: (List[Any], Dict[Any, Any]) -> None - # https://github.com/python/mypy/issues/5887 - super().__init__(*args, **kwargs) # type: ignore - self.message = (" " * (get_indentation() + 2)) + self.message # type: str - - @property - def downloaded(self): - # type: () -> str - return format_size(self.index) # type: ignore - - @property - def download_speed(self): - # type: () -> 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): - # type: () -> 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, **kwargs): - # type: (List[Any], Dict[Any, 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): - # type: () -> str - if not hasattr(self, "_phaser"): - self._phaser = itertools.cycle(self.phases) - return next(self._phaser) - - def update(self): - # type: () -> 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 DownloadProgressProvider(progress_bar, max=None): # type: ignore - if max is None or max == 0: - return BAR_TYPES[progress_bar][1]().iter - else: - return BAR_TYPES[progress_bar][0](max=max).iter diff --git a/venv/Lib/site-packages/pip/_internal/cli/req_command.py b/venv/Lib/site-packages/pip/_internal/cli/req_command.py deleted file mode 100644 index 3fc00d4..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/req_command.py +++ /dev/null @@ -1,461 +0,0 @@ -"""Contains the Command base classes that depend on PipSession. - -The classes in this module are in a separate module so the commands not -needing download / PackageFinder capability don't unnecessarily import the -PackageFinder machinery and all its vendored dependencies, etc. -""" - -import logging -import os -import sys -from functools import partial -from optparse import Values -from typing import Any, List, Optional, Tuple - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.command_context import CommandContextMixIn -from pip._internal.exceptions import CommandError, PreviousBuildDirError -from pip._internal.index.collector import LinkCollector -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.prepare import RequirementPreparer -from pip._internal.req.constructors import ( - install_req_from_editable, - install_req_from_line, - install_req_from_parsed_requirement, - install_req_from_req_string, -) -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.temp_dir import ( - TempDirectory, - TempDirectoryTypeRegistry, - tempdir_kinds, -) -from pip._internal.utils.virtualenv import running_under_virtualenv - -logger = logging.getLogger(__name__) - - -class SessionCommandMixin(CommandContextMixIn): - - """ - A class mixin for command classes needing _build_session(). - """ - - def __init__(self): - # type: () -> None - super().__init__() - self._session = None # Optional[PipSession] - - @classmethod - def _get_index_urls(cls, options): - # type: (Values) -> Optional[List[str]] - """Return a list of index urls from user-provided options.""" - index_urls = [] - if not getattr(options, "no_index", False): - url = getattr(options, "index_url", None) - if url: - index_urls.append(url) - urls = getattr(options, "extra_index_urls", None) - if urls: - index_urls.extend(urls) - # Return None rather than an empty list - return index_urls or None - - def get_default_session(self, options): - # type: (Values) -> PipSession - """Get a default-managed session.""" - if self._session is None: - self._session = self.enter_context(self._build_session(options)) - # there's no type annotation on requests.Session, so it's - # automatically ContextManager[Any] and self._session becomes Any, - # then https://github.com/python/mypy/issues/7696 kicks in - assert self._session is not None - return self._session - - def _build_session(self, options, retries=None, timeout=None): - # type: (Values, Optional[int], Optional[int]) -> PipSession - assert not options.cache_dir or os.path.isabs(options.cache_dir) - session = PipSession( - cache=( - os.path.join(options.cache_dir, "http") if options.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), - ) - - # Handle custom ca-bundles from the user - if options.cert: - session.verify = options.cert - - # Handle SSL client certificate - if options.client_cert: - session.cert = options.client_cert - - # Handle timeouts - if options.timeout or timeout: - session.timeout = timeout if timeout is not None else options.timeout - - # Handle configured proxies - if options.proxy: - session.proxies = { - "http": options.proxy, - "https": options.proxy, - } - - # Determine if we can prompt the user for authentication or not - session.auth.prompting = not options.no_input - - return session - - -class IndexGroupCommand(Command, SessionCommandMixin): - - """ - Abstract base class for commands with the index_group options. - - This also corresponds to the commands that permit the pip version check. - """ - - def handle_pip_version_check(self, options): - # type: (Values) -> None - """ - Do the pip version check if not disabled. - - This overrides the default behavior of not doing the check. - """ - # Make sure the index_group options are present. - assert hasattr(options, "no_index") - - if options.disable_pip_version_check or options.no_index: - return - - # Otherwise, check if we're using the latest version of pip available. - session = self._build_session( - options, retries=0, timeout=min(5, options.timeout) - ) - with session: - pip_self_version_check(session, options) - - -KEEPABLE_TEMPDIR_TYPES = [ - tempdir_kinds.BUILD_ENV, - tempdir_kinds.EPHEM_WHEEL_CACHE, - tempdir_kinds.REQ_BUILD, -] - - -def warn_if_run_as_root(): - # type: () -> None - """Output a warning for sudo users on Unix. - - In a virtual environment, sudo pip still writes to virtualenv. - On Windows, users may run pip as Administrator without issues. - This warning only applies to Unix root users outside of virtualenv. - """ - if running_under_virtualenv(): - return - if not hasattr(os, "getuid"): - return - # On Windows, there are no "system managed" Python packages. Installing as - # Administrator via pip is the correct way of updating system environments. - # - # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform - # checks: https://mypy.readthedocs.io/en/stable/common_issues.html - if sys.platform == "win32" or sys.platform == "cygwin": - return - if sys.platform == "darwin" or sys.platform == "linux": - if os.getuid() != 0: - return - logger.warning( - "Running pip as root will break packages and permissions. " - "You should install packages reliably by using venv: " - "https://pip.pypa.io/warnings/venv" - ) - - -def with_cleanup(func): - # type: (Any) -> Any - """Decorator for common logic related to managing temporary - directories. - """ - - def configure_tempdir_registry(registry): - # type: (TempDirectoryTypeRegistry) -> None - for t in KEEPABLE_TEMPDIR_TYPES: - registry.set_delete(t, False) - - def wrapper(self, options, args): - # type: (RequirementCommand, Values, List[Any]) -> Optional[int] - assert self.tempdir_registry is not None - if options.no_clean: - configure_tempdir_registry(self.tempdir_registry) - - try: - return func(self, options, args) - except PreviousBuildDirError: - # This kind of conflict can occur when the user passes an explicit - # build directory with a pre-existing folder. In that case we do - # not want to accidentally remove it. - configure_tempdir_registry(self.tempdir_registry) - raise - - return wrapper - - -class RequirementCommand(IndexGroupCommand): - def __init__(self, *args, **kw): - # type: (Any, Any) -> None - super().__init__(*args, **kw) - - self.cmd_opts.add_option(cmdoptions.no_clean()) - - @staticmethod - def determine_resolver_variant(options): - # type: (Values) -> str - """Determines which resolver should be used, based on the given options.""" - if "legacy-resolver" in options.deprecated_features_enabled: - return "legacy" - - return "2020-resolver" - - @classmethod - def make_requirement_preparer( - cls, - temp_build_dir, # type: TempDirectory - options, # type: Values - req_tracker, # type: RequirementTracker - session, # type: PipSession - finder, # type: PackageFinder - use_user_site, # type: bool - download_dir=None, # type: str - ): - # type: (...) -> RequirementPreparer - """ - Create a RequirementPreparer instance for the given parameters. - """ - temp_build_dir_path = temp_build_dir.path - assert temp_build_dir_path is not None - - resolver_variant = cls.determine_resolver_variant(options) - if resolver_variant == "2020-resolver": - lazy_wheel = "fast-deps" in options.features_enabled - if lazy_wheel: - logger.warning( - "pip is using lazily downloaded wheels using HTTP " - "range requests to obtain dependency information. " - "This experimental feature is enabled through " - "--use-feature=fast-deps and it is not ready for " - "production." - ) - else: - lazy_wheel = False - if "fast-deps" in options.features_enabled: - logger.warning( - "fast-deps has no effect when used with the legacy resolver." - ) - - 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, - session=session, - progress_bar=options.progress_bar, - finder=finder, - require_hashes=options.require_hashes, - use_user_site=use_user_site, - lazy_wheel=lazy_wheel, - in_tree_build="in-tree-build" in options.features_enabled, - ) - - @classmethod - def make_resolver( - cls, - preparer, # type: RequirementPreparer - finder, # type: PackageFinder - options, # type: Values - wheel_cache=None, # type: Optional[WheelCache] - use_user_site=False, # type: bool - ignore_installed=True, # type: bool - ignore_requires_python=False, # type: bool - force_reinstall=False, # type: bool - upgrade_strategy="to-satisfy-only", # type: str - use_pep517=None, # type: Optional[bool] - py_version_info=None, # type: Optional[Tuple[int, ...]] - ): - # type: (...) -> BaseResolver - """ - Create a Resolver instance for the given parameters. - """ - make_install_req = partial( - install_req_from_req_string, - isolated=options.isolated_mode, - use_pep517=use_pep517, - ) - 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 - # "Resolver" class being redefined. - if resolver_variant == "2020-resolver": - import pip._internal.resolution.resolvelib.resolver - - return pip._internal.resolution.resolvelib.resolver.Resolver( - preparer=preparer, - finder=finder, - wheel_cache=wheel_cache, - make_install_req=make_install_req, - use_user_site=use_user_site, - ignore_dependencies=options.ignore_dependencies, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - force_reinstall=force_reinstall, - upgrade_strategy=upgrade_strategy, - py_version_info=py_version_info, - ) - import pip._internal.resolution.legacy.resolver - - return pip._internal.resolution.legacy.resolver.Resolver( - preparer=preparer, - finder=finder, - wheel_cache=wheel_cache, - make_install_req=make_install_req, - use_user_site=use_user_site, - ignore_dependencies=options.ignore_dependencies, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - force_reinstall=force_reinstall, - upgrade_strategy=upgrade_strategy, - py_version_info=py_version_info, - ) - - def get_requirements( - self, - args, # type: List[str] - options, # type: Values - finder, # type: PackageFinder - session, # type: PipSession - ): - # type: (...) -> List[InstallRequirement] - """ - Parse command-line arguments into the corresponding requirements. - """ - requirements = [] # type: List[InstallRequirement] - for filename in options.constraints: - for parsed_req in parse_requirements( - filename, - constraint=True, - finder=finder, - options=options, - session=session, - ): - req_to_add = install_req_from_parsed_requirement( - parsed_req, - isolated=options.isolated_mode, - user_supplied=False, - ) - requirements.append(req_to_add) - - for req in args: - req_to_add = install_req_from_line( - req, - None, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - user_supplied=True, - ) - requirements.append(req_to_add) - - for req in options.editables: - req_to_add = install_req_from_editable( - req, - user_supplied=True, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - ) - requirements.append(req_to_add) - - # NOTE: options.require_hashes may be set if --require-hashes is True - for filename in options.requirements: - for parsed_req in parse_requirements( - filename, finder=finder, options=options, session=session - ): - req_to_add = install_req_from_parsed_requirement( - parsed_req, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - user_supplied=True, - ) - requirements.append(req_to_add) - - # If any requirement has hash options, enable hash checking. - if any(req.has_hash_options for req in requirements): - options.require_hashes = True - - if not (args or options.editables or options.requirements): - opts = {"name": self.name} - if options.find_links: - raise CommandError( - "You must give at least one requirement to {name} " - '(maybe you meant "pip {name} {links}"?)'.format( - **dict(opts, links=" ".join(options.find_links)) - ) - ) - else: - raise CommandError( - "You must give at least one requirement to {name} " - '(see "pip help {name}")'.format(**opts) - ) - - return requirements - - @staticmethod - def trace_basic_info(finder): - # type: (PackageFinder) -> None - """ - Trace basic information about the provided objects. - """ - # Display where finder is looking for packages - search_scope = finder.search_scope - locations = search_scope.get_formatted_locations() - if locations: - logger.info(locations) - - def _build_package_finder( - self, - options, # type: Values - session, # type: PipSession - target_python=None, # type: Optional[TargetPython] - ignore_requires_python=None, # type: Optional[bool] - ): - # type: (...) -> PackageFinder - """ - Create a package finder appropriate to this requirement command. - - :param ignore_requires_python: Whether to ignore incompatible - "Requires-Python" values in links. Defaults to False. - """ - link_collector = LinkCollector.create(session, options=options) - selection_prefs = SelectionPreferences( - allow_yanked=True, - format_control=options.format_control, - allow_all_prereleases=options.pre, - prefer_binary=options.prefer_binary, - ignore_requires_python=ignore_requires_python, - ) - - return PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - target_python=target_python, - ) diff --git a/venv/Lib/site-packages/pip/_internal/cli/spinners.py b/venv/Lib/site-packages/pip/_internal/cli/spinners.py deleted file mode 100644 index 08e1566..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/spinners.py +++ /dev/null @@ -1,172 +0,0 @@ -import contextlib -import itertools -import logging -import sys -import time -from typing import IO, Iterator - -from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import get_indentation - -logger = logging.getLogger(__name__) - - -class SpinnerInterface: - def spin(self): - # type: () -> None - raise NotImplementedError() - - def finish(self, final_status): - # type: (str) -> None - raise NotImplementedError() - - -class InteractiveSpinner(SpinnerInterface): - def __init__( - self, - message, - file=None, - spin_chars="-\\|/", - # Empirically, 8 updates/second looks nice - min_update_interval_seconds=0.125, - ): - # type: (str, IO[str], str, float) -> None - self._message = message - if file is None: - file = sys.stdout - self._file = file - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._finished = False - - self._spin_cycle = itertools.cycle(spin_chars) - - self._file.write(" " * get_indentation() + self._message + " ... ") - self._width = 0 - - def _write(self, status): - # type: (str) -> None - assert not self._finished - # Erase what we wrote before by backspacing to the beginning, writing - # spaces to overwrite the old text, and then backspacing again - backup = "\b" * self._width - self._file.write(backup + " " * self._width + backup) - # Now we have a blank slate to add our status - self._file.write(status) - self._width = len(status) - self._file.flush() - self._rate_limiter.reset() - - def spin(self): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._write(next(self._spin_cycle)) - - def finish(self, final_status): - # type: (str) -> None - if self._finished: - return - self._write(final_status) - self._file.write("\n") - self._file.flush() - self._finished = True - - -# Used for dumb terminals, non-interactive installs (no tty), etc. -# We still print updates occasionally (once every 60 seconds by default) to -# act as a keep-alive for systems like Travis-CI that take lack-of-output as -# an indication that a task has frozen. -class NonInteractiveSpinner(SpinnerInterface): - def __init__(self, message, min_update_interval_seconds=60): - # type: (str, float) -> None - self._message = message - self._finished = False - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._update("started") - - def _update(self, status): - # type: (str) -> None - assert not self._finished - self._rate_limiter.reset() - logger.info("%s: %s", self._message, status) - - def spin(self): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._update("still running...") - - def finish(self, final_status): - # type: (str) -> None - if self._finished: - return - self._update(f"finished with status '{final_status}'") - self._finished = True - - -class RateLimiter: - def __init__(self, min_update_interval_seconds): - # type: (float) -> None - self._min_update_interval_seconds = min_update_interval_seconds - self._last_update = 0 # type: float - - def ready(self): - # type: () -> bool - now = time.time() - delta = now - self._last_update - return delta >= self._min_update_interval_seconds - - def reset(self): - # type: () -> None - self._last_update = time.time() - - -@contextlib.contextmanager -def open_spinner(message): - # type: (str) -> Iterator[SpinnerInterface] - # 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. - # Non-interactive spinner goes through the logging system, so it is always - # in sync with logging configuration. - if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: - spinner = InteractiveSpinner(message) # type: SpinnerInterface - else: - spinner = NonInteractiveSpinner(message) - try: - with hidden_cursor(sys.stdout): - yield spinner - except KeyboardInterrupt: - spinner.finish("canceled") - raise - except Exception: - spinner.finish("error") - raise - else: - spinner.finish("done") - - -@contextlib.contextmanager -def hidden_cursor(file): - # type: (IO[str]) -> Iterator[None] - # The Windows terminal does not support the hide/show cursor ANSI codes, - # even via colorama. So don't even try. - if WINDOWS: - yield - # We don't want to clutter the output with control characters if we're - # writing to a file, or if the user is running with --quiet. - # See https://github.com/pypa/pip/issues/3418 - elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: - yield - else: - file.write(HIDE_CURSOR) - try: - yield - finally: - file.write(SHOW_CURSOR) diff --git a/venv/Lib/site-packages/pip/_internal/cli/status_codes.py b/venv/Lib/site-packages/pip/_internal/cli/status_codes.py deleted file mode 100644 index 5e29502..0000000 --- a/venv/Lib/site-packages/pip/_internal/cli/status_codes.py +++ /dev/null @@ -1,6 +0,0 @@ -SUCCESS = 0 -ERROR = 1 -UNKNOWN_ERROR = 2 -VIRTUALENV_NOT_FOUND = 3 -PREVIOUS_BUILD_DIR_ERROR = 4 -NO_MATCHES_FOUND = 23 diff --git a/venv/Lib/site-packages/pip/_internal/commands/__init__.py b/venv/Lib/site-packages/pip/_internal/commands/__init__.py deleted file mode 100644 index 31c985f..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/__init__.py +++ /dev/null @@ -1,110 +0,0 @@ -""" -Package containing all pip commands -""" - -import importlib -from collections import OrderedDict, namedtuple -from typing import Any, Optional - -from pip._internal.cli.base_command import Command - -CommandInfo = namedtuple('CommandInfo', 'module_path, class_name, summary') - -# The ordering matters for help display. -# Also, even though the module path starts with the same -# "pip._internal.commands" prefix in each case, we include the full path -# because it makes testing easier (specifically when modifying commands_dict -# in test setup / teardown by adding info for a FakeCommand class defined -# in a test-related module). -# Finally, we need to pass an iterable of pairs here rather than a dict -# so that the ordering won't be lost when using Python 2.7. -commands_dict = OrderedDict([ - ('install', CommandInfo( - 'pip._internal.commands.install', 'InstallCommand', - 'Install packages.', - )), - ('download', CommandInfo( - 'pip._internal.commands.download', 'DownloadCommand', - 'Download packages.', - )), - ('uninstall', CommandInfo( - 'pip._internal.commands.uninstall', 'UninstallCommand', - 'Uninstall packages.', - )), - ('freeze', CommandInfo( - 'pip._internal.commands.freeze', 'FreezeCommand', - 'Output installed packages in requirements format.', - )), - ('list', CommandInfo( - 'pip._internal.commands.list', 'ListCommand', - 'List installed packages.', - )), - ('show', CommandInfo( - 'pip._internal.commands.show', 'ShowCommand', - 'Show information about installed packages.', - )), - ('check', CommandInfo( - 'pip._internal.commands.check', 'CheckCommand', - 'Verify installed packages have compatible dependencies.', - )), - ('config', CommandInfo( - 'pip._internal.commands.configuration', 'ConfigurationCommand', - 'Manage local and global configuration.', - )), - ('search', CommandInfo( - 'pip._internal.commands.search', 'SearchCommand', - 'Search PyPI for packages.', - )), - ('cache', CommandInfo( - 'pip._internal.commands.cache', 'CacheCommand', - "Inspect and manage pip's wheel cache.", - )), - ('wheel', CommandInfo( - 'pip._internal.commands.wheel', 'WheelCommand', - 'Build wheels from your requirements.', - )), - ('hash', CommandInfo( - 'pip._internal.commands.hash', 'HashCommand', - 'Compute hashes of package archives.', - )), - ('completion', CommandInfo( - 'pip._internal.commands.completion', 'CompletionCommand', - 'A helper command used for command completion.', - )), - ('debug', CommandInfo( - 'pip._internal.commands.debug', 'DebugCommand', - 'Show information useful for debugging.', - )), - ('help', CommandInfo( - 'pip._internal.commands.help', 'HelpCommand', - 'Show help for commands.', - )), -]) # type: OrderedDict[str, CommandInfo] - - -def create_command(name, **kwargs): - # type: (str, **Any) -> Command - """ - Create an instance of the Command class with the given name. - """ - module_path, class_name, summary = commands_dict[name] - module = importlib.import_module(module_path) - command_class = getattr(module, class_name) - command = command_class(name=name, summary=summary, **kwargs) - - return command - - -def get_similar_commands(name): - # type: (str) -> Optional[str] - """Command name auto-correct.""" - from difflib import get_close_matches - - name = name.lower() - - close_commands = get_close_matches(name, commands_dict.keys()) - - if close_commands: - return close_commands[0] - else: - return None diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index ff55f23810d344587c947b21cacdad4ffd9cd19b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2864 zcmcguOK%iM5T4gQyf17p5A$;KFk}hdKpv0~k^nXYL;^?_iPTzYG@k0+9eG~q?zOe6 z-IH_5A-^C8kaEc{$$yw@PWcNtM5*rCF(zTJnbGvj*H!&hbyaouc+F(VSqsmFu@8{{Z3el%CsC+Xhq{vSdA9wf@v@Z z%23(2XpPxWWi?oU8r1jgo&^m=O=!UpjTR9t!BIG-(K4drZ~{(hbPCZ5oQ5+RokesG z&cmuk1knY!2$wXvjA#w6z*UXjL)3tL>I>A z(T9#3#FBAj>=fQ~W^&qkk}J;W$4fIz(tJvyL#vSN#bM&Xcy$h0p+Jvp&QuG!qeaIX zzHDKL0m{8o5qg(*2O4zoWuaV99y{oH!%53M&e)iZ&&?ss#kBcIs})o?pATg^lw{@( zg9AqFBAop&3^D z%(-WS(UxEy_Xl&+oQr95ORE*^D>)=DMlYVIL>^>W17}Ly7ttX+EYiGudIpn z+MJf8JteQR2tlzXT%alrh=nwY&$dtG^k171jRgJ-pKe zw#&jK?WR2Gb1#Z8Io)(52TAPq1KI7PmH~GDw4L$kjag-@BoJ>XlXXAg95;s!SH*(| z_!34LW0VNy;`xC)gLu|1(Fz2;9!{8FM6Ik8CVPzY6YAU9VI$GDbxO39w(`-%^mTmm zhNuC{%76%>AoO?<2CN9Ijl;96Kt~T-Mo&z jRACZ7VdFSebJ1M18dj}lnGW98-;VP?zke^^t2X}u98ij1 diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc deleted file mode 100644 index eb247e785b989fa01a0859741ddcf7483355980b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16695 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 can be a glob expression or a package name. - """ - - ignore_require_venv = True - usage = """ - %prog dir - %prog info - %prog list [] [--format=[human, abspath]] - %prog remove - %prog purge - """ - - def add_options(self): - # type: () -> None - - self.cmd_opts.add_option( - '--format', - action='store', - dest='list_format', - default="human", - choices=('human', 'abspath'), - help="Select the output format among: human (default) or abspath" - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - # type: (Values, List[Any]) -> int - handlers = { - "dir": self.get_cache_dir, - "info": self.get_cache_info, - "list": self.list_cache_items, - "remove": self.remove_cache_items, - "purge": self.purge_cache, - } - - if not options.cache_dir: - logger.error("pip cache commands can not " - "function since cache is disabled.") - return ERROR - - # Determine action - if not args or args[0] not in handlers: - logger.error( - "Need an action (%s) to perform.", - ", ".join(sorted(handlers)), - ) - return ERROR - - action = args[0] - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def get_cache_dir(self, options, args): - # type: (Values, List[Any]) -> None - if args: - raise CommandError('Too many arguments') - - logger.info(options.cache_dir) - - def get_cache_info(self, options, args): - # type: (Values, List[Any]) -> None - if args: - raise CommandError('Too many arguments') - - num_http_files = len(self._find_http_files(options)) - num_packages = len(self._find_wheels(options, '*')) - - http_cache_location = self._cache_dir(options, 'http') - wheels_cache_location = self._cache_dir(options, 'wheels') - http_cache_size = filesystem.format_directory_size(http_cache_location) - wheels_cache_size = filesystem.format_directory_size( - wheels_cache_location - ) - - message = textwrap.dedent(""" - 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} - """).format( - http_cache_location=http_cache_location, - http_cache_size=http_cache_size, - num_http_files=num_http_files, - wheels_cache_location=wheels_cache_location, - package_count=num_packages, - wheels_cache_size=wheels_cache_size, - ).strip() - - logger.info(message) - - def list_cache_items(self, options, args): - # type: (Values, List[Any]) -> None - if len(args) > 1: - raise CommandError('Too many arguments') - - if args: - pattern = args[0] - else: - pattern = '*' - - files = self._find_wheels(options, pattern) - if options.list_format == 'human': - self.format_for_human(files) - else: - self.format_for_abspath(files) - - def format_for_human(self, files): - # type: (List[str]) -> None - if not files: - logger.info('Nothing cached.') - return - - results = [] - for filename in files: - wheel = os.path.basename(filename) - size = filesystem.format_file_size(filename) - results.append(f' - {wheel} ({size})') - logger.info('Cache contents:\n') - logger.info('\n'.join(sorted(results))) - - def format_for_abspath(self, files): - # type: (List[str]) -> None - if not files: - return - - results = [] - for filename in files: - results.append(filename) - - logger.info('\n'.join(sorted(results))) - - def remove_cache_items(self, options, args): - # type: (Values, List[Any]) -> None - if len(args) > 1: - raise CommandError('Too many arguments') - - if not args: - raise CommandError('Please provide a pattern') - - files = self._find_wheels(options, args[0]) - - # Only fetch http files if no specific pattern given - if args[0] == '*': - files += self._find_http_files(options) - - if not files: - raise CommandError('No matching packages') - - for filename in files: - os.unlink(filename) - logger.debug('Removed %s', filename) - logger.info('Files removed: %s', len(files)) - - def purge_cache(self, options, args): - # type: (Values, List[Any]) -> None - if args: - raise CommandError('Too many arguments') - - return self.remove_cache_items(options, ['*']) - - def _cache_dir(self, options, subdir): - # type: (Values, str) -> str - return os.path.join(options.cache_dir, subdir) - - def _find_http_files(self, options): - # type: (Values) -> List[str] - http_dir = self._cache_dir(options, 'http') - return filesystem.find_files(http_dir, '*') - - def _find_wheels(self, options, pattern): - # type: (Values, str) -> List[str] - wheel_dir = self._cache_dir(options, 'wheels') - - # The wheel filename format, as specified in PEP 427, is: - # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl - # - # Additionally, non-alphanumeric values in the distribution are - # normalized to underscores (_), meaning hyphens can never occur - # before `-{version}`. - # - # Given that information: - # - If the pattern we're given contains a hyphen (-), the user is - # providing at least the version. Thus, we can just append `*.whl` - # to match the rest of it. - # - If the pattern we're given doesn't contain a hyphen (-), the - # user is only providing the name. Thus, we append `-*.whl` to - # match the hyphen before the version, followed by anything else. - # - # PEP 427: https://www.python.org/dev/peps/pep-0427/ - pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl") - - return filesystem.find_files(wheel_dir, pattern) diff --git a/venv/Lib/site-packages/pip/_internal/commands/check.py b/venv/Lib/site-packages/pip/_internal/commands/check.py deleted file mode 100644 index 70aa5af..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/check.py +++ /dev/null @@ -1,48 +0,0 @@ -import logging -from optparse import Values -from typing import Any, List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.operations.check import ( - check_package_set, - create_package_set_from_installed, -) -from pip._internal.utils.misc import write_output - -logger = logging.getLogger(__name__) - - -class CheckCommand(Command): - """Verify installed packages have compatible dependencies.""" - - usage = """ - %prog [options]""" - - def run(self, options, args): - # type: (Values, List[Any]) -> int - - package_set, parsing_probs = create_package_set_from_installed() - missing, conflicting = check_package_set(package_set) - - for project_name in missing: - version = package_set[project_name].version - for dependency in missing[project_name]: - write_output( - "%s %s requires %s, which is not installed.", - project_name, version, dependency[0], - ) - - for project_name in conflicting: - version = package_set[project_name].version - for dep_name, dep_version, req in conflicting[project_name]: - write_output( - "%s %s has requirement %s, but you have %s %s.", - project_name, version, req, dep_name, dep_version, - ) - - if missing or conflicting or parsing_probs: - return ERROR - else: - write_output("No broken requirements found.") - return SUCCESS diff --git a/venv/Lib/site-packages/pip/_internal/commands/completion.py b/venv/Lib/site-packages/pip/_internal/commands/completion.py deleted file mode 100644 index 92cb788..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/completion.py +++ /dev/null @@ -1,93 +0,0 @@ -import sys -import textwrap -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.utils.misc import get_prog - -BASE_COMPLETION = """ -# pip {shell} completion start{script}# pip {shell} completion end -""" - -COMPLETION_SCRIPTS = { - 'bash': """ - _pip_completion() - {{ - COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\ - COMP_CWORD=$COMP_CWORD \\ - PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) ) - }} - complete -o default -F _pip_completion {prog} - """, - 'zsh': """ - function _pip_completion {{ - local words cword - read -Ac words - read -cn cword - reply=( $( COMP_WORDS="$words[*]" \\ - COMP_CWORD=$(( cword-1 )) \\ - PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null )) - }} - compctl -K _pip_completion {prog} - """, - 'fish': """ - function __fish_complete_pip - set -lx COMP_WORDS (commandline -o) "" - set -lx COMP_CWORD ( \\ - math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ - ) - set -lx PIP_AUTO_COMPLETE 1 - string split \\ -- (eval $COMP_WORDS[1]) - end - complete -fa "(__fish_complete_pip)" -c {prog} - """, -} - - -class CompletionCommand(Command): - """A helper command to be used for command completion.""" - - ignore_require_venv = True - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option( - '--bash', '-b', - action='store_const', - const='bash', - dest='shell', - help='Emit completion code for bash') - self.cmd_opts.add_option( - '--zsh', '-z', - action='store_const', - const='zsh', - dest='shell', - help='Emit completion code for zsh') - self.cmd_opts.add_option( - '--fish', '-f', - action='store_const', - const='fish', - dest='shell', - help='Emit completion code for fish') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - # type: (Values, List[str]) -> int - """Prints the completion code of the given shell""" - shells = COMPLETION_SCRIPTS.keys() - shell_options = ['--' + shell for shell in sorted(shells)] - if options.shell in shells: - script = textwrap.dedent( - COMPLETION_SCRIPTS.get(options.shell, '').format( - prog=get_prog()) - ) - print(BASE_COMPLETION.format(script=script, shell=options.shell)) - return SUCCESS - else: - sys.stderr.write( - 'ERROR: You must pass {}\n' .format(' or '.join(shell_options)) - ) - return SUCCESS diff --git a/venv/Lib/site-packages/pip/_internal/commands/configuration.py b/venv/Lib/site-packages/pip/_internal/commands/configuration.py deleted file mode 100644 index e13f714..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/configuration.py +++ /dev/null @@ -1,280 +0,0 @@ -import logging -import os -import subprocess -from optparse import Values -from typing import Any, List, Optional - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.configuration import ( - Configuration, - Kind, - get_configuration_files, - kinds, -) -from pip._internal.exceptions import PipError -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import get_prog, write_output - -logger = logging.getLogger(__name__) - - -class ConfigurationCommand(Command): - """ - Manage local and global configuration. - - Subcommands: - - - 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 - - debug: List the configuration files and values defined under them - - 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 on the to the user file by - default. - """ - - ignore_require_venv = True - usage = """ - %prog [] list - %prog [] [--editor ] edit - - %prog [] get name - %prog [] set name value - %prog [] unset name - %prog [] debug - """ - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option( - '--editor', - dest='editor', - action='store', - default=None, - help=( - 'Editor to use to edit the file. Uses VISUAL or EDITOR ' - 'environment variables if not provided.' - ) - ) - - self.cmd_opts.add_option( - '--global', - dest='global_file', - action='store_true', - default=False, - help='Use the system-wide configuration file only' - ) - - self.cmd_opts.add_option( - '--user', - dest='user_file', - action='store_true', - default=False, - help='Use the user configuration file only' - ) - - self.cmd_opts.add_option( - '--site', - dest='site_file', - action='store_true', - default=False, - help='Use the current environment configuration file only' - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - # type: (Values, List[str]) -> int - handlers = { - "list": self.list_values, - "edit": self.open_in_editor, - "get": self.get_name, - "set": self.set_name_value, - "unset": self.unset_name, - "debug": self.list_config_values, - } - - # Determine action - if not args or args[0] not in handlers: - logger.error( - "Need an action (%s) to perform.", - ", ".join(sorted(handlers)), - ) - return ERROR - - action = args[0] - - # Determine which configuration files are to be loaded - # Depends on whether the command is modifying. - try: - load_only = self._determine_file( - options, need_value=(action in ["get", "set", "unset", "edit"]) - ) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - # Load a new configuration - self.configuration = Configuration( - isolated=options.isolated_mode, load_only=load_only - ) - self.configuration.load() - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def _determine_file(self, options, need_value): - # type: (Values, bool) -> Optional[Kind] - file_options = [key for key, value in ( - (kinds.USER, options.user_file), - (kinds.GLOBAL, options.global_file), - (kinds.SITE, options.site_file), - ) if value] - - if not file_options: - if not need_value: - return None - # Default to user, unless there's a site file. - elif any( - os.path.exists(site_config_file) - for site_config_file in get_configuration_files()[kinds.SITE] - ): - return kinds.SITE - else: - return kinds.USER - elif len(file_options) == 1: - return file_options[0] - - raise PipError( - "Need exactly one file to operate upon " - "(--user, --site, --global) to perform." - ) - - def list_values(self, options, args): - # type: (Values, List[str]) -> None - self._get_n_args(args, "list", n=0) - - for key, value in sorted(self.configuration.items()): - write_output("%s=%r", key, value) - - def get_name(self, options, args): - # type: (Values, List[str]) -> None - key = self._get_n_args(args, "get [name]", n=1) - value = self.configuration.get_value(key) - - write_output("%s", value) - - def set_name_value(self, options, args): - # type: (Values, List[str]) -> None - key, value = self._get_n_args(args, "set [name] [value]", n=2) - self.configuration.set_value(key, value) - - self._save_configuration() - - def unset_name(self, options, args): - # type: (Values, List[str]) -> None - key = self._get_n_args(args, "unset [name]", n=1) - self.configuration.unset_value(key) - - self._save_configuration() - - def list_config_values(self, options, args): - # type: (Values, List[str]) -> None - """List config key-value pairs across different config files""" - self._get_n_args(args, "debug", n=0) - - self.print_env_var_values() - # Iterate over config files and print if they exist, and the - # key-value pairs present in them if they do - for variant, files in sorted(self.configuration.iter_config_files()): - write_output("%s:", variant) - for fname in files: - with indent_log(): - file_exists = os.path.exists(fname) - write_output("%s, exists: %r", - fname, file_exists) - if file_exists: - self.print_config_file_values(variant) - - def print_config_file_values(self, variant): - # type: (Kind) -> None - """Get key-value pairs from the file of a variant""" - for name, value in self.configuration.\ - get_values_in_config(variant).items(): - with indent_log(): - write_output("%s: %s", name, value) - - def print_env_var_values(self): - # type: () -> None - """Get key-values pairs present as environment variables""" - write_output("%s:", 'env_var') - with indent_log(): - for key, value in sorted(self.configuration.get_environ_vars()): - env_var = f'PIP_{key.upper()}' - write_output("%s=%r", env_var, value) - - def open_in_editor(self, options, args): - # type: (Values, List[str]) -> None - editor = self._determine_editor(options) - - fname = self.configuration.get_file_to_edit() - if fname is None: - raise PipError("Could not determine appropriate file.") - - try: - subprocess.check_call([editor, fname]) - except subprocess.CalledProcessError as e: - raise PipError( - "Editor Subprocess exited with exit code {}" - .format(e.returncode) - ) - - def _get_n_args(self, args, example, n): - # type: (List[str], str, int) -> Any - """Helper to make sure the command got the right number of arguments - """ - if len(args) != n: - msg = ( - 'Got unexpected number of arguments, expected {}. ' - '(example: "{} config {}")' - ).format(n, get_prog(), example) - raise PipError(msg) - - if n == 1: - return args[0] - else: - return args - - def _save_configuration(self): - # type: () -> None - # We successfully ran a modifying command. Need to save the - # configuration. - try: - self.configuration.save() - except Exception: - logger.exception( - "Unable to save configuration. Please report this as a bug." - ) - raise PipError("Internal Error.") - - def _determine_editor(self, options): - # type: (Values) -> str - if options.editor is not None: - return options.editor - elif "VISUAL" in os.environ: - return os.environ["VISUAL"] - elif "EDITOR" in os.environ: - return os.environ["EDITOR"] - else: - raise PipError("Could not determine editor to use.") diff --git a/venv/Lib/site-packages/pip/_internal/commands/debug.py b/venv/Lib/site-packages/pip/_internal/commands/debug.py deleted file mode 100644 index ead5119..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/debug.py +++ /dev/null @@ -1,215 +0,0 @@ -import locale -import logging -import os -import sys -from optparse import Values -from types import ModuleType -from typing import Any, Dict, List, Optional - -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 -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.configuration import Configuration -from pip._internal.metadata import get_environment -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import get_pip_version - -logger = logging.getLogger(__name__) - - -def show_value(name, value): - # type: (str, Any) -> None - logger.info('%s: %s', name, value) - - -def show_sys_implementation(): - # type: () -> None - logger.info('sys.implementation:') - implementation_name = sys.implementation.name - with indent_log(): - show_value('name', implementation_name) - - -def create_vendor_txt_map(): - # type: () -> Dict[str, str] - vendor_txt_path = os.path.join( - os.path.dirname(pip_location), - '_vendor', - 'vendor.txt' - ) - - with open(vendor_txt_path) as f: - # Purge non version specifying lines. - # Also, remove any space prefix or suffixes (including comments). - lines = [line.strip().split(' ', 1)[0] - for line in f.readlines() if '==' in line] - - # Transform into "module" -> version dict. - return dict(line.split('==', 1) for line in lines) # type: ignore - - -def get_module_from_module_name(module_name): - # type: (str) -> ModuleType - # Module name can be uppercase in vendor.txt for some reason... - module_name = module_name.lower() - # PATCH: setuptools is actually only pkg_resources. - if module_name == 'setuptools': - module_name = 'pkg_resources' - - __import__( - f'pip._vendor.{module_name}', - globals(), - locals(), - level=0 - ) - return getattr(pip._vendor, module_name) - - -def get_vendor_version_from_module(module_name): - # type: (str) -> Optional[str] - module = get_module_from_module_name(module_name) - version = getattr(module, '__version__', None) - - if not version: - # Try to find version in debundled module info. - env = get_environment([os.path.dirname(module.__file__)]) - dist = env.get_distribution(module_name) - if dist: - version = str(dist.version) - - return version - - -def show_actual_vendor_versions(vendor_txt_versions): - # type: (Dict[str, str]) -> None - """Log the actual version and print extra info if there is - a conflict or if the actual version could not be imported. - """ - for module_name, expected_version in vendor_txt_versions.items(): - extra_message = '' - actual_version = get_vendor_version_from_module(module_name) - if not actual_version: - extra_message = ' (Unable to locate actual module version, using'\ - ' vendor.txt specified version)' - actual_version = expected_version - elif parse_version(actual_version) != parse_version(expected_version): - extra_message = ' (CONFLICT: vendor.txt suggests version should'\ - ' be {})'.format(expected_version) - logger.info('%s==%s%s', module_name, actual_version, extra_message) - - -def show_vendor_versions(): - # type: () -> None - logger.info('vendored library versions:') - - vendor_txt_versions = create_vendor_txt_map() - with indent_log(): - show_actual_vendor_versions(vendor_txt_versions) - - -def show_tags(options): - # type: (Values) -> None - tag_limit = 10 - - target_python = make_target_python(options) - tags = target_python.get_tags() - - # Display the target options that were explicitly provided. - formatted_target = target_python.format_given() - suffix = '' - if formatted_target: - suffix = f' (target: {formatted_target})' - - msg = 'Compatible tags: {}{}'.format(len(tags), suffix) - logger.info(msg) - - if options.verbose < 1 and len(tags) > tag_limit: - tags_limited = True - tags = tags[:tag_limit] - else: - tags_limited = False - - with indent_log(): - for tag in tags: - logger.info(str(tag)) - - if tags_limited: - msg = ( - '...\n' - '[First {tag_limit} tags shown. Pass --verbose to show all.]' - ).format(tag_limit=tag_limit) - logger.info(msg) - - -def ca_bundle_info(config): - # type: (Configuration) -> str - levels = set() - for key, _ in config.items(): - levels.add(key.split('.')[0]) - - if not levels: - return "Not specified" - - levels_that_override_global = ['install', 'wheel', 'download'] - global_overriding_level = [ - level for level in levels if level in levels_that_override_global - ] - if not global_overriding_level: - return 'global' - - if 'global' in levels: - levels.remove('global') - return ", ".join(levels) - - -class DebugCommand(Command): - """ - Display debug information. - """ - - usage = """ - %prog """ - ignore_require_venv = True - - def add_options(self): - # type: () -> None - cmdoptions.add_target_python_options(self.cmd_opts) - self.parser.insert_option_group(0, self.cmd_opts) - self.parser.config.load() - - def run(self, options, args): - # type: (Values, List[str]) -> int - logger.warning( - "This command is only meant for debugging. " - "Do not use this with automation for parsing and getting these " - "details, since the output and options of this command may " - "change without notice." - ) - show_value('pip version', get_pip_version()) - show_value('sys.version', sys.version) - show_value('sys.executable', sys.executable) - show_value('sys.getdefaultencoding', sys.getdefaultencoding()) - show_value('sys.getfilesystemencoding', sys.getfilesystemencoding()) - show_value( - 'locale.getpreferredencoding', locale.getpreferredencoding(), - ) - show_value('sys.platform', sys.platform) - show_sys_implementation() - - show_value("'cert' config value", ca_bundle_info(self.parser.config)) - show_value("REQUESTS_CA_BUNDLE", os.environ.get('REQUESTS_CA_BUNDLE')) - show_value("CURL_CA_BUNDLE", os.environ.get('CURL_CA_BUNDLE')) - show_value("pip._vendor.certifi.where()", where()) - show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED) - - show_vendor_versions() - - show_tags(options) - - return SUCCESS diff --git a/venv/Lib/site-packages/pip/_internal/commands/download.py b/venv/Lib/site-packages/pip/_internal/commands/download.py deleted file mode 100644 index 19f8d6c..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/download.py +++ /dev/null @@ -1,141 +0,0 @@ -import logging -import os -from optparse import Values -from typing import List - -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.utils.misc import ensure_dir, normalize_path, write_output -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -class DownloadCommand(RequirementCommand): - """ - Download packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports downloading from "requirements files", which provide - an easy way to specify a whole environment to be downloaded. - """ - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] ... - %prog [options] ... - %prog [options] ...""" - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option(cmdoptions.constraints()) - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.build_dir()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.global_options()) - 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.src()) - self.cmd_opts.add_option(cmdoptions.pre()) - self.cmd_opts.add_option(cmdoptions.require_hashes()) - self.cmd_opts.add_option(cmdoptions.progress_bar()) - 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.ignore_requires_python()) - - self.cmd_opts.add_option( - '-d', '--dest', '--destination-dir', '--destination-directory', - dest='download_dir', - metavar='dir', - default=os.curdir, - help=("Download packages into ."), - ) - - cmdoptions.add_target_python_options(self.cmd_opts) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - @with_cleanup - def run(self, options, args): - # type: (Values, List[str]) -> int - - options.ignore_installed = True - # editable doesn't really make sense for `pip download`, but the bowels - # of the RequirementSet code require that property. - options.editables = [] - - cmdoptions.check_dist_restriction(options) - - options.download_dir = normalize_path(options.download_dir) - ensure_dir(options.download_dir) - - session = self.get_default_session(options) - - target_python = make_target_python(options) - finder = self._build_package_finder( - options=options, - session=session, - target_python=target_python, - ignore_requires_python=options.ignore_requires_python, - ) - - req_tracker = self.enter_context(get_requirement_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="download", - globally_managed=True, - ) - - reqs = self.get_requirements(args, options, finder, session) - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - req_tracker=req_tracker, - session=session, - finder=finder, - download_dir=options.download_dir, - use_user_site=False, - ) - - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - ignore_requires_python=options.ignore_requires_python, - py_version_info=options.python_version, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve( - reqs, check_supported_wheels=True - ) - - downloaded = [] # type: List[str] - for req in requirement_set.requirements.values(): - if req.satisfied_by is None: - assert req.name is not None - preparer.save_linked_requirement(req) - downloaded.append(req.name) - if downloaded: - write_output('Successfully downloaded %s', ' '.join(downloaded)) - - return SUCCESS diff --git a/venv/Lib/site-packages/pip/_internal/commands/freeze.py b/venv/Lib/site-packages/pip/_internal/commands/freeze.py deleted file mode 100644 index 430d101..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/freeze.py +++ /dev/null @@ -1,104 +0,0 @@ -import sys -from optparse import Values -from typing import List - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.operations.freeze import freeze -from pip._internal.utils.compat import stdlib_pkgs -from pip._internal.utils.deprecation import deprecated - -DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} - - -class FreezeCommand(Command): - """ - Output installed packages in requirements format. - - packages are listed in a case-insensitive sorted order. - """ - - usage = """ - %prog [options]""" - log_streams = ("ext://sys.stderr", "ext://sys.stderr") - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help="Use the order in the given requirements file and its " - "comments when generating output. This option can be " - "used multiple times.") - self.cmd_opts.add_option( - '-f', '--find-links', - dest='find_links', - action='append', - default=[], - metavar='URL', - help='URL for finding packages, which will be added to the ' - 'output.') - self.cmd_opts.add_option( - '-l', '--local', - dest='local', - action='store_true', - default=False, - help='If in a virtualenv that has global access, do not output ' - '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.cmd_opts.add_option( - '--all', - dest='freeze_all', - action='store_true', - help='Do not skip these packages in the output:' - ' {}'.format(', '.join(DEV_PKGS))) - self.cmd_opts.add_option( - '--exclude-editable', - dest='exclude_editable', - action='store_true', - help='Exclude editable package from output.') - self.cmd_opts.add_option(cmdoptions.list_exclude()) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - # type: (Values, List[str]) -> int - skip = set(stdlib_pkgs) - if not options.freeze_all: - skip.update(DEV_PKGS) - - if options.excludes: - skip.update(options.excludes) - - cmdoptions.check_list_path_option(options) - - if options.find_links: - deprecated( - "--find-links option in pip freeze is deprecated.", - replacement=None, - gone_in="21.2", - issue=9069, - ) - - for line in freeze( - requirement=options.requirements, - find_links=options.find_links, - local_only=options.local, - user_only=options.user, - paths=options.path, - isolated=options.isolated_mode, - skip=skip, - exclude_editable=options.exclude_editable, - ): - sys.stdout.write(line + '\n') - return SUCCESS diff --git a/venv/Lib/site-packages/pip/_internal/commands/hash.py b/venv/Lib/site-packages/pip/_internal/commands/hash.py deleted file mode 100644 index bca48dc..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/hash.py +++ /dev/null @@ -1,58 +0,0 @@ -import hashlib -import logging -import sys -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES -from pip._internal.utils.misc import read_chunks, write_output - -logger = logging.getLogger(__name__) - - -class HashCommand(Command): - """ - Compute a hash of a local package archive. - - These can be used with --hash in a requirements file to do repeatable - installs. - """ - - usage = '%prog [options] ...' - ignore_require_venv = True - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option( - '-a', '--algorithm', - dest='algorithm', - choices=STRONG_HASHES, - action='store', - default=FAVORITE_HASH, - help='The hash algorithm to use: one of {}'.format( - ', '.join(STRONG_HASHES))) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - # type: (Values, List[str]) -> int - if not args: - self.parser.print_usage(sys.stderr) - return ERROR - - algorithm = options.algorithm - for path in args: - write_output('%s:\n--hash=%s:%s', - path, algorithm, _hash_of_file(path, algorithm)) - return SUCCESS - - -def _hash_of_file(path, algorithm): - # type: (str, str) -> str - """Return the hash digest of a file.""" - with open(path, 'rb') as archive: - hash = hashlib.new(algorithm) - for chunk in read_chunks(archive): - hash.update(chunk) - return hash.hexdigest() diff --git a/venv/Lib/site-packages/pip/_internal/commands/help.py b/venv/Lib/site-packages/pip/_internal/commands/help.py deleted file mode 100644 index 79d0eb4..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/help.py +++ /dev/null @@ -1,42 +0,0 @@ -from optparse import Values -from typing import List - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError - - -class HelpCommand(Command): - """Show help for commands""" - - usage = """ - %prog """ - ignore_require_venv = True - - def run(self, options, args): - # type: (Values, List[str]) -> int - from pip._internal.commands import ( - commands_dict, - create_command, - get_similar_commands, - ) - - try: - # 'pip help' with no args is handled by pip.__init__.parseopt() - cmd_name = args[0] # the command we need help for - except IndexError: - return SUCCESS - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = [f'unknown command "{cmd_name}"'] - if guess: - msg.append(f'maybe you meant "{guess}"') - - raise CommandError(' - '.join(msg)) - - command = create_command(cmd_name) - command.parser.print_help() - - return SUCCESS diff --git a/venv/Lib/site-packages/pip/_internal/commands/install.py b/venv/Lib/site-packages/pip/_internal/commands/install.py deleted file mode 100644 index 6932f5a..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/install.py +++ /dev/null @@ -1,740 +0,0 @@ -import errno -import logging -import operator -import os -import shutil -import site -from optparse import SUPPRESS_HELP, Values -from typing import Iterable, List, Optional - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.cmdoptions import make_target_python -from pip._internal.cli.req_command import ( - RequirementCommand, - warn_if_run_as_root, - with_cleanup, -) -from pip._internal.cli.status_codes import ERROR, SUCCESS -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.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.distutils_args import parse_distutils_args -from pip._internal.utils.filesystem import test_writable_dir -from pip._internal.utils.misc import ( - ensure_dir, - get_pip_version, - protect_pip_from_modification_on_windows, - write_output, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.virtualenv import ( - running_under_virtualenv, - virtualenv_no_global, -) -from pip._internal.wheel_builder import ( - BinaryAllowedPredicate, - build, - should_build_for_install_command, -) - -logger = logging.getLogger(__name__) - - -def get_check_binary_allowed(format_control): - # type: (FormatControl) -> BinaryAllowedPredicate - def check_binary_allowed(req): - # type: (InstallRequirement) -> bool - canonical_name = canonicalize_name(req.name or "") - allowed_formats = format_control.get_allowed_formats(canonical_name) - return "binary" in allowed_formats - - return check_binary_allowed - - -class InstallCommand(RequirementCommand): - """ - Install packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports installing from "requirements files", which provide - an easy way to specify a whole environment to be installed. - """ - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.constraints()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.pre()) - - self.cmd_opts.add_option(cmdoptions.editable()) - self.cmd_opts.add_option( - '-t', '--target', - dest='target_dir', - metavar='dir', - default=None, - help='Install packages into . ' - 'By default this will not replace existing files/folders in ' - '. Use --upgrade to replace existing packages in ' - 'with new versions.' - ) - cmdoptions.add_target_python_options(self.cmd_opts) - - self.cmd_opts.add_option( - '--user', - dest='use_user_site', - action='store_true', - help="Install to the Python user install directory for your " - "platform. Typically ~/.local/, or %APPDATA%\\Python on " - "Windows. (See the Python documentation for site.USER_BASE " - "for full details.)") - self.cmd_opts.add_option( - '--no-user', - dest='use_user_site', - action='store_false', - help=SUPPRESS_HELP) - self.cmd_opts.add_option( - '--root', - dest='root_path', - metavar='dir', - default=None, - help="Install everything relative to this alternate root " - "directory.") - self.cmd_opts.add_option( - '--prefix', - dest='prefix_path', - metavar='dir', - default=None, - help="Installation prefix where lib, bin and other top-level " - "folders are placed") - - self.cmd_opts.add_option(cmdoptions.build_dir()) - - self.cmd_opts.add_option(cmdoptions.src()) - - self.cmd_opts.add_option( - '-U', '--upgrade', - dest='upgrade', - action='store_true', - help='Upgrade all specified packages to the newest available ' - 'version. The handling of dependencies depends on the ' - 'upgrade-strategy used.' - ) - - self.cmd_opts.add_option( - '--upgrade-strategy', - dest='upgrade_strategy', - default='only-if-needed', - choices=['only-if-needed', 'eager'], - help='Determines how dependency upgrading should be handled ' - '[default: %default]. ' - '"eager" - dependencies are upgraded regardless of ' - 'whether the currently installed version satisfies the ' - 'requirements of the upgraded package(s). ' - '"only-if-needed" - are upgraded only when they do not ' - 'satisfy the requirements of the upgraded package(s).' - ) - - self.cmd_opts.add_option( - '--force-reinstall', - dest='force_reinstall', - action='store_true', - help='Reinstall all packages even if they are already ' - 'up-to-date.') - - self.cmd_opts.add_option( - '-I', '--ignore-installed', - dest='ignore_installed', - action='store_true', - help='Ignore the installed packages, overwriting them. ' - 'This can break your system if the existing package ' - 'is of a different version or was installed ' - 'with a different package manager!' - ) - - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - 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.install_options()) - self.cmd_opts.add_option(cmdoptions.global_options()) - - self.cmd_opts.add_option( - "--compile", - action="store_true", - dest="compile", - default=True, - help="Compile Python source files to bytecode", - ) - - self.cmd_opts.add_option( - "--no-compile", - action="store_false", - dest="compile", - help="Do not compile Python source files to bytecode", - ) - - self.cmd_opts.add_option( - "--no-warn-script-location", - action="store_false", - dest="warn_script_location", - default=True, - help="Do not warn when installing scripts outside PATH", - ) - self.cmd_opts.add_option( - "--no-warn-conflicts", - action="store_false", - dest="warn_about_conflicts", - 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()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - @with_cleanup - def run(self, options, args): - # type: (Values, List[str]) -> int - if options.use_user_site and options.target_dir is not None: - raise CommandError("Can not combine '--user' and '--target'") - - cmdoptions.check_install_build_global(options) - upgrade_strategy = "to-satisfy-only" - if options.upgrade: - upgrade_strategy = options.upgrade_strategy - - cmdoptions.check_dist_restriction(options, check_target=True) - - install_options = options.install_options or [] - - logger.debug("Using %s", get_pip_version()) - options.use_user_site = decide_user_install( - options.use_user_site, - prefix_path=options.prefix_path, - target_dir=options.target_dir, - root_path=options.root_path, - isolated_mode=options.isolated_mode, - ) - - target_temp_dir = None # type: Optional[TempDirectory] - target_temp_dir_path = None # type: Optional[str] - if options.target_dir: - options.ignore_installed = True - options.target_dir = os.path.abspath(options.target_dir) - if (os.path.exists(options.target_dir) and not - os.path.isdir(options.target_dir)): - raise CommandError( - "Target path exists but is not a directory, will not " - "continue." - ) - - # Create a target directory for using with the target option - target_temp_dir = TempDirectory(kind="target") - target_temp_dir_path = target_temp_dir.path - self.enter_context(target_temp_dir) - - global_options = options.global_options or [] - - session = self.get_default_session(options) - - target_python = make_target_python(options) - finder = self._build_package_finder( - options=options, - session=session, - target_python=target_python, - ignore_requires_python=options.ignore_requires_python, - ) - wheel_cache = WheelCache(options.cache_dir, options.format_control) - - req_tracker = self.enter_context(get_requirement_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="install", - globally_managed=True, - ) - - try: - reqs = self.get_requirements(args, options, finder, session) - - reject_location_related_install_options( - reqs, options.install_options - ) - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - req_tracker=req_tracker, - session=session, - finder=finder, - use_user_site=options.use_user_site, - ) - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - wheel_cache=wheel_cache, - use_user_site=options.use_user_site, - ignore_installed=options.ignore_installed, - ignore_requires_python=options.ignore_requires_python, - force_reinstall=options.force_reinstall, - upgrade_strategy=upgrade_strategy, - use_pep517=options.use_pep517, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve( - reqs, check_supported_wheels=not options.target_dir - ) - - try: - pip_req = requirement_set.get_requirement("pip") - except KeyError: - modifying_pip = False - else: - # If we're not replacing an already installed pip, - # we're not modifying it. - modifying_pip = pip_req.satisfied_by is None - protect_pip_from_modification_on_windows( - modifying_pip=modifying_pip - ) - - check_binary_allowed = get_check_binary_allowed( - finder.format_control - ) - - reqs_to_build = [ - r for r in requirement_set.requirements.values() - if should_build_for_install_command( - r, check_binary_allowed - ) - ] - - _, build_failures = build( - reqs_to_build, - wheel_cache=wheel_cache, - verify=True, - build_options=[], - global_options=[], - ) - - # If we're using PEP 517, we cannot do a direct install - # so we fail here. - pep517_build_failure_names = [ - r.name # type: ignore - for r in build_failures if r.use_pep517 - ] # type: List[str] - if pep517_build_failure_names: - raise InstallationError( - "Could not build wheels for {} which use" - " PEP 517 and cannot be installed directly".format( - ", ".join(pep517_build_failure_names) - ) - ) - - # For now, we just warn about failures building legacy - # requirements, as we'll fall through to a direct - # install for those. - for r in build_failures: - if not r.use_pep517: - r.legacy_install_reason = 8368 - - to_install = resolver.get_installation_order( - requirement_set - ) - - # Check for conflicts in the package set we're installing. - conflicts = None # type: Optional[ConflictDetails] - should_warn_about_conflicts = ( - not options.ignore_dependencies and - options.warn_about_conflicts - ) - if should_warn_about_conflicts: - conflicts = self._determine_conflicts(to_install) - - # Don't warn about script install locations if - # --target has been specified - warn_script_location = options.warn_script_location - if options.target_dir: - warn_script_location = False - - installed = install_given_reqs( - to_install, - install_options, - global_options, - root=options.root_path, - home=target_temp_dir_path, - prefix=options.prefix_path, - warn_script_location=warn_script_location, - use_user_site=options.use_user_site, - pycompile=options.compile, - ) - - lib_locations = get_lib_location_guesses( - user=options.use_user_site, - home=target_temp_dir_path, - root=options.root_path, - prefix=options.prefix_path, - isolated=options.isolated_mode, - ) - env = get_environment(lib_locations) - - installed.sort(key=operator.attrgetter('name')) - items = [] - for result in installed: - item = result.name - try: - installed_dist = env.get_distribution(item) - if installed_dist is not None: - item = f"{item}-{installed_dist.version}" - except Exception: - pass - items.append(item) - - if conflicts is not None: - self._warn_about_conflicts( - conflicts, - resolver_variant=self.determine_resolver_variant(options), - ) - - installed_desc = ' '.join(items) - if installed_desc: - write_output( - 'Successfully installed %s', installed_desc, - ) - except OSError as error: - show_traceback = (self.verbosity >= 1) - - message = create_os_error_message( - error, show_traceback, options.use_user_site, - ) - logger.error(message, exc_info=show_traceback) # noqa - - return ERROR - - if options.target_dir: - assert target_temp_dir - self._handle_target_dir( - options.target_dir, target_temp_dir, options.upgrade - ) - - warn_if_run_as_root() - return SUCCESS - - def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): - # type: (str, TempDirectory, bool) -> None - ensure_dir(target_dir) - - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - lib_dir_list = [] - - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - scheme = get_scheme('', home=target_temp_dir.path) - purelib_dir = scheme.purelib - platlib_dir = scheme.platlib - data_dir = scheme.data - - if os.path.exists(purelib_dir): - lib_dir_list.append(purelib_dir) - if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: - lib_dir_list.append(platlib_dir) - if os.path.exists(data_dir): - lib_dir_list.append(data_dir) - - for lib_dir in lib_dir_list: - for item in os.listdir(lib_dir): - if lib_dir == data_dir: - ddir = os.path.join(data_dir, item) - if any(s.startswith(ddir) for s in lib_dir_list[:-1]): - continue - target_item_dir = os.path.join(target_dir, item) - if os.path.exists(target_item_dir): - if not upgrade: - logger.warning( - 'Target directory %s already exists. Specify ' - '--upgrade to force replacement.', - target_item_dir - ) - continue - if os.path.islink(target_item_dir): - logger.warning( - 'Target directory %s already exists and is ' - 'a link. pip will not automatically replace ' - 'links, please remove if replacement is ' - 'desired.', - target_item_dir - ) - continue - if os.path.isdir(target_item_dir): - shutil.rmtree(target_item_dir) - else: - os.remove(target_item_dir) - - shutil.move( - os.path.join(lib_dir, item), - target_item_dir - ) - - def _determine_conflicts(self, to_install): - # type: (List[InstallRequirement]) -> Optional[ConflictDetails] - try: - return check_install_conflicts(to_install) - except Exception: - logger.exception( - "Error while checking for conflicts. Please file an issue on " - "pip's issue tracker: https://github.com/pypa/pip/issues/new" - ) - return None - - def _warn_about_conflicts(self, conflict_details, resolver_variant): - # type: (ConflictDetails, str) -> None - package_set, (missing, conflicting) = conflict_details - if not missing and not conflicting: - return - - parts = [] # type: List[str] - if resolver_variant == "legacy": - parts.append( - "pip's legacy dependency resolver does not consider dependency " - "conflicts when selecting packages. This behaviour is the " - "source of the following dependency conflicts." - ) - else: - assert resolver_variant == "2020-resolver" - parts.append( - "pip's dependency resolver does not currently take into account " - "all the packages that are installed. This behaviour is the " - "source of the following dependency conflicts." - ) - - # NOTE: There is some duplication here, with commands/check.py - for project_name in missing: - version = package_set[project_name][0] - for dependency in missing[project_name]: - message = ( - "{name} {version} requires {requirement}, " - "which is not installed." - ).format( - name=project_name, - version=version, - requirement=dependency[1], - ) - parts.append(message) - - for project_name in conflicting: - version = package_set[project_name][0] - for dep_name, dep_version, req in conflicting[project_name]: - message = ( - "{name} {version} requires {requirement}, but {you} have " - "{dep_name} {dep_version} which is incompatible." - ).format( - name=project_name, - version=version, - requirement=req, - dep_name=dep_name, - dep_version=dep_version, - you=("you" if resolver_variant == "2020-resolver" else "you'll") - ) - parts.append(message) - - logger.critical("\n".join(parts)) - - -def get_lib_location_guesses( - user=False, # type: bool - home=None, # type: Optional[str] - root=None, # type: Optional[str] - isolated=False, # type: bool - prefix=None # type: Optional[str] -): - # type:(...) -> List[str] - scheme = get_scheme( - '', - user=user, - home=home, - root=root, - isolated=isolated, - prefix=prefix, - ) - return [scheme.purelib, scheme.platlib] - - -def site_packages_writable(root, isolated): - # type: (Optional[str], bool) -> bool - return all( - test_writable_dir(d) for d in set( - get_lib_location_guesses(root=root, isolated=isolated)) - ) - - -def decide_user_install( - use_user_site, # type: Optional[bool] - prefix_path=None, # type: Optional[str] - target_dir=None, # type: Optional[str] - root_path=None, # type: Optional[str] - isolated_mode=False, # type: bool -): - # type: (...) -> bool - """Determine whether to do a user install based on the input options. - - If use_user_site is False, no additional checks are done. - If use_user_site is True, it is checked for compatibility with other - options. - If use_user_site is None, the default behaviour depends on the environment, - which is provided by the other arguments. - """ - # In some cases (config from tox), use_user_site can be set to an integer - # rather than a bool, which 'use_user_site is False' wouldn't catch. - if (use_user_site is not None) and (not use_user_site): - logger.debug("Non-user install by explicit request") - return False - - if use_user_site: - if prefix_path: - raise CommandError( - "Can not combine '--user' and '--prefix' as they imply " - "different installation locations" - ) - if virtualenv_no_global(): - raise InstallationError( - "Can not perform a '--user' install. User site-packages " - "are not visible in this virtualenv." - ) - logger.debug("User install by explicit request") - return True - - # If we are here, user installs have not been explicitly requested/avoided - assert use_user_site is None - - # user install incompatible with --prefix/--target - if prefix_path or target_dir: - logger.debug("Non-user install due to --prefix or --target option") - return False - - # If user installs are not enabled, choose a non-user install - if not site.ENABLE_USER_SITE: - logger.debug("Non-user install because user site-packages disabled") - return False - - # If we have permission for a non-user install, do that, - # otherwise do a user install. - if site_packages_writable(root=root_path, isolated=isolated_mode): - logger.debug("Non-user install because site-packages writeable") - return False - - logger.info("Defaulting to user installation because normal site-packages " - "is not writeable") - return True - - -def reject_location_related_install_options(requirements, options): - # type: (List[InstallRequirement], Optional[List[str]]) -> None - """If any location-changing --install-option arguments were passed for - requirements or on the command-line, then show a deprecation warning. - """ - def format_options(option_names): - # type: (Iterable[str]) -> List[str] - return ["--{}".format(name.replace("_", "-")) for name in option_names] - - offenders = [] - - for requirement in requirements: - install_options = requirement.install_options - location_options = parse_distutils_args(install_options) - if location_options: - offenders.append( - "{!r} from {}".format( - format_options(location_options.keys()), requirement - ) - ) - - if options: - location_options = parse_distutils_args(options) - if location_options: - offenders.append( - "{!r} from command line".format( - format_options(location_options.keys()) - ) - ) - - if not offenders: - return - - raise CommandError( - "Location-changing options found in --install-option: {}." - " This is unsupported, use pip-level options like --user," - " --prefix, --root, and --target instead.".format( - "; ".join(offenders) - ) - ) - - -def create_os_error_message(error, show_traceback, using_user_site): - # type: (OSError, bool, bool) -> str - """Format an error message for an OSError - - It may occur anytime during the execution of the install command. - """ - parts = [] - - # Mention the error if we are not going to show a traceback - parts.append("Could not install packages due to an OSError") - if not show_traceback: - parts.append(": ") - parts.append(str(error)) - else: - parts.append(".") - - # Spilt the error indication from a helper message (if any) - parts[-1] += "\n" - - # Suggest useful actions to the user: - # (1) using user site-packages or (2) verifying the permissions - if error.errno == errno.EACCES: - user_option_part = "Consider using the `--user` option" - permissions_part = "Check the permissions" - - if not running_under_virtualenv() and not using_user_site: - parts.extend([ - user_option_part, " or ", - permissions_part.lower(), - ]) - else: - parts.append(permissions_part) - parts.append(".\n") - - return "".join(parts).strip() + "\n" diff --git a/venv/Lib/site-packages/pip/_internal/commands/list.py b/venv/Lib/site-packages/pip/_internal/commands/list.py deleted file mode 100644 index dcf9432..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/list.py +++ /dev/null @@ -1,319 +0,0 @@ -import json -import logging -from optparse import Values -from typing import Iterator, List, Set, Tuple - -from pip._vendor.pkg_resources import Distribution - -from pip._internal.cli import cmdoptions -from pip._internal.cli.req_command import IndexGroupCommand -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError -from pip._internal.index.collector import LinkCollector -from pip._internal.index.package_finder import PackageFinder -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.network.session import PipSession -from pip._internal.utils.compat import stdlib_pkgs -from pip._internal.utils.misc import ( - dist_is_editable, - get_installed_distributions, - tabulate, - write_output, -) -from pip._internal.utils.packaging import get_installer -from pip._internal.utils.parallel import map_multithread - -logger = logging.getLogger(__name__) - - -class ListCommand(IndexGroupCommand): - """ - List installed packages, including editables. - - Packages are listed in a case-insensitive sorted order. - """ - - ignore_require_venv = True - usage = """ - %prog [options]""" - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option( - '-o', '--outdated', - action='store_true', - default=False, - help='List outdated packages') - self.cmd_opts.add_option( - '-u', '--uptodate', - action='store_true', - default=False, - help='List uptodate packages') - self.cmd_opts.add_option( - '-e', '--editable', - action='store_true', - default=False, - help='List editable projects.') - self.cmd_opts.add_option( - '-l', '--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.cmd_opts.add_option( - '--pre', - action='store_true', - default=False, - help=("Include pre-release and development versions. By default, " - "pip only finds stable versions."), - ) - - self.cmd_opts.add_option( - '--format', - action='store', - dest='list_format', - default="columns", - choices=('columns', 'freeze', 'json'), - help="Select the output format among: columns (default), freeze, " - "or json", - ) - - self.cmd_opts.add_option( - '--not-required', - action='store_true', - dest='not_required', - help="List packages that are not dependencies of " - "installed packages.", - ) - - self.cmd_opts.add_option( - '--exclude-editable', - action='store_false', - dest='include_editable', - help='Exclude editable package from output.', - ) - self.cmd_opts.add_option( - '--include-editable', - action='store_true', - dest='include_editable', - help='Include editable package from output.', - default=True, - ) - self.cmd_opts.add_option(cmdoptions.list_exclude()) - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, self.parser - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - def _build_package_finder(self, options, session): - # type: (Values, PipSession) -> PackageFinder - """ - Create a package finder appropriate to this list command. - """ - link_collector = LinkCollector.create(session, options=options) - - # Pass allow_yanked=False to ignore yanked versions. - selection_prefs = SelectionPreferences( - allow_yanked=False, - allow_all_prereleases=options.pre, - ) - - return PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - ) - - def run(self, options, args): - # type: (Values, List[str]) -> int - if options.outdated and options.uptodate: - raise CommandError( - "Options --outdated and --uptodate cannot be combined.") - - cmdoptions.check_list_path_option(options) - - skip = set(stdlib_pkgs) - if options.excludes: - skip.update(options.excludes) - - packages = get_installed_distributions( - local_only=options.local, - user_only=options.user, - editables_only=options.editable, - include_editables=options.include_editable, - paths=options.path, - skip=skip, - ) - - # get_not_required must be called firstly in order to find and - # filter out all dependencies correctly. Otherwise a package - # can't be identified as requirement because some parent packages - # could be filtered out before. - if options.not_required: - packages = self.get_not_required(packages, options) - - if options.outdated: - packages = self.get_outdated(packages, options) - elif options.uptodate: - packages = self.get_uptodate(packages, options) - - self.output_package_listing(packages, options) - return SUCCESS - - def get_outdated(self, packages, options): - # type: (List[Distribution], Values) -> List[Distribution] - return [ - dist for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version > dist.parsed_version - ] - - def get_uptodate(self, packages, options): - # type: (List[Distribution], Values) -> List[Distribution] - return [ - dist for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version == dist.parsed_version - ] - - def get_not_required(self, packages, options): - # type: (List[Distribution], Values) -> List[Distribution] - dep_keys = set() # type: Set[Distribution] - for dist in packages: - dep_keys.update(requirement.key for requirement in dist.requires()) - - # Create a set to remove duplicate packages, and cast it to a list - # to keep the return type consistent with get_outdated and - # get_uptodate - return list({pkg for pkg in packages if pkg.key not in dep_keys}) - - def iter_packages_latest_infos(self, packages, options): - # type: (List[Distribution], Values) -> Iterator[Distribution] - with self._build_session(options) as session: - finder = self._build_package_finder(options, session) - - def latest_info(dist): - # type: (Distribution) -> Distribution - all_candidates = finder.find_all_candidates(dist.key) - if not options.pre: - # Remove prereleases - all_candidates = [candidate for candidate in all_candidates - if not candidate.version.is_prerelease] - - evaluator = finder.make_candidate_evaluator( - project_name=dist.project_name, - ) - best_candidate = evaluator.sort_best_candidate(all_candidates) - if best_candidate is None: - return None - - remote_version = best_candidate.version - if best_candidate.link.is_wheel: - typ = 'wheel' - else: - typ = 'sdist' - # This is dirty but makes the rest of the code much cleaner - dist.latest_version = remote_version - dist.latest_filetype = typ - return dist - - for dist in map_multithread(latest_info, packages): - if dist is not None: - yield dist - - def output_package_listing(self, packages, options): - # type: (List[Distribution], Values) -> None - packages = sorted( - packages, - key=lambda dist: dist.project_name.lower(), - ) - if options.list_format == 'columns' and packages: - data, header = format_for_columns(packages, options) - self.output_package_listing_columns(data, header) - elif options.list_format == 'freeze': - for dist in packages: - if options.verbose >= 1: - write_output("%s==%s (%s)", dist.project_name, - dist.version, dist.location) - else: - write_output("%s==%s", dist.project_name, dist.version) - elif options.list_format == 'json': - write_output(format_for_json(packages, options)) - - def output_package_listing_columns(self, data, header): - # type: (List[List[str]], List[str]) -> None - # insert the header first: we need to know the size of column names - if len(data) > 0: - data.insert(0, header) - - pkg_strings, sizes = tabulate(data) - - # Create and add a separator. - if len(data) > 0: - pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) - - for val in pkg_strings: - write_output(val) - - -def format_for_columns(pkgs, options): - # type: (List[Distribution], Values) -> Tuple[List[List[str]], List[str]] - """ - Convert the package data into something usable - by output_package_listing_columns. - """ - running_outdated = options.outdated - # Adjust the header for the `pip list --outdated` case. - if running_outdated: - header = ["Package", "Version", "Latest", "Type"] - else: - header = ["Package", "Version"] - - data = [] - if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): - header.append("Location") - if options.verbose >= 1: - header.append("Installer") - - for proj in pkgs: - # if we're working on the 'outdated' list, separate out the - # latest_version and type - row = [proj.project_name, proj.version] - - if running_outdated: - row.append(proj.latest_version) - row.append(proj.latest_filetype) - - if options.verbose >= 1 or dist_is_editable(proj): - row.append(proj.location) - if options.verbose >= 1: - row.append(get_installer(proj)) - - data.append(row) - - return data, header - - -def format_for_json(packages, options): - # type: (List[Distribution], Values) -> str - data = [] - for dist in packages: - info = { - 'name': dist.project_name, - 'version': str(dist.version), - } - if options.verbose >= 1: - info['location'] = dist.location - info['installer'] = get_installer(dist) - if options.outdated: - info['latest_version'] = str(dist.latest_version) - info['latest_filetype'] = dist.latest_filetype - data.append(info) - return json.dumps(data) diff --git a/venv/Lib/site-packages/pip/_internal/commands/search.py b/venv/Lib/site-packages/pip/_internal/commands/search.py deleted file mode 100644 index d66e823..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/search.py +++ /dev/null @@ -1,162 +0,0 @@ -import logging -import shutil -import sys -import textwrap -import xmlrpc.client -from collections import OrderedDict -from optparse import Values -from typing import TYPE_CHECKING, Dict, List, Optional - -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.cli.base_command import Command -from pip._internal.cli.req_command import SessionCommandMixin -from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS -from pip._internal.exceptions import CommandError -from pip._internal.metadata import get_default_environment -from pip._internal.models.index import PyPI -from pip._internal.network.xmlrpc import PipXmlrpcTransport -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import write_output - -if TYPE_CHECKING: - from typing import TypedDict - - class TransformedHit(TypedDict): - name: str - summary: str - versions: List[str] - -logger = logging.getLogger(__name__) - - -class SearchCommand(Command, SessionCommandMixin): - """Search for PyPI packages whose name or summary contains .""" - - usage = """ - %prog [options] """ - ignore_require_venv = True - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option( - '-i', '--index', - dest='index', - metavar='URL', - default=PyPI.pypi_url, - help='Base URL of Python Package Index (default %default)') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - # type: (Values, List[str]) -> int - if not args: - raise CommandError('Missing required argument (search query).') - query = args - pypi_hits = self.search(query, options) - hits = transform_hits(pypi_hits) - - terminal_width = None - if sys.stdout.isatty(): - terminal_width = shutil.get_terminal_size()[0] - - print_results(hits, terminal_width=terminal_width) - if pypi_hits: - return SUCCESS - return NO_MATCHES_FOUND - - def search(self, query, options): - # type: (List[str], Values) -> List[Dict[str, str]] - index_url = options.index - - session = self.get_default_session(options) - - transport = PipXmlrpcTransport(index_url, session) - pypi = xmlrpc.client.ServerProxy(index_url, transport) - try: - hits = pypi.search({'name': query, 'summary': query}, 'or') - except xmlrpc.client.Fault as fault: - message = "XMLRPC request failed [code: {code}]\n{string}".format( - code=fault.faultCode, - string=fault.faultString, - ) - raise CommandError(message) - assert isinstance(hits, list) - return hits - - -def transform_hits(hits): - # type: (List[Dict[str, str]]) -> List[TransformedHit] - """ - The list from pypi is really a list of versions. We want a list of - packages with the list of versions stored inline. This converts the - list from pypi into one we can use. - """ - packages = OrderedDict() # type: OrderedDict[str, TransformedHit] - for hit in hits: - name = hit['name'] - summary = hit['summary'] - version = hit['version'] - - if name not in packages.keys(): - packages[name] = { - 'name': name, - 'summary': summary, - 'versions': [version], - } - else: - packages[name]['versions'].append(version) - - # if this is the highest version, replace summary and score - if version == highest_version(packages[name]['versions']): - packages[name]['summary'] = summary - - return list(packages.values()) - - -def print_results(hits, name_column_width=None, terminal_width=None): - # type: (List[TransformedHit], Optional[int], Optional[int]) -> None - if not hits: - return - if name_column_width is None: - name_column_width = max([ - len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) - for hit in hits - ]) + 4 - - env = get_default_environment() - for hit in hits: - name = hit['name'] - summary = hit['summary'] or '' - latest = highest_version(hit.get('versions', ['-'])) - if terminal_width is not None: - target_width = terminal_width - name_column_width - 5 - if target_width > 10: - # wrap and indent summary to fit terminal - summary_lines = textwrap.wrap(summary, target_width) - summary = ('\n' + ' ' * (name_column_width + 3)).join( - summary_lines) - - name_latest = f'{name} ({latest})' - line = f'{name_latest:{name_column_width}} - {summary}' - try: - write_output(line) - dist = env.get_distribution(name) - if dist is not None: - with indent_log(): - if dist.version == latest: - write_output('INSTALLED: %s (latest)', dist.version) - else: - write_output('INSTALLED: %s', dist.version) - if parse_version(latest).pre: - write_output('LATEST: %s (pre-release; install' - ' with "pip install --pre")', latest) - else: - write_output('LATEST: %s', latest) - except UnicodeEncodeError: - pass - - -def highest_version(versions): - # type: (List[str]) -> str - return max(versions, key=parse_version) diff --git a/venv/Lib/site-packages/pip/_internal/commands/show.py b/venv/Lib/site-packages/pip/_internal/commands/show.py deleted file mode 100644 index 24e855a..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/show.py +++ /dev/null @@ -1,181 +0,0 @@ -import logging -import os -from email.parser import FeedParser -from optparse import Values -from typing import Dict, Iterator, List - -from pip._vendor import pkg_resources -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.utils.misc import write_output - -logger = logging.getLogger(__name__) - - -class ShowCommand(Command): - """ - Show information about one or more installed packages. - - The output is in RFC-compliant mail header format. - """ - - usage = """ - %prog [options] ...""" - ignore_require_venv = True - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option( - '-f', '--files', - dest='files', - action='store_true', - default=False, - help='Show the full list of installed files for each package.') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - # type: (Values, List[str]) -> int - if not args: - logger.warning('ERROR: Please provide a package name or names.') - return ERROR - query = args - - results = search_packages_info(query) - if not print_results( - results, list_files=options.files, verbose=options.verbose): - return ERROR - return SUCCESS - - -def search_packages_info(query): - # type: (List[str]) -> Iterator[Dict[str, str]] - """ - Gather details from installed distributions. Print distribution name, - version, location, and installed files. Installed files requires a - pip generated 'installed-files.txt' in the distributions '.egg-info' - directory. - """ - installed = {} - for p in pkg_resources.working_set: - installed[canonicalize_name(p.project_name)] = p - - 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] - ) - if missing: - logger.warning('Package(s) not found: %s', ', '.join(missing)) - - def get_requiring_packages(package_name): - # type: (str) -> List[str] - canonical_name = canonicalize_name(package_name) - return [ - pkg.project_name for pkg in pkg_resources.working_set - if canonical_name in - [canonicalize_name(required.name) for required in - pkg.requires()] - ] - - for dist in [installed[pkg] for pkg in query_names if pkg in installed]: - package = { - 'name': dist.project_name, - 'version': dist.version, - 'location': dist.location, - 'requires': [dep.project_name for dep in dist.requires()], - 'required_by': get_requiring_packages(dist.project_name) - } - file_list = None - metadata = '' - if isinstance(dist, pkg_resources.DistInfoDistribution): - # RECORDs should be part of .dist-info metadatas - if dist.has_metadata('RECORD'): - lines = dist.get_metadata_lines('RECORD') - paths = [line.split(',')[0] for line in lines] - paths = [os.path.join(dist.location, p) for p in paths] - file_list = [os.path.relpath(p, dist.location) for p in paths] - - if dist.has_metadata('METADATA'): - metadata = dist.get_metadata('METADATA') - else: - # Otherwise use pip's log for .egg-info's - if dist.has_metadata('installed-files.txt'): - paths = dist.get_metadata_lines('installed-files.txt') - paths = [os.path.join(dist.egg_info, p) for p in paths] - file_list = [os.path.relpath(p, dist.location) for p in paths] - - if dist.has_metadata('PKG-INFO'): - metadata = dist.get_metadata('PKG-INFO') - - if dist.has_metadata('entry_points.txt'): - entry_points = dist.get_metadata_lines('entry_points.txt') - package['entry_points'] = entry_points - - if dist.has_metadata('INSTALLER'): - for line in dist.get_metadata_lines('INSTALLER'): - if line.strip(): - package['installer'] = line.strip() - break - - # @todo: Should pkg_resources.Distribution have a - # `get_pkg_info` method? - feed_parser = FeedParser() - feed_parser.feed(metadata) - pkg_info_dict = feed_parser.close() - for key in ('metadata-version', 'summary', - 'home-page', 'author', 'author-email', 'license'): - package[key] = pkg_info_dict.get(key) - - # It looks like FeedParser cannot deal with repeated headers - classifiers = [] - for line in metadata.splitlines(): - if line.startswith('Classifier: '): - classifiers.append(line[len('Classifier: '):]) - package['classifiers'] = classifiers - - if file_list: - package['files'] = sorted(file_list) - yield package - - -def print_results(distributions, list_files=False, verbose=False): - # type: (Iterator[Dict[str, str]], bool, bool) -> bool - """ - Print the information from installed distributions found. - """ - results_printed = False - for i, dist in enumerate(distributions): - results_printed = True - if i > 0: - write_output("---") - - write_output("Name: %s", dist.get('name', '')) - write_output("Version: %s", dist.get('version', '')) - write_output("Summary: %s", dist.get('summary', '')) - write_output("Home-page: %s", dist.get('home-page', '')) - write_output("Author: %s", dist.get('author', '')) - write_output("Author-email: %s", dist.get('author-email', '')) - write_output("License: %s", dist.get('license', '')) - write_output("Location: %s", dist.get('location', '')) - write_output("Requires: %s", ', '.join(dist.get('requires', []))) - write_output("Required-by: %s", ', '.join(dist.get('required_by', []))) - - if verbose: - write_output("Metadata-Version: %s", - dist.get('metadata-version', '')) - write_output("Installer: %s", dist.get('installer', '')) - write_output("Classifiers:") - for classifier in dist.get('classifiers', []): - write_output(" %s", classifier) - write_output("Entry-points:") - for entry in dist.get('entry_points', []): - write_output(" %s", entry.strip()) - if list_files: - write_output("Files:") - for line in dist.get('files', []): - write_output(" %s", line.strip()) - if "files" not in dist: - write_output("Cannot locate installed-files.txt") - return results_printed diff --git a/venv/Lib/site-packages/pip/_internal/commands/uninstall.py b/venv/Lib/site-packages/pip/_internal/commands/uninstall.py deleted file mode 100644 index 9a3c9f8..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/uninstall.py +++ /dev/null @@ -1,92 +0,0 @@ -from optparse import Values -from typing import List - -from pip._vendor.packaging.utils import canonicalize_name - -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 -from pip._internal.exceptions import InstallationError -from pip._internal.req import parse_requirements -from pip._internal.req.constructors import ( - install_req_from_line, - install_req_from_parsed_requirement, -) -from pip._internal.utils.misc import protect_pip_from_modification_on_windows - - -class UninstallCommand(Command, SessionCommandMixin): - """ - Uninstall packages. - - pip is able to uninstall most installed packages. Known exceptions are: - - - Pure distutils packages installed with ``python setup.py install``, which - leave behind no metadata to determine what files were installed. - - Script wrappers installed by ``python setup.py develop``. - """ - - usage = """ - %prog [options] ... - %prog [options] -r ...""" - - def add_options(self): - # type: () -> None - self.cmd_opts.add_option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help='Uninstall all the packages listed in the given requirements ' - 'file. This option can be used multiple times.', - ) - self.cmd_opts.add_option( - '-y', '--yes', - dest='yes', - action='store_true', - help="Don't ask for confirmation of uninstall deletions.") - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - # type: (Values, List[str]) -> int - session = self.get_default_session(options) - - reqs_to_uninstall = {} - for name in args: - req = install_req_from_line( - name, isolated=options.isolated_mode, - ) - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - for filename in options.requirements: - for parsed_req in parse_requirements( - filename, - options=options, - session=session): - req = install_req_from_parsed_requirement( - parsed_req, - isolated=options.isolated_mode - ) - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - if not reqs_to_uninstall: - raise InstallationError( - f'You must give at least one requirement to {self.name} (see ' - f'"pip help {self.name}")' - ) - - protect_pip_from_modification_on_windows( - modifying_pip="pip" in reqs_to_uninstall - ) - - for req in reqs_to_uninstall.values(): - uninstall_pathset = req.uninstall( - auto_confirm=options.yes, verbose=self.verbosity > 0, - ) - if uninstall_pathset: - uninstall_pathset.commit() - - warn_if_run_as_root() - return SUCCESS diff --git a/venv/Lib/site-packages/pip/_internal/commands/wheel.py b/venv/Lib/site-packages/pip/_internal/commands/wheel.py deleted file mode 100644 index ff47dba..0000000 --- a/venv/Lib/site-packages/pip/_internal/commands/wheel.py +++ /dev/null @@ -1,178 +0,0 @@ -import logging -import os -import shutil -from optparse import Values -from typing import List - -from pip._internal.cache import WheelCache -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.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 - -logger = logging.getLogger(__name__) - - -class WheelCommand(RequirementCommand): - """ - Build Wheel archives for your requirements and dependencies. - - Wheel is a built-package format, and offers the advantage of not - 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. - - """ - - usage = """ - %prog [options] ... - %prog [options] -r ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - def add_options(self): - # type: () -> None - - self.cmd_opts.add_option( - '-w', '--wheel-dir', - dest='wheel_dir', - metavar='dir', - default=os.curdir, - help=("Build wheels into , where the default is the " - "current working directory."), - ) - 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.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.constraints()) - self.cmd_opts.add_option(cmdoptions.editable()) - self.cmd_opts.add_option(cmdoptions.requirements()) - self.cmd_opts.add_option(cmdoptions.src()) - self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) - self.cmd_opts.add_option(cmdoptions.no_deps()) - self.cmd_opts.add_option(cmdoptions.build_dir()) - self.cmd_opts.add_option(cmdoptions.progress_bar()) - - self.cmd_opts.add_option( - '--no-verify', - dest='no_verify', - action='store_true', - default=False, - help="Don't verify if built wheel is valid.", - ) - - self.cmd_opts.add_option(cmdoptions.build_options()) - self.cmd_opts.add_option(cmdoptions.global_options()) - - self.cmd_opts.add_option( - '--pre', - action='store_true', - default=False, - help=("Include pre-release and development versions. By default, " - "pip only finds stable versions."), - ) - - self.cmd_opts.add_option(cmdoptions.require_hashes()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, self.cmd_opts) - - @with_cleanup - def run(self, options, args): - # type: (Values, List[str]) -> int - cmdoptions.check_install_build_global(options) - - session = self.get_default_session(options) - - finder = self._build_package_finder(options, session) - wheel_cache = WheelCache(options.cache_dir, options.format_control) - - options.wheel_dir = normalize_path(options.wheel_dir) - ensure_dir(options.wheel_dir) - - req_tracker = self.enter_context(get_requirement_tracker()) - - directory = TempDirectory( - delete=not options.no_clean, - kind="wheel", - globally_managed=True, - ) - - reqs = self.get_requirements(args, options, finder, session) - - preparer = self.make_requirement_preparer( - temp_build_dir=directory, - options=options, - req_tracker=req_tracker, - session=session, - finder=finder, - download_dir=options.wheel_dir, - use_user_site=False, - ) - - resolver = self.make_resolver( - preparer=preparer, - finder=finder, - options=options, - wheel_cache=wheel_cache, - ignore_requires_python=options.ignore_requires_python, - use_pep517=options.use_pep517, - ) - - self.trace_basic_info(finder) - - requirement_set = resolver.resolve( - reqs, check_supported_wheels=True - ) - - reqs_to_build = [] # type: List[InstallRequirement] - for req in requirement_set.requirements.values(): - if req.is_wheel: - preparer.save_linked_requirement(req) - elif should_build_for_wheel_command(req): - reqs_to_build.append(req) - - # build wheels - build_successes, build_failures = build( - reqs_to_build, - wheel_cache=wheel_cache, - verify=(not options.no_verify), - build_options=options.build_options or [], - global_options=options.global_options or [], - ) - for req in build_successes: - assert req.link and req.link.is_wheel - assert req.local_file_path - # copy from cache to target directory - try: - shutil.copy(req.local_file_path, options.wheel_dir) - except OSError as e: - logger.warning( - "Building wheel for %s failed: %s", - req.name, e, - ) - build_failures.append(req) - if len(build_failures) != 0: - raise CommandError( - "Failed to build one or more wheels" - ) - - return SUCCESS diff --git a/venv/Lib/site-packages/pip/_internal/configuration.py b/venv/Lib/site-packages/pip/_internal/configuration.py deleted file mode 100644 index a4698ec..0000000 --- a/venv/Lib/site-packages/pip/_internal/configuration.py +++ /dev/null @@ -1,403 +0,0 @@ -"""Configuration management setup - -Some terminology: -- name - As written in config files. -- value - Value associated with a name -- key - Name combined with it's section (section.name) -- variant - A single word describing where the configuration key-value pair came from -""" - -import configparser -import locale -import logging -import os -import sys -from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple - -from pip._internal.exceptions import ( - ConfigurationError, - ConfigurationFileCouldNotBeLoaded, -) -from pip._internal.utils import appdirs -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.misc import ensure_dir, enum - -RawConfigParser = configparser.RawConfigParser # Shorthand -Kind = NewType("Kind", str) - -CONFIG_BASENAME = 'pip.ini' if WINDOWS else 'pip.conf' -ENV_NAMES_IGNORED = "version", "help" - -# The kinds of configurations there are. -kinds = enum( - USER="user", # User Specific - GLOBAL="global", # System Wide - SITE="site", # [Virtual] Environment Specific - ENV="env", # from PIP_CONFIG_FILE - ENV_VAR="env-var", # from Environment Variables -) -OVERRIDE_ORDER = kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR -VALID_LOAD_ONLY = kinds.USER, kinds.GLOBAL, kinds.SITE - -logger = logging.getLogger(__name__) - - -# NOTE: Maybe use the optionx attribute to normalize keynames. -def _normalize_name(name): - # type: (str) -> str - """Make a name consistent regardless of source (environment or file) - """ - name = name.lower().replace('_', '-') - if name.startswith('--'): - name = name[2:] # only prefer long opts - return name - - -def _disassemble_key(name): - # type: (str) -> List[str] - if "." not in name: - error_message = ( - "Key does not contain dot separated section and key. " - "Perhaps you wanted to use 'global.{}' instead?" - ).format(name) - raise ConfigurationError(error_message) - return name.split(".", 1) - - -def get_configuration_files(): - # type: () -> Dict[Kind, List[str]] - global_config_files = [ - os.path.join(path, CONFIG_BASENAME) - for path in appdirs.site_config_dirs('pip') - ] - - site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME) - legacy_config_file = os.path.join( - os.path.expanduser('~'), - 'pip' if WINDOWS else '.pip', - CONFIG_BASENAME, - ) - new_config_file = os.path.join( - appdirs.user_config_dir("pip"), CONFIG_BASENAME - ) - return { - kinds.GLOBAL: global_config_files, - kinds.SITE: [site_config_file], - kinds.USER: [legacy_config_file, new_config_file], - } - - -class Configuration: - """Handles management of configuration. - - Provides an interface to accessing and managing configuration files. - - This class converts provides an API that takes "section.key-name" style - keys and stores the value associated with it as "key-name" under the - section "section". - - This allows for a clean interface wherein the both the section and the - key-name are preserved in an easy to manage form in the configuration files - and the data stored is also nice. - """ - - def __init__(self, isolated, load_only=None): - # type: (bool, Optional[Kind]) -> None - super().__init__() - - if load_only is not None and load_only not in VALID_LOAD_ONLY: - raise ConfigurationError( - "Got invalid value for load_only - should be one of {}".format( - ", ".join(map(repr, VALID_LOAD_ONLY)) - ) - ) - self.isolated = isolated - self.load_only = load_only - - # Because we keep track of where we got the data from - self._parsers = { - variant: [] for variant in OVERRIDE_ORDER - } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] - self._config = { - variant: {} for variant in OVERRIDE_ORDER - } # type: Dict[Kind, Dict[str, Any]] - self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] - - def load(self): - # type: () -> None - """Loads configuration from configuration files and environment - """ - self._load_config_files() - if not self.isolated: - self._load_environment_vars() - - def get_file_to_edit(self): - # type: () -> Optional[str] - """Returns the file with highest priority in configuration - """ - assert self.load_only is not None, \ - "Need to be specified a file to be editing" - - try: - return self._get_parser_to_modify()[0] - except IndexError: - return None - - def items(self): - # type: () -> Iterable[Tuple[str, Any]] - """Returns key-value pairs like dict.items() representing the loaded - configuration - """ - return self._dictionary.items() - - def get_value(self, key): - # type: (str) -> Any - """Get a value from the configuration. - """ - try: - return self._dictionary[key] - except KeyError: - raise ConfigurationError(f"No such key - {key}") - - def set_value(self, key, value): - # type: (str, Any) -> None - """Modify a value in the configuration. - """ - self._ensure_have_load_only() - - assert self.load_only - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - - # Modify the parser and the configuration - if not parser.has_section(section): - parser.add_section(section) - parser.set(section, name, value) - - self._config[self.load_only][key] = value - self._mark_as_modified(fname, parser) - - def unset_value(self, key): - # type: (str) -> None - """Unset a value in the configuration.""" - 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}") - - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - if not (parser.has_section(section) - and parser.remove_option(section, name)): - # The option was not removed. - raise ConfigurationError( - "Fatal Internal error [id=1]. Please report as a bug." - ) - - # The section may be empty after the option was removed. - if not parser.items(section): - parser.remove_section(section) - self._mark_as_modified(fname, parser) - - del self._config[self.load_only][key] - - def save(self): - # type: () -> None - """Save the current in-memory state. - """ - self._ensure_have_load_only() - - for fname, parser in self._modified_parsers: - logger.info("Writing to %s", fname) - - # Ensure directory exists. - ensure_dir(os.path.dirname(fname)) - - with open(fname, "w") as f: - parser.write(f) - - # - # Private routines - # - - def _ensure_have_load_only(self): - # type: () -> None - if self.load_only is None: - raise ConfigurationError("Needed a specific file to be modifying.") - logger.debug("Will be working with %s variant only", self.load_only) - - @property - def _dictionary(self): - # type: () -> Dict[str, Any] - """A dictionary representing the loaded configuration. - """ - # NOTE: Dictionaries are not populated if not loaded. So, conditionals - # are not needed here. - retval = {} - - for variant in OVERRIDE_ORDER: - retval.update(self._config[variant]) - - return retval - - def _load_config_files(self): - # type: () -> None - """Loads configuration from configuration files - """ - config_files = dict(self.iter_config_files()) - if config_files[kinds.ENV][0:1] == [os.devnull]: - logger.debug( - "Skipping loading configuration files due to " - "environment's PIP_CONFIG_FILE being os.devnull" - ) - return - - for variant, files in config_files.items(): - for fname in files: - # If there's specific variant set in `load_only`, load only - # that variant, not the others. - if self.load_only is not None and variant != self.load_only: - logger.debug( - "Skipping file '%s' (variant: %s)", fname, variant - ) - continue - - parser = self._load_file(variant, fname) - - # Keeping track of the parsers used - self._parsers[variant].append((fname, parser)) - - def _load_file(self, variant, fname): - # type: (Kind, str) -> RawConfigParser - logger.debug("For variant '%s', will try loading '%s'", variant, fname) - parser = self._construct_parser(fname) - - for section in parser.sections(): - items = parser.items(section) - self._config[variant].update(self._normalized_keys(section, items)) - - return parser - - def _construct_parser(self, fname): - # type: (str) -> RawConfigParser - parser = configparser.RawConfigParser() - # If there is no such file, don't bother reading it but create the - # parser anyway, to hold the data. - # Doing this is useful when modifying and saving files, where we don't - # need to construct a parser. - if os.path.exists(fname): - try: - parser.read(fname) - except UnicodeDecodeError: - # See https://github.com/pypa/pip/issues/4963 - raise ConfigurationFileCouldNotBeLoaded( - reason="contains invalid {} characters".format( - locale.getpreferredencoding(False) - ), - fname=fname, - ) - except configparser.Error as error: - # See https://github.com/pypa/pip/issues/4893 - raise ConfigurationFileCouldNotBeLoaded(error=error) - return parser - - def _load_environment_vars(self): - # type: () -> None - """Loads configuration from environment variables - """ - self._config[kinds.ENV_VAR].update( - self._normalized_keys(":env:", self.get_environ_vars()) - ) - - def _normalized_keys(self, section, items): - # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] - """Normalizes items to construct a dictionary with normalized keys. - - This routine is where the names become keys and are made the same - regardless of source - configuration files or environment. - """ - normalized = {} - for name, val in items: - key = section + "." + _normalize_name(name) - normalized[key] = val - return normalized - - def get_environ_vars(self): - # type: () -> Iterable[Tuple[str, str]] - """Returns a generator with all environmental vars with prefix PIP_""" - for key, val in os.environ.items(): - if key.startswith("PIP_"): - name = key[4:].lower() - if name not in ENV_NAMES_IGNORED: - yield name, val - - # XXX: This is patched in the tests. - def iter_config_files(self): - # type: () -> Iterable[Tuple[Kind, List[str]]] - """Yields variant and configuration files associated with it. - - This should be treated like items of a dictionary. - """ - # SMELL: Move the conditions out of this function - - # environment variables have the lowest priority - config_file = os.environ.get('PIP_CONFIG_FILE', None) - if config_file is not None: - yield kinds.ENV, [config_file] - else: - yield kinds.ENV, [] - - config_files = get_configuration_files() - - # at the base we have any global configuration - yield kinds.GLOBAL, config_files[kinds.GLOBAL] - - # per-user configuration next - should_load_user_config = not self.isolated and not ( - config_file and os.path.exists(config_file) - ) - if should_load_user_config: - # The legacy config file is overridden by the new config file - yield kinds.USER, config_files[kinds.USER] - - # finally virtualenv configuration first trumping others - yield kinds.SITE, config_files[kinds.SITE] - - def get_values_in_config(self, variant): - # type: (Kind) -> Dict[str, Any] - """Get values present in a config file""" - return self._config[variant] - - def _get_parser_to_modify(self): - # type: () -> Tuple[str, RawConfigParser] - # Determine which parser to modify - assert self.load_only - parsers = self._parsers[self.load_only] - if not parsers: - # This should not happen if everything works correctly. - raise ConfigurationError( - "Fatal Internal error [id=2]. Please report as a bug." - ) - - # Use the highest priority parser. - return parsers[-1] - - # XXX: This is patched in the tests. - def _mark_as_modified(self, fname, parser): - # type: (str, RawConfigParser) -> None - file_parser_tuple = (fname, parser) - if file_parser_tuple not in self._modified_parsers: - self._modified_parsers.append(file_parser_tuple) - - def __repr__(self): - # type: () -> str - return f"{self.__class__.__name__}({self._dictionary!r})" diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__init__.py b/venv/Lib/site-packages/pip/_internal/distributions/__init__.py deleted file mode 100644 index a222f24..0000000 --- a/venv/Lib/site-packages/pip/_internal/distributions/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.distributions.sdist import SourceDistribution -from pip._internal.distributions.wheel import WheelDistribution -from pip._internal.req.req_install import InstallRequirement - - -def make_distribution_for_install_requirement(install_req): - # type: (InstallRequirement) -> AbstractDistribution - """Returns a Distribution for the given InstallRequirement""" - # Editable requirements will always be source distributions. They use the - # legacy logic until we create a modern standard for them. - if install_req.editable: - return SourceDistribution(install_req) - - # If it's a wheel, it's a WheelDistribution - if install_req.is_wheel: - return WheelDistribution(install_req) - - # Otherwise, a SourceDistribution - return SourceDistribution(install_req) diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index de1a2e06af90b452c7cda67f892776a1f79dacf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 zcmaJD-xS!i2&*PcrCyV|4U4pAs&&B76kl!I0uL&k6XzmzYMJlR@rUj)T zo~VhAifD)_9TwKRGR(w_@qvN&L&Q^Rh9B zA1<2CF5wP(@M#60?tq6MjPpXNGdS<01r5e8X=s1FLL8XCMRP~!F3DG7AA5R9e$Yk8 zCibb1uCgtf(eJO$z<1WTRHWmH>6gZ)eg$bQH(=8H!?S6hKqb8>6Wzkkgt*nnzU*4n1FLThPi)?WBkV|Xn+tAz&cTCoI%qc=>+ zk~!(&B|>XagJZ318JEU`HA1m!q^V;ZH>Br0Z!h{xi#71^KF4ce!JuTIwUu&?+}!Xi z;u%e%V0I6&kJ(O<;<)@~Tt05+@=`dkLHFXtLuGC_6=Zt2?!SKhv)lcUY>u`iZ)5B= cP#km}xp0di}g-g&qqQe*c1F|&WJ^%m! diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc deleted file mode 100644 index db401db1094e87553aa6f11da9a1e76e0e180969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1823 zcmaJ?!EPHj5GA!MX{AVUo2G{rNV6ykGy-BB+FKA5b7cOv{-D9Mo$!!(wjAvv5kGjAw99uEnOTHob=$AtWY%J%4j z@;!X+DNKS0s!4|bJDQfAtV2XbS}X1$2$Ez}kgOwU7QH2NDmo%MPqJ8ck9#5(-E;DWX8oWApr9ph zNldZ|%%r8H*1Z&*a+MK!vEAwy)3toNg)52IQ3$M>suveCqsrH+CVY$F#PEOXK!7Bz>uWI4aQ{|VblfJ2U zV!3~bjcaE%05|U6$Eoa&ak$hpev>^+2Ny!EsIj@^62d(MgwZ;P5H8}*RG2Q?RQq1R zl906o&QyhxZgO4n3NZGN%XGWKshJ%^dQ$naHV&bHs|^M|Gbd03>AB#ZPs4Hngt#0i zl4~`~o$_*j zlfArFbq*eZHPCjs*y=f#Bde$NnH_-h&oKgc8z7z`eRb!mUYKs67ZlH}2g>+8g3ngNk)r8A8!q+{Ed z@4^`u3J|^e_DYP`+ZUS$1MUe$yAHYi2o6o6fV1t*!@Jb(%^IZzQ_g6Pgnd7NJGGTH zw{izI+feAME&ShHiT_&j$q@O2oeumNGFBSVXp~2cy=b^z@AMfHreG`-wvG6#Xm9fM z;|55UM%Y^b#C{4>J6=<+kXnPuyLyc92o}ZmV8Y5eTuNxXH|oZ87{@g1z*9ZI_yTb! zH!L!#?fJ7BxN5Oh?Poy3DFcEEW2ZaCwOEh#%do#8=@b+Fa=KH!e{c;KUZ5Lznaq$|5KER0+?nqKP ziQ`!8O1Jb9ug9MB%Skfnu`h#inoJ$?f$#|r&Iu1-^219)K0PAK@DJWZmQELbYK*8W zCK1mMgf>cKt=+-({+kTfEI0q{FFv#Ugca~!R2)=pZyFm`Fk~Ac0FpSIBrbOnkGtGE zCyCE}KEXd`g_%sd`yVT9n3TZB@0|Vo0*wL$%cI}ab}<{IzTD*>ElTjbH#AXgVe-NEp`^4*J+!vZWz#mZ7tMcQo5x~^y;Oj@uKsKzoO-9WWTrN~k(3_RUcuG2;|DHW9gh03LTB%4mJ zh>DwS_ox6vo0EbflXa_d&~zMq&sJgeBJSDq8)b-ZzaaPQ;hkB0#f|M*PL7D0BIrwB zddjwW7p(fe>F#E&kemu#%U+8IkH?PJJg>d$UY{nqn`%b*J> ztt{8Hn^9WUypc@uu+~?QDu`=0Zw~3v<0E#2ch5Z9WM8} zz-$|oSXrXG2dG_4QCD88_?j}x^4CSZ|5Dp{td@>5ra@U|yC>JfETiAzU4PJlU^T(O YK8c$$?!uQt#jmVneJjsh{G7S>4{_5=TmS$7 diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc deleted file mode 100644 index bc2433aa6d3c47b6a526f1cace1aa31224ec5e55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3431 zcmbtX-H#hd5$~QEkH=o`u6MH>%SZ0|atFdF3|YkSaSG895>A|86|pA}Bg15Ny4O3K z`AYYAlXYw!ZX;cIK!6KoZP7Zn zgG-zqklxzAK?kzmv$TC6D&6>SSf-*!b>~*1Dw!M(tE9+b+`TzWQhqx>O=OX0BClX> z=ck9j6UEg_yj#D>RTZUagllh0Sx8`BzZ1pxqJj8%l5>F*Uz5W;7czX1RL7wz6Enz! zQot0WQp=A8gZJQ7--1SvfN~O8oCY?xxc!&}4tID1z76j3CVXA)fpIOpeNYT#ES41< z{o~i7ltO_GibYHr2F91n_1kR*&xgl?0b?0SV+d1~DA`dVS#=DnSuO-uEE844qbgbu zSXrB?SXHn?VFV2X*cnxVUu6P}6_O2Ak`LIO+jrPIdp~3#vYr4MOT{3H&)8ihs$uDu zXG{zRVUiyecYPx)rr?3agMD<(&)`)Ex-mH+Q#vCDMIFI80jw(!4Q6pY=Yt)Ev0gj#{H&B*)WWcXC4>6ct ztOz#LaWTA@5$1I2ri<$?F9a@o_d@ztfyEp?vDk@kQ0hNWrOpdTz}q z(&}A4`2%pR^VT_?)Ur1w?$|Y2{T;O$yVK2aV@5yO1^Mo@J0p|kZ{ds`_?<(N&AWR< z{qq`}JN|wL@8_t`mZ@{w8sp{*8~#G&x50{bZN;1et#|ku@1XUFsowhjii;7Z=;ll4 z;vYc6>BJgaCukTQLoJv>V&l$ZQrRGw-hy{VdE?La#IBsNeNI1u6bNG7{ZVjGWP%w; zF)m60`8AIdp-f781PNf6NP#JP!r~%7N|U%^m~`2r#SmiNq~XcC>=73#mPv`Jd*Y9* zt869VARCmE*XLc?t=)D34b{TTGug+J}l*pJ=`0Wa4h%v=*}yU{&Gb6*V7`7 zQgy=*Wt2eZE(}*MC>P>EqqQZc>F$Dg;U&GcwX$O5@fw<9?c}e^3J9|H3YFL)W4Q$DsYV`eI zCCZe)8nMeXKnc6Zv_589gW+!|e{{F5#wG_dUI4oDqGGBPadLFVqPa4MP<#RZS6P&E z28D^mQI32^a2sJr#Hwu4byXCpGC(Yb6~i4GX3^-a_eE8qc`J%xF~^+E9vlmij&`w9 z&o^6%Iql{MhII7CvZHFPRv3F*HD0za?1j>3B2~!-9HMU3H3Dj`-kAr-f&*h&>FxMf z#P?R`zO<|~l&aA1Xg4he10i+uK_qjqO)}iU&Z1H~aKVxCO&Cke_^w+T(FO&@d!(pweaZS&wk%|>veiNG>ifv}~p=)<8q`BAt6u7TyV84y* zSnwp`7#FLX&=6~5+oK(;O+D&8cWjTk&pjK;96%gF?mTks?_I7j=PXz3JCIm{C1zOt6~L|^!i9?$(qFkYNlbkD z%Z9$Vbom!hsiA|&_b;ww{_>?k`G=7b(nTS=t8C(7EKJ&0CT-~}t7N>nJoM+czOcT? zNHj~ozRC#y7*gfGfK8377J%lL28Hs+ut@sYpd()8H|<@ooqq!_xM~|3k9Mt&g$HYX HR@?qB-+1!^ diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc deleted file mode 100644 index d684c2cb32583ba72c5931974b10ce727a8399f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1512 zcmaJ>&5j&35VregdUlx2hMxl*AQsAHB+>*4aX<(K1%iaoDoP@)XtiWKZO=?6?sl*3 z*)XGU$>xf92W~t7FVj~}yaE@fa&K0>LByl3Dcj|8)%Shf;_z@rV08M1_#+|YPn?Vg ztdTqLxcguvkyMk07L=kN>8Oc|IQX$nnzTrRpXf=G6}ORzA~0S-6*9iyl^}snB0NKF))f0RFWc+w1{OS;}@hzWFk}e zPvry(&iXe`FwMA@{pkbM!M&>WjtLg7VdLBL*^I$>w5c7FMmg3R&swD<6YY+{(N0)_ z-7?{Z6kf2EHBDF<5Lf}7tZu!5h{o6*G%J}^ersERDYSv8jFE)X!n3Udh-&{) zfXOPotJ^gLaPYEGYGW^RSarGupc-Icz$d^Bl9&mt%~R0UXP+J~(msa3{z#ijXpZIa zPWVlqw4zZKQM3~ObW(yN~Ce<$`Dto*(C=JQgjGo?*ecGj$|Xc{Q0>~?-*TE4D* zxrQ9v0Y|DlQ|(!)>t*R`uWli2pi)tu=G9P>fwabG* ef;>Z&qi#ZT0sH9}10-J}n+}^pjm# None - super().__init__() - self.req = req - - @abc.abstractmethod - def get_pkg_resources_distribution(self): - # type: () -> Optional[Distribution] - raise NotImplementedError() - - @abc.abstractmethod - def prepare_distribution_metadata(self, finder, build_isolation): - # type: (PackageFinder, bool) -> None - raise NotImplementedError() diff --git a/venv/Lib/site-packages/pip/_internal/distributions/installed.py b/venv/Lib/site-packages/pip/_internal/distributions/installed.py deleted file mode 100644 index b19dfac..0000000 --- a/venv/Lib/site-packages/pip/_internal/distributions/installed.py +++ /dev/null @@ -1,22 +0,0 @@ -from typing import Optional - -from pip._vendor.pkg_resources import Distribution - -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.index.package_finder import PackageFinder - - -class InstalledDistribution(AbstractDistribution): - """Represents an installed package. - - This does not need any preparation as the required information has already - been computed. - """ - - def get_pkg_resources_distribution(self): - # type: () -> Optional[Distribution] - return self.req.satisfied_by - - def prepare_distribution_metadata(self, finder, build_isolation): - # type: (PackageFinder, bool) -> None - pass diff --git a/venv/Lib/site-packages/pip/_internal/distributions/sdist.py b/venv/Lib/site-packages/pip/_internal/distributions/sdist.py deleted file mode 100644 index c873a9f..0000000 --- a/venv/Lib/site-packages/pip/_internal/distributions/sdist.py +++ /dev/null @@ -1,95 +0,0 @@ -import logging -from typing import Set, Tuple - -from pip._vendor.pkg_resources import Distribution - -from pip._internal.build_env import BuildEnvironment -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.exceptions import InstallationError -from pip._internal.index.package_finder import PackageFinder -from pip._internal.utils.subprocess import runner_with_spinner_message - -logger = logging.getLogger(__name__) - - -class SourceDistribution(AbstractDistribution): - """Represents a source distribution. - - The preparation step for these needs metadata for the packages to be - generated, either using PEP 517 or using the legacy `setup.py egg_info`. - """ - - def get_pkg_resources_distribution(self): - # type: () -> Distribution - return self.req.get_dist() - - def prepare_distribution_metadata(self, finder, build_isolation): - # type: (PackageFinder, bool) -> None - # Load pyproject.toml, to determine whether PEP 517 is to be used - self.req.load_pyproject_toml() - - # Set up the build isolation, if this requirement should be isolated - should_isolate = self.req.use_pep517 and build_isolation - if should_isolate: - self._setup_isolation(finder) - - self.req.prepare_metadata() - - def _setup_isolation(self, finder): - # type: (PackageFinder) -> None - def _raise_conflicts(conflicting_with, conflicting_reqs): - # type: (str, Set[Tuple[str, str]]) -> None - format_string = ( - "Some build dependencies for {requirement} " - "conflict with {conflicting_with}: {description}." - ) - error_message = format_string.format( - requirement=self.req, - conflicting_with=conflicting_with, - description=", ".join( - f"{installed} is incompatible with {wanted}" - for installed, wanted in sorted(conflicting) - ), - ) - raise InstallationError(error_message) - - # Isolate in a BuildEnvironment and install the build-time - # requirements. - pyproject_requires = self.req.pyproject_requires - assert pyproject_requires is not None - - self.req.build_env = BuildEnvironment() - self.req.build_env.install_requirements( - finder, pyproject_requires, "overlay", "Installing build dependencies" - ) - conflicting, missing = self.req.build_env.check_requirements( - self.req.requirements_to_check - ) - if conflicting: - _raise_conflicts("PEP 517/518 supported requirements", conflicting) - if missing: - logger.warning( - "Missing build requirements in pyproject.toml for %s.", - self.req, - ) - logger.warning( - "The project does not specify a build backend, and " - "pip cannot fall back to setuptools without %s.", - " and ".join(map(repr, sorted(missing))), - ) - # Install any extra build dependencies that the backend requests. - # This must be done in a second pass, as the pyproject.toml - # dependencies must be installed before we can call the backend. - with self.req.build_env: - runner = runner_with_spinner_message("Getting requirements to build wheel") - backend = self.req.pep517_backend - assert backend is not None - with backend.subprocess_runner(runner): - reqs = backend.get_requires_for_build_wheel() - - conflicting, missing = self.req.build_env.check_requirements(reqs) - if conflicting: - _raise_conflicts("the backend dependencies", conflicting) - self.req.build_env.install_requirements( - finder, missing, "normal", "Installing backend dependencies" - ) diff --git a/venv/Lib/site-packages/pip/_internal/distributions/wheel.py b/venv/Lib/site-packages/pip/_internal/distributions/wheel.py deleted file mode 100644 index d038479..0000000 --- a/venv/Lib/site-packages/pip/_internal/distributions/wheel.py +++ /dev/null @@ -1,34 +0,0 @@ -from zipfile import ZipFile - -from pip._vendor.pkg_resources import Distribution - -from pip._internal.distributions.base import AbstractDistribution -from pip._internal.index.package_finder import PackageFinder -from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel - - -class WheelDistribution(AbstractDistribution): - """Represents a wheel distribution. - - This does not need any preparation as wheels can be directly unpacked. - """ - - def get_pkg_resources_distribution(self): - # type: () -> Distribution - """Loads the metadata from the wheel file into memory and returns a - Distribution that uses it, not relying on the wheel file or - requirement. - """ - # Set as part of preparation during download. - assert self.req.local_file_path - # Wheels are never unnamed. - assert self.req.name - - with ZipFile(self.req.local_file_path, allowZip64=True) as z: - return pkg_resources_distribution_for_wheel( - z, self.req.name, self.req.local_file_path - ) - - def prepare_distribution_metadata(self, finder, build_isolation): - # type: (PackageFinder, bool) -> None - pass diff --git a/venv/Lib/site-packages/pip/_internal/exceptions.py b/venv/Lib/site-packages/pip/_internal/exceptions.py deleted file mode 100644 index 8aacf81..0000000 --- a/venv/Lib/site-packages/pip/_internal/exceptions.py +++ /dev/null @@ -1,397 +0,0 @@ -"""Exceptions used throughout package""" - -import configparser -from itertools import chain, groupby, repeat -from typing import TYPE_CHECKING, Dict, List, Optional - -from pip._vendor.pkg_resources import Distribution -from pip._vendor.requests.models import Request, Response - -if TYPE_CHECKING: - from hashlib import _Hash - - from pip._internal.req.req_install import InstallRequirement - - -class PipError(Exception): - """Base pip exception""" - - -class ConfigurationError(PipError): - """General exception in configuration""" - - -class InstallationError(PipError): - """General exception during installation""" - - -class UninstallationError(PipError): - """General exception during uninstallation""" - - -class NoneMetadataError(PipError): - """ - Raised when accessing "METADATA" or "PKG-INFO" metadata for a - pip._vendor.pkg_resources.Distribution object and - `dist.has_metadata('METADATA')` returns True but - `dist.get_metadata('METADATA')` returns None (and similarly for - "PKG-INFO"). - """ - - def __init__(self, dist, metadata_name): - # type: (Distribution, str) -> None - """ - :param dist: A Distribution object. - :param metadata_name: The name of the metadata being accessed - (can be "METADATA" or "PKG-INFO"). - """ - self.dist = dist - self.metadata_name = metadata_name - - def __str__(self): - # type: () -> str - # Use `dist` in the error message because its stringification - # includes more information, like the version and location. - return ( - 'None {} metadata found for distribution: {}'.format( - self.metadata_name, self.dist, - ) - ) - - -class UserInstallationInvalid(InstallationError): - """A --user install is requested on an environment without user site.""" - - def __str__(self): - # type: () -> str - return "User base directory is not specified" - - -class InvalidSchemeCombination(InstallationError): - def __str__(self): - # type: () -> str - before = ", ".join(str(a) for a in self.args[:-1]) - return f"Cannot set {before} and {self.args[-1]} together" - - -class DistributionNotFound(InstallationError): - """Raised when a distribution cannot be found to satisfy a requirement""" - - -class RequirementsFileParseError(InstallationError): - """Raised when a general error occurs parsing a requirements file line.""" - - -class BestVersionAlreadyInstalled(PipError): - """Raised when the most up-to-date version of a package is already - installed.""" - - -class BadCommand(PipError): - """Raised when virtualenv or a command is not found""" - - -class CommandError(PipError): - """Raised when there is an error in command-line arguments""" - - -class PreviousBuildDirError(PipError): - """Raised when there's a previous conflicting build directory""" - - -class NetworkConnectionError(PipError): - """HTTP connection error""" - - def __init__(self, error_msg, response=None, request=None): - # type: (str, Response, Request) -> None - """ - Initialize NetworkConnectionError with `request` and `response` - objects. - """ - self.response = response - self.request = request - self.error_msg = error_msg - if (self.response is not None and not self.request and - hasattr(response, 'request')): - self.request = self.response.request - super().__init__(error_msg, response, request) - - def __str__(self): - # type: () -> str - return str(self.error_msg) - - -class InvalidWheelFilename(InstallationError): - """Invalid wheel filename.""" - - -class UnsupportedWheel(InstallationError): - """Unsupported wheel.""" - - -class MetadataInconsistent(InstallationError): - """Built metadata contains inconsistent information. - - This is raised when the metadata contains values (e.g. name and version) - that do not match the information previously obtained from sdist filename - or user-supplied ``#egg=`` value. - """ - def __init__(self, ireq, field, f_val, m_val): - # type: (InstallRequirement, str, str, str) -> None - self.ireq = ireq - self.field = field - self.f_val = f_val - self.m_val = m_val - - def __str__(self): - # type: () -> str - template = ( - "Requested {} has inconsistent {}: " - "filename has {!r}, but metadata has {!r}" - ) - return template.format(self.ireq, self.field, self.f_val, self.m_val) - - -class InstallationSubprocessError(InstallationError): - """A subprocess call failed during installation.""" - def __init__(self, returncode, description): - # type: (int, str) -> None - self.returncode = returncode - self.description = description - - def __str__(self): - # type: () -> str - return ( - "Command errored out with exit status {}: {} " - "Check the logs for full command output." - ).format(self.returncode, self.description) - - -class HashErrors(InstallationError): - """Multiple HashError instances rolled into one for reporting""" - - def __init__(self): - # type: () -> None - self.errors = [] # type: List[HashError] - - def append(self, error): - # type: (HashError) -> None - self.errors.append(error) - - def __str__(self): - # type: () -> str - lines = [] - self.errors.sort(key=lambda e: e.order) - for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): - lines.append(cls.head) - lines.extend(e.body() for e in errors_of_cls) - if lines: - return '\n'.join(lines) - return '' - - def __nonzero__(self): - # type: () -> bool - return bool(self.errors) - - def __bool__(self): - # type: () -> bool - return self.__nonzero__() - - -class HashError(InstallationError): - """ - A failure to verify a package against known-good hashes - - :cvar order: An int sorting hash exception classes by difficulty of - recovery (lower being harder), so the user doesn't bother fretting - about unpinned packages when he has deeper issues, like VCS - dependencies, to deal with. Also keeps error reports in a - deterministic order. - :cvar head: A section heading for display above potentially many - exceptions of this kind - :ivar req: The InstallRequirement that triggered this error. This is - pasted on after the exception is instantiated, because it's not - typically available earlier. - - """ - req = None # type: Optional[InstallRequirement] - head = '' - order = -1 # type: int - - def body(self): - # type: () -> str - """Return a summary of me for display under the heading. - - This default implementation simply prints a description of the - triggering requirement. - - :param req: The InstallRequirement that provoked this error, with - its link already populated by the resolver's _populate_link(). - - """ - return f' {self._requirement_name()}' - - def __str__(self): - # type: () -> str - return f'{self.head}\n{self.body()}' - - def _requirement_name(self): - # type: () -> str - """Return a description of the requirement that triggered me. - - This default implementation returns long description of the req, with - line numbers - - """ - return str(self.req) if self.req else 'unknown package' - - -class VcsHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 0 - head = ("Can't verify hashes for these requirements because we don't " - "have a way to hash version control repositories:") - - -class DirectoryUrlHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 1 - head = ("Can't verify hashes for these file:// requirements because they " - "point to directories:") - - -class HashMissing(HashError): - """A hash was needed for a requirement but is absent.""" - - order = 2 - head = ('Hashes are required in --require-hashes mode, but they are ' - 'missing from some requirements. Here is a list of those ' - 'requirements along with the hashes their downloaded archives ' - 'actually had. Add lines like these to your requirements files to ' - 'prevent tampering. (If you did not enable --require-hashes ' - 'manually, note that it turns on automatically when any package ' - 'has a hash.)') - - def __init__(self, gotten_hash): - # type: (str) -> None - """ - :param gotten_hash: The hash of the (possibly malicious) archive we - just downloaded - """ - self.gotten_hash = gotten_hash - - def body(self): - # type: () -> str - # Dodge circular import. - from pip._internal.utils.hashes import FAVORITE_HASH - - package = None - if self.req: - # In the case of URL-based requirements, display the original URL - # seen in the requirements file rather than the package name, - # so the output can be directly copied into the requirements file. - package = (self.req.original_link if self.req.original_link - # In case someone feeds something downright stupid - # to InstallRequirement's constructor. - else getattr(self.req, 'req', None)) - return ' {} --hash={}:{}'.format(package or 'unknown package', - FAVORITE_HASH, - self.gotten_hash) - - -class HashUnpinned(HashError): - """A requirement had a hash specified but was not pinned to a specific - version.""" - - order = 3 - head = ('In --require-hashes mode, all requirements must have their ' - 'versions pinned with ==. These do not:') - - -class HashMismatch(HashError): - """ - Distribution file hash values don't match. - - :ivar package_name: The name of the package that triggered the hash - mismatch. Feel free to write to this after the exception is raise to - improve its error message. - - """ - order = 4 - head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' - 'FILE. If you have updated the package versions, please update ' - 'the hashes. Otherwise, examine the package contents carefully; ' - 'someone may have tampered with them.') - - def __init__(self, allowed, gots): - # type: (Dict[str, List[str]], Dict[str, _Hash]) -> None - """ - :param allowed: A dict of algorithm names pointing to lists of allowed - hex digests - :param gots: A dict of algorithm names pointing to hashes we - actually got from the files under suspicion - """ - self.allowed = allowed - self.gots = gots - - def body(self): - # type: () -> str - return ' {}:\n{}'.format(self._requirement_name(), - self._hash_comparison()) - - def _hash_comparison(self): - # type: () -> str - """ - Return a comparison of actual and expected hash values. - - Example:: - - Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde - or 123451234512345123451234512345123451234512345 - Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef - - """ - def hash_then_or(hash_name): - # type: (str) -> chain[str] - # For now, all the decent hashes have 6-char names, so we can get - # away with hard-coding space literals. - return chain([hash_name], repeat(' or')) - - lines = [] # type: List[str] - for hash_name, expecteds in self.allowed.items(): - prefix = hash_then_or(hash_name) - lines.extend((' Expected {} {}'.format(next(prefix), e)) - for e in expecteds) - lines.append(' Got {}\n'.format( - self.gots[hash_name].hexdigest())) - return '\n'.join(lines) - - -class UnsupportedPythonVersion(InstallationError): - """Unsupported python version according to Requires-Python package - metadata.""" - - -class ConfigurationFileCouldNotBeLoaded(ConfigurationError): - """When there are errors while loading a configuration file - """ - - def __init__(self, reason="could not be loaded", fname=None, error=None): - # type: (str, Optional[str], Optional[configparser.Error]) -> None - super().__init__(error) - self.reason = reason - self.fname = fname - self.error = error - - def __str__(self): - # type: () -> str - if self.fname is not None: - message_part = f" in {self.fname}." - else: - assert self.error is not None - message_part = f".\n{self.error}\n" - return f"Configuration file {self.reason}{message_part}" diff --git a/venv/Lib/site-packages/pip/_internal/index/__init__.py b/venv/Lib/site-packages/pip/_internal/index/__init__.py deleted file mode 100644 index 7a17b7b..0000000 --- a/venv/Lib/site-packages/pip/_internal/index/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""Index interaction code -""" diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 8a6e2c6fdb5547a33f2f7b126b96506f99792ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmYjLF$w}P5X{*qg0-F6TId5r#KywL#!eQNm@IKImxQ}`s6X;cwm!km$~`LwW|kRP zX7pgtSAyindL;MNntv2x*220cV%0&}Vy~v1`*0g9T_+qeRoY~ZVPc}C{%%@4yNEU# z#D}Un^7WIC*(|_PLp~-*RdkguOAZdwEuUgQ#~GY13G1W{K|`Sd&qt^^(@dhXc2q;+ f1o-O=+5@)}043mzI8V1{Z&^lr@w94ZzlG`xIPyW~ diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-39.pyc deleted file mode 100644 index 1fa4503fc97159a36665c93ae22ff50b14e7ebc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15081 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 QdDQx>GG3`vzByg|zwxLiM*si- diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc deleted file mode 100644 index 0fecf89ae722b5cfa5e512702cfc6f31c3cf328e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26608 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 S$*I|?<47&w%fGSWf&T*oHj01% diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc deleted file mode 100644 index 5dee4e2ee21293f4f411410e5ed18ead13ad4652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7190 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 M!%#Z`-Ov2(-$Wfwx&QzG diff --git a/venv/Lib/site-packages/pip/_internal/index/collector.py b/venv/Lib/site-packages/pip/_internal/index/collector.py deleted file mode 100644 index 0721e36..0000000 --- a/venv/Lib/site-packages/pip/_internal/index/collector.py +++ /dev/null @@ -1,556 +0,0 @@ -""" -The main purpose of this module is to expose LinkCollector.collect_sources(). -""" - -import cgi -import collections -import functools -import html -import itertools -import logging -import os -import re -import urllib.parse -import urllib.request -import xml.etree.ElementTree -from optparse import Values -from typing import ( - Callable, - Iterable, - List, - MutableMapping, - NamedTuple, - Optional, - Sequence, - Union, -) - -from pip._vendor import html5lib, requests -from pip._vendor.requests import Response -from pip._vendor.requests.exceptions import RetryError, SSLError - -from pip._internal.exceptions import NetworkConnectionError -from pip._internal.models.link import Link -from pip._internal.models.search_scope import SearchScope -from pip._internal.network.session import PipSession -from pip._internal.network.utils import raise_for_status -from pip._internal.utils.filetypes import is_archive_file -from pip._internal.utils.misc import pairwise, redact_auth_from_url -from pip._internal.vcs import vcs - -from .sources import CandidatesFromPage, LinkSource, build_source - -logger = logging.getLogger(__name__) - -HTMLElement = xml.etree.ElementTree.Element -ResponseHeaders = MutableMapping[str, str] - - -def _match_vcs_scheme(url): - # type: (str) -> Optional[str] - """Look for VCS schemes in the URL. - - Returns the matched VCS scheme, or None if there's no match. - """ - for scheme in vcs.schemes: - if url.lower().startswith(scheme) and url[len(scheme)] in '+:': - return scheme - return None - - -class _NotHTML(Exception): - def __init__(self, content_type, request_desc): - # type: (str, str) -> None - super().__init__(content_type, request_desc) - self.content_type = content_type - self.request_desc = request_desc - - -def _ensure_html_header(response): - # type: (Response) -> None - """Check the Content-Type header to ensure the response contains HTML. - - Raises `_NotHTML` if the content type is not text/html. - """ - content_type = response.headers.get("Content-Type", "") - if not content_type.lower().startswith("text/html"): - raise _NotHTML(content_type, response.request.method) - - -class _NotHTTP(Exception): - pass - - -def _ensure_html_response(url, session): - # type: (str, PipSession) -> None - """Send a HEAD request to the URL, and ensure the response contains HTML. - - Raises `_NotHTTP` if the URL is not available for a HEAD request, or - `_NotHTML` if the content type is not text/html. - """ - scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url) - if scheme not in {'http', 'https'}: - raise _NotHTTP() - - resp = session.head(url, allow_redirects=True) - raise_for_status(resp) - - _ensure_html_header(resp) - - -def _get_html_response(url, session): - # type: (str, PipSession) -> Response - """Access an HTML page 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. - 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. - """ - if is_archive_file(Link(url).filename): - _ensure_html_response(url, session=session) - - logger.debug('Getting page %s', redact_auth_from_url(url)) - - resp = session.get( - url, - headers={ - "Accept": "text/html", - # We don't want to blindly returned cached data for - # /simple/, because authors generally expecting that - # twine upload && pip install will function, but if - # they've done a pip install in the last ~10 minutes - # it won't. Thus by setting this to zero we will not - # blindly use any cached data, however the benefit of - # using max-age=0 instead of no-cache, is that we will - # still support conditional requests, so we will still - # minimize traffic sent in cases where the page hasn't - # changed at all, we will just always incur the round - # trip for the conditional GET now instead of only - # once per 10 minutes. - # For more information, please see pypa/pip#5670. - "Cache-Control": "max-age=0", - }, - ) - raise_for_status(resp) - - # 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) - - return resp - - -def _get_encoding_from_headers(headers): - # type: (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'] - return None - - -def _determine_base_url(document, page_url): - # type: (HTMLElement, 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. - """ - 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): - # type: (str) -> str - """ - Clean a "part" of a URL path (i.e. after splitting on "@" characters). - """ - # We unquote prior to quoting to make sure nothing is double quoted. - return urllib.parse.quote(urllib.parse.unquote(part)) - - -def _clean_file_url_path(part): - # type: (str) -> str - """ - Clean the first part of a URL path that corresponds to a local - filesystem path (i.e. the first part after splitting on "@" characters). - """ - # We unquote prior to quoting to make sure nothing is double quoted. - # Also, on Windows the path part might contain a drive letter which - # should not be quoted. On Linux where drive letters do not - # exist, the colon should be quoted. We rely on urllib.request - # to do the right thing here. - return urllib.request.pathname2url(urllib.request.url2pathname(part)) - - -# percent-encoded: / -_reserved_chars_re = re.compile('(@|%2F)', re.IGNORECASE) - - -def _clean_url_path(path, is_local_path): - # type: (str, bool) -> str - """ - Clean the path portion of a URL. - """ - if is_local_path: - clean_func = _clean_file_url_path - else: - clean_func = _clean_url_path_part - - # Split on the reserved characters prior to cleaning so that - # revision strings in VCS URLs are properly preserved. - parts = _reserved_chars_re.split(path) - - cleaned_parts = [] - for to_clean, reserved in pairwise(itertools.chain(parts, [''])): - cleaned_parts.append(clean_func(to_clean)) - # Normalize %xx escapes (e.g. %2f -> %2F) - cleaned_parts.append(reserved.upper()) - - return ''.join(cleaned_parts) - - -def _clean_link(url): - # type: (str) -> str - """ - Make sure a link is fully quoted. - For example, if ' ' occurs in the URL, it will be replaced with "%20", - and without double-quoting other characters. - """ - # Split the URL into parts according to the general structure - # `scheme://netloc/path;parameters?query#fragment`. - result = urllib.parse.urlparse(url) - # If the netloc is empty, then the URL refers to a local filesystem path. - is_local_path = not result.netloc - path = _clean_url_path(result.path, is_local_path=is_local_path) - return urllib.parse.urlunparse(result._replace(path=path)) - - -def _create_link_from_element( - anchor, # type: HTMLElement - page_url, # type: str - base_url, # type: str -): - # type: (...) -> Optional[Link] - """ - Convert an anchor element in a simple repository page to a Link. - """ - href = anchor.get("href") - if not href: - return None - - url = _clean_link(urllib.parse.urljoin(base_url, href)) - pyrequire = anchor.get('data-requires-python') - pyrequire = html.unescape(pyrequire) if pyrequire else None - - yanked_reason = anchor.get('data-yanked') - if yanked_reason: - yanked_reason = html.unescape(yanked_reason) - - link = Link( - url, - comes_from=page_url, - requires_python=pyrequire, - yanked_reason=yanked_reason, - ) - - return link - - -class CacheablePageContent: - def __init__(self, page): - # type: (HTMLPage) -> None - assert page.cache_link_parsing - self.page = page - - def __eq__(self, other): - # type: (object) -> bool - return (isinstance(other, type(self)) and - self.page.url == other.page.url) - - def __hash__(self): - # type: () -> int - return hash(self.page.url) - - -def with_cached_html_pages( - fn, # type: Callable[[HTMLPage], Iterable[Link]] -): - # type: (...) -> Callable[[HTMLPage], List[Link]] - """ - Given a function that parses an Iterable[Link] from an HTMLPage, cache the - function's result (keyed by CacheablePageContent), unless the HTMLPage - `page` has `page.cache_link_parsing == False`. - """ - - @functools.lru_cache(maxsize=None) - def wrapper(cacheable_page): - # type: (CacheablePageContent) -> List[Link] - return list(fn(cacheable_page.page)) - - @functools.wraps(fn) - def wrapper_wrapper(page): - # type: (HTMLPage) -> List[Link] - if page.cache_link_parsing: - return wrapper(CacheablePageContent(page)) - return list(fn(page)) - - return wrapper_wrapper - - -@with_cached_html_pages -def parse_links(page): - # type: (HTMLPage) -> Iterable[Link] - """ - Parse an HTML document, and yield its anchor elements as Link objects. - """ - 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, - page_url=url, - base_url=base_url, - ) - if link is None: - continue - yield link - - -class HTMLPage: - """Represents one page, along with its URL""" - - def __init__( - self, - content, # type: bytes - encoding, # type: Optional[str] - url, # type: str - cache_link_parsing=True, # type: bool - ): - # type: (...) -> None - """ - :param encoding: the encoding to decode the given content. - :param url: the URL from which the HTML was downloaded. - :param cache_link_parsing: whether links parsed from this page's url - should be cached. PyPI index urls should - have this set to False, for example. - """ - self.content = content - self.encoding = encoding - self.url = url - self.cache_link_parsing = cache_link_parsing - - def __str__(self): - # type: () -> str - return redact_auth_from_url(self.url) - - -def _handle_get_page_fail( - link, # type: Link - reason, # type: Union[str, Exception] - meth=None # type: Optional[Callable[..., None]] -): - # type: (...) -> None - if meth is None: - meth = logger.debug - meth("Could not fetch URL %s: %s - skipping", link, reason) - - -def _make_html_page(response, cache_link_parsing=True): - # type: (Response, bool) -> HTMLPage - encoding = _get_encoding_from_headers(response.headers) - return HTMLPage( - response.content, - encoding=encoding, - url=response.url, - cache_link_parsing=cache_link_parsing) - - -def _get_html_page(link, session=None): - # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] - if session is None: - raise TypeError( - "_get_html_page() missing 1 required keyword argument: 'session'" - ) - - url = link.url.split('#', 1)[0] - - # Check for VCS schemes that do not support lookup as web pages. - vcs_scheme = _match_vcs_scheme(url) - if vcs_scheme: - logger.warning('Cannot look at %s URL %s because it does not support ' - 'lookup as web pages.', vcs_scheme, link) - return None - - # Tack index.html onto file:// URLs that point to directories - scheme, _, path, _, _, _ = urllib.parse.urlparse(url) - if (scheme == 'file' and os.path.isdir(urllib.request.url2pathname(path))): - # add trailing slash if not present so urljoin doesn't trim - # final segment - if not url.endswith('/'): - url += '/' - url = urllib.parse.urljoin(url, 'index.html') - logger.debug(' file: URL is directory, getting %s', url) - - try: - resp = _get_html_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: - logger.warning( - 'Skipping page %s because the %s request got Content-Type: %s.' - 'The only supported Content-Type is text/html', - link, exc.request_desc, exc.content_type, - ) - except NetworkConnectionError as exc: - _handle_get_page_fail(link, exc) - except RetryError as exc: - _handle_get_page_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) - except requests.ConnectionError as exc: - _handle_get_page_fail(link, f"connection error: {exc}") - except requests.Timeout: - _handle_get_page_fail(link, "timed out") - else: - return _make_html_page(resp, - cache_link_parsing=link.cache_link_parsing) - return None - - -class CollectedSources(NamedTuple): - find_links: Sequence[Optional[LinkSource]] - index_urls: Sequence[Optional[LinkSource]] - - -class LinkCollector: - - """ - Responsible for collecting Link objects from all configured locations, - making network requests as needed. - - The class's main method is its collect_sources() method. - """ - - def __init__( - self, - session, # type: PipSession - search_scope, # type: SearchScope - ): - # type: (...) -> None - self.search_scope = search_scope - self.session = session - - @classmethod - def create(cls, session, options, suppress_no_index=False): - # type: (PipSession, Values, bool) -> LinkCollector - """ - :param session: The Session to use to make requests. - :param suppress_no_index: Whether to ignore the --no-index option - when constructing the SearchScope object. - """ - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index and not suppress_no_index: - logger.debug( - 'Ignoring indexes: %s', - ','.join(redact_auth_from_url(url) for url in index_urls), - ) - index_urls = [] - - # Make sure find_links is a list before passing to create(). - find_links = options.find_links or [] - - search_scope = SearchScope.create( - find_links=find_links, index_urls=index_urls, - ) - link_collector = LinkCollector( - session=session, search_scope=search_scope, - ) - return link_collector - - @property - def find_links(self): - # type: () -> List[str] - return self.search_scope.find_links - - def fetch_page(self, location): - # type: (Link) -> Optional[HTMLPage] - """ - Fetch an HTML page containing package links. - """ - return _get_html_page(location, session=self.session) - - def collect_sources( - self, - project_name: str, - candidates_from_page: CandidatesFromPage, - ) -> CollectedSources: - # The OrderedDict calls deduplicate sources by URL. - index_url_sources = collections.OrderedDict( - build_source( - loc, - candidates_from_page=candidates_from_page, - page_validator=self.session.is_secure_origin, - expand_dir=False, - cache_link_parsing=False, - ) - for loc in self.search_scope.get_index_urls_locations(project_name) - ).values() - find_links_sources = collections.OrderedDict( - build_source( - loc, - candidates_from_page=candidates_from_page, - page_validator=self.session.is_secure_origin, - expand_dir=True, - cache_link_parsing=True, - ) - for loc in self.find_links - ).values() - - if logger.isEnabledFor(logging.DEBUG): - lines = [ - f"* {s.link}" - for s in itertools.chain(find_links_sources, index_url_sources) - if s is not None and s.link is not None - ] - lines = [ - f"{len(lines)} location(s) to search " - f"for versions of {project_name}:" - ] + lines - logger.debug("\n".join(lines)) - - return CollectedSources( - find_links=list(find_links_sources), - index_urls=list(index_url_sources), - ) diff --git a/venv/Lib/site-packages/pip/_internal/index/package_finder.py b/venv/Lib/site-packages/pip/_internal/index/package_finder.py deleted file mode 100644 index 7f2e04e..0000000 --- a/venv/Lib/site-packages/pip/_internal/index/package_finder.py +++ /dev/null @@ -1,1012 +0,0 @@ -"""Routines related to PyPI, indexes""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import functools -import itertools -import logging -import re -from typing import FrozenSet, Iterable, List, Optional, Set, Tuple, Union - -from pip._vendor.packaging import specifiers -from pip._vendor.packaging.tags import Tag -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import _BaseVersion -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, - DistributionNotFound, - InvalidWheelFilename, - UnsupportedWheel, -) -from pip._internal.index.collector import LinkCollector, parse_links -from pip._internal.models.candidate import InstallationCandidate -from pip._internal.models.format_control import FormatControl -from pip._internal.models.link import Link -from pip._internal.models.search_scope import SearchScope -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython -from pip._internal.models.wheel import Wheel -from pip._internal.req import InstallRequirement -from pip._internal.utils.filetypes import WHEEL_EXTENSION -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import build_netloc -from pip._internal.utils.packaging import check_requires_python -from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS -from pip._internal.utils.urls import url_to_path - -__all__ = ['FormatControl', 'BestCandidateResult', 'PackageFinder'] - - -logger = logging.getLogger(__name__) - -BuildTag = Union[Tuple[()], Tuple[int, str]] -CandidateSortingKey = ( - Tuple[int, int, int, _BaseVersion, Optional[int], BuildTag] -) - - -def _check_link_requires_python( - link, # type: Link - version_info, # type: Tuple[int, int, int] - ignore_requires_python=False, # type: bool -): - # type: (...) -> bool - """ - Return whether the given Python version is compatible with a link's - "Requires-Python" value. - - :param version_info: A 3-tuple of ints representing the Python - major-minor-micro version to check. - :param ignore_requires_python: Whether to ignore the "Requires-Python" - value if the given Python version isn't compatible. - """ - try: - is_compatible = check_requires_python( - link.requires_python, version_info=version_info, - ) - except specifiers.InvalidSpecifier: - logger.debug( - "Ignoring invalid Requires-Python (%r) for link: %s", - link.requires_python, link, - ) - else: - if not is_compatible: - version = '.'.join(map(str, version_info)) - if not ignore_requires_python: - logger.debug( - 'Link requires a different Python (%s not in: %r): %s', - version, link.requires_python, link, - ) - return False - - logger.debug( - 'Ignoring failed Requires-Python check (%s not in: %r) ' - 'for link: %s', - version, link.requires_python, link, - ) - - return True - - -class LinkEvaluator: - - """ - Responsible for evaluating links for a particular project. - """ - - _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') - - # Don't include an allow_yanked default value to make sure each call - # site considers whether yanked releases are allowed. This also causes - # that decision to be made explicit in the calling code, which helps - # people when reading the code. - def __init__( - self, - project_name, # type: str - canonical_name, # type: str - formats, # type: FrozenSet[str] - target_python, # type: TargetPython - allow_yanked, # type: bool - ignore_requires_python=None, # type: Optional[bool] - ): - # type: (...) -> None - """ - :param project_name: The user supplied package name. - :param canonical_name: The canonical package name. - :param formats: The formats allowed for this package. Should be a set - with 'binary' or 'source' or both in it. - :param target_python: The target Python interpreter to use when - evaluating link compatibility. This is used, for example, to - check wheel compatibility, as well as when checking the Python - version, e.g. the Python version embedded in a link filename - (or egg fragment) and against an HTML link's optional PEP 503 - "data-requires-python" attribute. - :param allow_yanked: Whether files marked as yanked (in the sense - of PEP 592) are permitted to be candidates for install. - :param ignore_requires_python: Whether to ignore incompatible - PEP 503 "data-requires-python" values in HTML links. Defaults - to False. - """ - if ignore_requires_python is None: - ignore_requires_python = False - - self._allow_yanked = allow_yanked - self._canonical_name = canonical_name - self._ignore_requires_python = ignore_requires_python - self._formats = formats - self._target_python = target_python - - self.project_name = project_name - - def evaluate_link(self, link): - # type: (Link) -> Tuple[bool, Optional[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. - """ - version = None - if link.is_yanked and not self._allow_yanked: - reason = link.yanked_reason or '' - return (False, f'yanked for reason: {reason}') - - if link.egg_fragment: - egg_info = link.egg_fragment - ext = link.ext - else: - egg_info, ext = link.splitext() - if not ext: - return (False, 'not a file') - if ext not in SUPPORTED_EXTENSIONS: - return (False, 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) - if "macosx10" in link.path and ext == '.zip': - return (False, 'macosx10 one') - if ext == WHEEL_EXTENSION: - try: - wheel = Wheel(link.filename) - except InvalidWheelFilename: - return (False, 'invalid wheel filename') - if canonicalize_name(wheel.name) != self._canonical_name: - reason = 'wrong project name (not {})'.format( - self.project_name) - return (False, 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() - reason = ( - "none of the wheel's tags ({}) are compatible " - "(run pip debug --verbose to show compatible tags)".format( - ', '.join(file_tags) - ) - ) - return (False, 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) - - if not version: - version = _extract_version_from_fragment( - egg_info, self._canonical_name, - ) - if not version: - reason = f'Missing project version for {self.project_name}' - return (False, 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') - - supports_python = _check_link_requires_python( - link, version_info=self._target_python.py_version_info, - 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) - - logger.debug('Found link %s, version: %s', link, version) - - return (True, version) - - -def filter_unallowed_hashes( - candidates, # type: List[InstallationCandidate] - hashes, # type: Hashes - project_name, # type: str -): - # type: (...) -> List[InstallationCandidate] - """ - Filter out candidates whose hashes aren't allowed, and return a new - list of candidates. - - If at least one candidate has an allowed hash, then all candidates with - either an allowed hash or no hash specified are returned. Otherwise, - the given candidates are returned. - - Including the candidates with no hash specified when there is a match - allows a warning to be logged if there is a more preferred candidate - with no hash specified. Returning all candidates in the case of no - matches lets pip report the hash of the candidate that would otherwise - have been installed (e.g. permitting the user to more easily update - their requirements file with the desired hash). - """ - if not hashes: - logger.debug( - 'Given no hashes to check %s links for project %r: ' - 'discarding no candidates', - len(candidates), - project_name, - ) - # Make sure we're not returning back the given value. - return list(candidates) - - matches_or_no_digest = [] - # Collect the non-matches for logging purposes. - non_matches = [] - match_count = 0 - for candidate in candidates: - link = candidate.link - if not link.has_hash: - pass - elif link.is_hash_allowed(hashes=hashes): - match_count += 1 - else: - non_matches.append(candidate) - continue - - matches_or_no_digest.append(candidate) - - if match_count: - filtered = matches_or_no_digest - else: - # Make sure we're not returning back the given value. - filtered = list(candidates) - - if len(filtered) == len(candidates): - discard_message = 'discarding no candidates' - else: - discard_message = 'discarding {} non-matches:\n {}'.format( - len(non_matches), - '\n '.join(str(candidate.link) for candidate in non_matches) - ) - - logger.debug( - 'Checked %s links for project %r against %s hashes ' - '(%s matches, %s no digest): %s', - len(candidates), - project_name, - hashes.digest_count, - match_count, - len(matches_or_no_digest) - match_count, - discard_message - ) - - return filtered - - -class CandidatePreferences: - - """ - Encapsulates some of the preferences for filtering and sorting - InstallationCandidate objects. - """ - - def __init__( - self, - prefer_binary=False, # type: bool - allow_all_prereleases=False, # type: bool - ): - # type: (...) -> None - """ - :param allow_all_prereleases: Whether to allow all pre-releases. - """ - self.allow_all_prereleases = allow_all_prereleases - self.prefer_binary = prefer_binary - - -class BestCandidateResult: - """A collection of candidates, returned by `PackageFinder.find_best_candidate`. - - This class is only intended to be instantiated by CandidateEvaluator's - `compute_best_candidate()` method. - """ - - def __init__( - self, - candidates, # type: List[InstallationCandidate] - applicable_candidates, # type: List[InstallationCandidate] - best_candidate, # type: Optional[InstallationCandidate] - ): - # type: (...) -> None - """ - :param candidates: A sequence of all available candidates found. - :param applicable_candidates: The applicable candidates. - :param best_candidate: The most preferred candidate found, or None - if no applicable candidates were found. - """ - assert set(applicable_candidates) <= set(candidates) - - if best_candidate is None: - assert not applicable_candidates - else: - assert best_candidate in applicable_candidates - - self._applicable_candidates = applicable_candidates - self._candidates = candidates - - self.best_candidate = best_candidate - - def iter_all(self): - # type: () -> Iterable[InstallationCandidate] - """Iterate through all candidates. - """ - return iter(self._candidates) - - def iter_applicable(self): - # type: () -> Iterable[InstallationCandidate] - """Iterate through the applicable candidates. - """ - return iter(self._applicable_candidates) - - -class CandidateEvaluator: - - """ - Responsible for filtering and sorting candidates for installation based - on what tags are valid. - """ - - @classmethod - def create( - cls, - project_name, # type: str - target_python=None, # type: Optional[TargetPython] - prefer_binary=False, # type: bool - allow_all_prereleases=False, # type: bool - specifier=None, # type: Optional[specifiers.BaseSpecifier] - hashes=None, # type: Optional[Hashes] - ): - # type: (...) -> CandidateEvaluator - """Create a CandidateEvaluator object. - - :param target_python: The target Python interpreter to use when - checking compatibility. If None (the default), a TargetPython - object will be constructed from the running Python. - :param specifier: An optional object implementing `filter` - (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable - versions. - :param hashes: An optional collection of allowed hashes. - """ - if target_python is None: - target_python = TargetPython() - if specifier is None: - specifier = specifiers.SpecifierSet() - - supported_tags = target_python.get_tags() - - return cls( - project_name=project_name, - supported_tags=supported_tags, - specifier=specifier, - prefer_binary=prefer_binary, - allow_all_prereleases=allow_all_prereleases, - hashes=hashes, - ) - - def __init__( - self, - project_name, # type: str - supported_tags, # type: List[Tag] - specifier, # type: specifiers.BaseSpecifier - prefer_binary=False, # type: bool - allow_all_prereleases=False, # type: bool - hashes=None, # type: Optional[Hashes] - ): - # type: (...) -> None - """ - :param supported_tags: The PEP 425 tags supported by the target - Python in order of preference (most preferred first). - """ - self._allow_all_prereleases = allow_all_prereleases - self._hashes = hashes - self._prefer_binary = prefer_binary - self._project_name = project_name - self._specifier = specifier - self._supported_tags = supported_tags - # Since the index of the tag in the _supported_tags list is used - # as a priority, precompute a map from tag to index/priority to be - # used in wheel.find_most_preferred_tag. - self._wheel_tag_preferences = { - tag: idx for idx, tag in enumerate(supported_tags) - } - - def get_applicable_candidates( - self, - candidates, # type: List[InstallationCandidate] - ): - # type: (...) -> List[InstallationCandidate] - """ - Return the applicable candidates from a list of candidates. - """ - # Using None infers from the specifier instead. - allow_prereleases = self._allow_all_prereleases or None - specifier = self._specifier - versions = { - str(v) for v in specifier.filter( - # We turn the version object into a str here because otherwise - # when we're debundled but setuptools isn't, Python will see - # packaging.version.Version and - # pkg_resources._vendor.packaging.version.Version as different - # types. This way we'll use a str as a common data interchange - # format. If we stop using the pkg_resources provided specifier - # and start using our own, we can drop the cast to str(). - (str(c.version) for c in candidates), - prereleases=allow_prereleases, - ) - } - - # Again, converting version to str to deal with debundling. - applicable_candidates = [ - c for c in candidates if str(c.version) in versions - ] - - filtered_applicable_candidates = filter_unallowed_hashes( - candidates=applicable_candidates, - hashes=self._hashes, - project_name=self._project_name, - ) - - return sorted(filtered_applicable_candidates, key=self._sort_key) - - def _sort_key(self, candidate): - # type: (InstallationCandidate) -> CandidateSortingKey - """ - Function to pass as the `key` argument to a call to sorted() to sort - InstallationCandidates by preference. - - Returns a tuple such that tuples sorting as greater using Python's - default comparison operator are more preferred. - - The preference is as follows: - - First and foremost, candidates with allowed (matching) hashes are - always preferred over candidates without matching hashes. This is - because e.g. if the only candidate with an allowed hash is yanked, - we still want to use that candidate. - - Second, excepting hash considerations, candidates that have been - yanked (in the sense of PEP 592) are always less preferred than - candidates that haven't been yanked. Then: - - If not finding wheels, they are sorted by version only. - If finding wheels, then the sort order is by version, then: - 1. existing installs - 2. wheels ordered via Wheel.support_index_min(self._supported_tags) - 3. source archives - If prefer_binary was set, then all wheels are sorted above sources. - - Note: it was considered to embed this logic into the Link - comparison operators, but then different sdist links - with the same version, would have to be considered equal - """ - valid_tags = self._supported_tags - support_num = len(valid_tags) - build_tag = () # type: BuildTag - binary_preference = 0 - link = candidate.link - if link.is_wheel: - # can raise InvalidWheelFilename - wheel = Wheel(link.filename) - try: - pri = -(wheel.find_most_preferred_tag( - valid_tags, self._wheel_tag_preferences - )) - except ValueError: - raise UnsupportedWheel( - "{} is not a supported wheel for this platform. It " - "can't be sorted.".format(wheel.filename) - ) - if self._prefer_binary: - binary_preference = 1 - if wheel.build_tag is not None: - match = re.match(r'^(\d+)(.*)$', wheel.build_tag) - build_tag_groups = match.groups() - build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) - else: # sdist - pri = -(support_num) - has_allowed_hash = int(link.is_hash_allowed(self._hashes)) - yank_value = -1 * int(link.is_yanked) # -1 for yanked. - return ( - has_allowed_hash, yank_value, binary_preference, candidate.version, - pri, build_tag, - ) - - def sort_best_candidate( - self, - candidates, # type: List[InstallationCandidate] - ): - # type: (...) -> Optional[InstallationCandidate] - """ - Return the best candidate per the instance's sort order, or None if - no candidate is acceptable. - """ - if not candidates: - return None - best_candidate = max(candidates, key=self._sort_key) - return best_candidate - - def compute_best_candidate( - self, - candidates, # type: List[InstallationCandidate] - ): - # type: (...) -> BestCandidateResult - """ - Compute and return a `BestCandidateResult` instance. - """ - applicable_candidates = self.get_applicable_candidates(candidates) - - best_candidate = self.sort_best_candidate(applicable_candidates) - - return BestCandidateResult( - candidates, - applicable_candidates=applicable_candidates, - best_candidate=best_candidate, - ) - - -class PackageFinder: - """This finds packages. - - This is meant to match easy_install's technique for looking for - packages, by reading pages and looking for appropriate links. - """ - - def __init__( - self, - link_collector, # type: LinkCollector - target_python, # type: TargetPython - allow_yanked, # type: bool - format_control=None, # type: Optional[FormatControl] - candidate_prefs=None, # type: CandidatePreferences - ignore_requires_python=None, # type: Optional[bool] - ): - # type: (...) -> None - """ - This constructor is primarily meant to be used by the create() class - method and from tests. - - :param format_control: A FormatControl object, used to control - the selection of source packages / binary packages when consulting - the index and links. - :param candidate_prefs: Options to use when creating a - CandidateEvaluator object. - """ - if candidate_prefs is None: - candidate_prefs = CandidatePreferences() - - format_control = format_control or FormatControl(set(), set()) - - self._allow_yanked = allow_yanked - self._candidate_prefs = candidate_prefs - self._ignore_requires_python = ignore_requires_python - self._link_collector = link_collector - self._target_python = target_python - - self.format_control = format_control - - # These are boring links that have already been logged somehow. - self._logged_links = set() # type: Set[Link] - - # Don't include an allow_yanked default value to make sure each call - # site considers whether yanked releases are allowed. This also causes - # that decision to be made explicit in the calling code, which helps - # people when reading the code. - @classmethod - def create( - cls, - link_collector, # type: LinkCollector - selection_prefs, # type: SelectionPreferences - target_python=None, # type: Optional[TargetPython] - ): - # type: (...) -> PackageFinder - """Create a PackageFinder. - - :param selection_prefs: The candidate selection preferences, as a - SelectionPreferences object. - :param target_python: The target Python interpreter to use when - checking compatibility. If None (the default), a TargetPython - object will be constructed from the running Python. - """ - if target_python is None: - target_python = TargetPython() - - candidate_prefs = CandidatePreferences( - prefer_binary=selection_prefs.prefer_binary, - allow_all_prereleases=selection_prefs.allow_all_prereleases, - ) - - return cls( - candidate_prefs=candidate_prefs, - link_collector=link_collector, - target_python=target_python, - allow_yanked=selection_prefs.allow_yanked, - format_control=selection_prefs.format_control, - ignore_requires_python=selection_prefs.ignore_requires_python, - ) - - @property - def target_python(self): - # type: () -> TargetPython - return self._target_python - - @property - def search_scope(self): - # type: () -> SearchScope - return self._link_collector.search_scope - - @search_scope.setter - def search_scope(self, search_scope): - # type: (SearchScope) -> None - self._link_collector.search_scope = search_scope - - @property - def find_links(self): - # type: () -> List[str] - return self._link_collector.find_links - - @property - def index_urls(self): - # type: () -> List[str] - return self.search_scope.index_urls - - @property - def trusted_hosts(self): - # type: () -> Iterable[str] - for host_port in self._link_collector.session.pip_trusted_origins: - yield build_netloc(*host_port) - - @property - def allow_all_prereleases(self): - # type: () -> bool - return self._candidate_prefs.allow_all_prereleases - - def set_allow_all_prereleases(self): - # type: () -> None - self._candidate_prefs.allow_all_prereleases = True - - @property - def prefer_binary(self): - # type: () -> bool - return self._candidate_prefs.prefer_binary - - def set_prefer_binary(self): - # type: () -> None - self._candidate_prefs.prefer_binary = True - - def make_link_evaluator(self, project_name): - # type: (str) -> LinkEvaluator - canonical_name = canonicalize_name(project_name) - formats = self.format_control.get_allowed_formats(canonical_name) - - return LinkEvaluator( - project_name=project_name, - canonical_name=canonical_name, - formats=formats, - target_python=self._target_python, - allow_yanked=self._allow_yanked, - ignore_requires_python=self._ignore_requires_python, - ) - - def _sort_links(self, links): - # type: (Iterable[Link]) -> List[Link] - """ - Returns elements of links in order, non-egg links first, egg links - second, while eliminating duplicates - """ - eggs, no_eggs = [], [] - seen = set() # type: Set[Link] - for link in links: - if link not in seen: - seen.add(link) - if link.egg_fragment: - eggs.append(link) - else: - no_eggs.append(link) - return no_eggs + eggs - - def _log_skipped_link(self, link, reason): - # type: (Link, str) -> None - if link 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) - - def get_install_candidate(self, link_evaluator, link): - # type: (LinkEvaluator, Link) -> Optional[InstallationCandidate] - """ - 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) - return None - - return InstallationCandidate( - name=link_evaluator.project_name, - link=link, - version=result, - ) - - def evaluate_links(self, link_evaluator, links): - # type: (LinkEvaluator, Iterable[Link]) -> List[InstallationCandidate] - """ - Convert links that are candidates to InstallationCandidate objects. - """ - candidates = [] - for link in self._sort_links(links): - candidate = self.get_install_candidate(link_evaluator, link) - if candidate is not None: - candidates.append(candidate) - - return candidates - - def process_project_url(self, project_url, link_evaluator): - # type: (Link, LinkEvaluator) -> List[InstallationCandidate] - logger.debug( - 'Fetching project page and analyzing links: %s', project_url, - ) - html_page = self._link_collector.fetch_page(project_url) - if html_page is None: - return [] - - page_links = list(parse_links(html_page)) - - with indent_log(): - package_links = self.evaluate_links( - link_evaluator, - links=page_links, - ) - - return package_links - - @functools.lru_cache(maxsize=None) - def find_all_candidates(self, project_name): - # type: (str) -> List[InstallationCandidate] - """Find all available InstallationCandidate for project_name - - This checks index_urls and find_links. - All versions found are returned as an InstallationCandidate list. - - See LinkEvaluator.evaluate_link() for details on which files - are accepted. - """ - link_evaluator = self.make_link_evaluator(project_name) - - collected_sources = self._link_collector.collect_sources( - project_name=project_name, - candidates_from_page=functools.partial( - self.process_project_url, - link_evaluator=link_evaluator, - ), - ) - - page_candidates_it = itertools.chain.from_iterable( - source.page_candidates() - for sources in collected_sources - for source in sources - if source is not None - ) - page_candidates = list(page_candidates_it) - - file_links_it = itertools.chain.from_iterable( - source.file_links() - for sources in collected_sources - for source in sources - if source is not None - ) - file_candidates = self.evaluate_links( - link_evaluator, - sorted(file_links_it, reverse=True), - ) - - if logger.isEnabledFor(logging.DEBUG) and file_candidates: - paths = [url_to_path(c.link.url) for c in file_candidates] - logger.debug("Local files found: %s", ", ".join(paths)) - - # This is an intentional priority ordering - return file_candidates + page_candidates - - def make_candidate_evaluator( - self, - project_name, # type: str - specifier=None, # type: Optional[specifiers.BaseSpecifier] - hashes=None, # type: Optional[Hashes] - ): - # type: (...) -> CandidateEvaluator - """Create a CandidateEvaluator object to use. - """ - candidate_prefs = self._candidate_prefs - return CandidateEvaluator.create( - project_name=project_name, - target_python=self._target_python, - prefer_binary=candidate_prefs.prefer_binary, - allow_all_prereleases=candidate_prefs.allow_all_prereleases, - specifier=specifier, - hashes=hashes, - ) - - @functools.lru_cache(maxsize=None) - def find_best_candidate( - self, - project_name, # type: str - specifier=None, # type: Optional[specifiers.BaseSpecifier] - hashes=None, # type: Optional[Hashes] - ): - # type: (...) -> BestCandidateResult - """Find matches for the given project and specifier. - - :param specifier: An optional object implementing `filter` - (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable - versions. - - :return: A `BestCandidateResult` instance. - """ - candidates = self.find_all_candidates(project_name) - candidate_evaluator = self.make_candidate_evaluator( - project_name=project_name, - specifier=specifier, - hashes=hashes, - ) - return candidate_evaluator.compute_best_candidate(candidates) - - def find_requirement(self, req, upgrade): - # type: (InstallRequirement, bool) -> Optional[InstallationCandidate] - """Try to find a Link matching req - - Expects req, an InstallRequirement and upgrade, a boolean - Returns a InstallationCandidate if found, - Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise - """ - hashes = req.hashes(trust_internet=False) - best_candidate_result = self.find_best_candidate( - req.name, specifier=req.specifier, hashes=hashes, - ) - best_candidate = best_candidate_result.best_candidate - - installed_version = None # type: Optional[_BaseVersion] - if req.satisfied_by is not None: - installed_version = parse_version(req.satisfied_by.version) - - def _format_versions(cand_iter): - # type: (Iterable[InstallationCandidate]) -> str - # This repeated parse_version and str() conversion is needed to - # handle different vendoring sources from pip and pkg_resources. - # If we stop using the pkg_resources provided specifier and start - # using our own, we can drop the cast to str(). - return ", ".join(sorted( - {str(c.version) for c in cand_iter}, - key=parse_version, - )) or "none" - - if installed_version is None and best_candidate is None: - logger.critical( - 'Could not find a version that satisfies the requirement %s ' - '(from versions: %s)', - req, - _format_versions(best_candidate_result.iter_all()), - ) - - raise DistributionNotFound( - 'No matching distribution found for {}'.format( - req) - ) - - best_installed = False - if installed_version and ( - best_candidate is None or - best_candidate.version <= installed_version): - best_installed = True - - if not upgrade and installed_version is not None: - if best_installed: - logger.debug( - 'Existing installed version (%s) is most up-to-date and ' - 'satisfies requirement', - installed_version, - ) - else: - logger.debug( - 'Existing installed version (%s) satisfies requirement ' - '(most up-to-date version is %s)', - installed_version, - best_candidate.version, - ) - return None - - if best_installed: - # We have an existing version, and its the best version - logger.debug( - 'Installed version (%s) is most up-to-date (past versions: ' - '%s)', - installed_version, - _format_versions(best_candidate_result.iter_applicable()), - ) - raise BestVersionAlreadyInstalled - - logger.debug( - 'Using version %s (newest of versions: %s)', - best_candidate.version, - _format_versions(best_candidate_result.iter_applicable()), - ) - return best_candidate - - -def _find_name_version_sep(fragment, canonical_name): - # type: (str, str) -> int - """Find the separator's index based on the package's canonical name. - - :param fragment: A + filename "fragment" (stem) or - egg fragment. - :param canonical_name: The package's canonical name. - - This function is needed since the canonicalized name does not necessarily - have the same length as the egg info's name part. An example:: - - >>> fragment = 'foo__bar-1.0' - >>> canonical_name = 'foo-bar' - >>> _find_name_version_sep(fragment, canonical_name) - 8 - """ - # Project name and version must be separated by one single dash. Find all - # occurrences of dashes; if the string in front of it matches the canonical - # name, this is the one separating the name and version parts. - for i, c in enumerate(fragment): - if c != "-": - continue - if canonicalize_name(fragment[:i]) == canonical_name: - return i - raise ValueError(f"{fragment} does not match {canonical_name}") - - -def _extract_version_from_fragment(fragment, canonical_name): - # type: (str, str) -> Optional[str] - """Parse the version string from a + filename - "fragment" (stem) or egg fragment. - - :param fragment: The string to parse. E.g. foo-2.1 - :param canonical_name: The canonicalized name of the package this - belongs to. - """ - try: - version_start = _find_name_version_sep(fragment, canonical_name) + 1 - except ValueError: - return None - version = fragment[version_start:] - if not version: - return None - return version diff --git a/venv/Lib/site-packages/pip/_internal/index/sources.py b/venv/Lib/site-packages/pip/_internal/index/sources.py deleted file mode 100644 index eec3f12..0000000 --- a/venv/Lib/site-packages/pip/_internal/index/sources.py +++ /dev/null @@ -1,224 +0,0 @@ -import logging -import mimetypes -import os -import pathlib -from typing import Callable, Iterable, Optional, Tuple - -from pip._internal.models.candidate import InstallationCandidate -from pip._internal.models.link import Link -from pip._internal.utils.urls import path_to_url, url_to_path -from pip._internal.vcs import is_url - -logger = logging.getLogger(__name__) - -FoundCandidates = Iterable[InstallationCandidate] -FoundLinks = Iterable[Link] -CandidatesFromPage = Callable[[Link], Iterable[InstallationCandidate]] -PageValidator = Callable[[Link], bool] - - -class LinkSource: - @property - def link(self) -> Optional[Link]: - """Returns the underlying link, if there's one.""" - raise NotImplementedError() - - def page_candidates(self) -> FoundCandidates: - """Candidates found by parsing an archive listing HTML file.""" - raise NotImplementedError() - - def file_links(self) -> FoundLinks: - """Links found by specifying archives directly.""" - raise NotImplementedError() - - -def _is_html_file(file_url: str) -> bool: - return mimetypes.guess_type(file_url, strict=False)[0] == "text/html" - - -class _FlatDirectorySource(LinkSource): - """Link source specified by ``--find-links=``. - - This looks the content of the directory, and returns: - - * ``page_candidates``: Links listed on each HTML file in the directory. - * ``file_candidates``: Archives in the directory. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - path: str, - ) -> None: - self._candidates_from_page = candidates_from_page - self._path = pathlib.Path(os.path.realpath(path)) - - @property - def link(self) -> Optional[Link]: - return None - - def page_candidates(self) -> FoundCandidates: - for path in self._path.iterdir(): - url = path_to_url(str(path)) - if not _is_html_file(url): - continue - yield from self._candidates_from_page(Link(url)) - - def file_links(self) -> FoundLinks: - for path in self._path.iterdir(): - url = path_to_url(str(path)) - if _is_html_file(url): - continue - yield Link(url) - - -class _LocalFileSource(LinkSource): - """``--find-links=`` or ``--[extra-]index-url=``. - - If a URL is supplied, it must be a ``file:`` URL. If a path is supplied to - the option, it is converted to a URL first. This returns: - - * ``page_candidates``: Links listed on an HTML file. - * ``file_candidates``: The non-HTML file. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - link: Link, - ) -> None: - self._candidates_from_page = candidates_from_page - self._link = link - - @property - def link(self) -> Optional[Link]: - return self._link - - def page_candidates(self) -> FoundCandidates: - if not _is_html_file(self._link.url): - return - yield from self._candidates_from_page(self._link) - - def file_links(self) -> FoundLinks: - if _is_html_file(self._link.url): - return - yield self._link - - -class _RemoteFileSource(LinkSource): - """``--find-links=`` or ``--[extra-]index-url=``. - - This returns: - - * ``page_candidates``: Links listed on an HTML file. - * ``file_candidates``: The non-HTML file. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - page_validator: PageValidator, - link: Link, - ) -> None: - self._candidates_from_page = candidates_from_page - self._page_validator = page_validator - self._link = link - - @property - def link(self) -> Optional[Link]: - return self._link - - def page_candidates(self) -> FoundCandidates: - if not self._page_validator(self._link): - return - yield from self._candidates_from_page(self._link) - - def file_links(self) -> FoundLinks: - yield self._link - - -class _IndexDirectorySource(LinkSource): - """``--[extra-]index-url=``. - - This is treated like a remote URL; ``candidates_from_page`` contains logic - for this by appending ``index.html`` to the link. - """ - - def __init__( - self, - candidates_from_page: CandidatesFromPage, - link: Link, - ) -> None: - self._candidates_from_page = candidates_from_page - self._link = link - - @property - def link(self) -> Optional[Link]: - return self._link - - def page_candidates(self) -> FoundCandidates: - yield from self._candidates_from_page(self._link) - - def file_links(self) -> FoundLinks: - return () - - -def build_source( - location: str, - *, - candidates_from_page: CandidatesFromPage, - page_validator: PageValidator, - expand_dir: bool, - cache_link_parsing: bool, -) -> Tuple[Optional[str], Optional[LinkSource]]: - - path: Optional[str] = None - url: Optional[str] = None - if os.path.exists(location): # Is a local path. - url = path_to_url(location) - path = location - elif location.startswith("file:"): # A file: URL. - url = location - path = url_to_path(location) - elif is_url(location): - url = location - - if url is None: - msg = ( - "Location '%s' is ignored: " - "it is either a non-existing path or lacks a specific scheme." - ) - logger.warning(msg, location) - return (None, None) - - if path is None: - source: LinkSource = _RemoteFileSource( - candidates_from_page=candidates_from_page, - page_validator=page_validator, - link=Link(url, cache_link_parsing=cache_link_parsing), - ) - return (url, source) - - if os.path.isdir(path): - if expand_dir: - source = _FlatDirectorySource( - candidates_from_page=candidates_from_page, - path=path, - ) - else: - source = _IndexDirectorySource( - candidates_from_page=candidates_from_page, - link=Link(url, cache_link_parsing=cache_link_parsing), - ) - return (url, source) - elif os.path.isfile(path): - source = _LocalFileSource( - candidates_from_page=candidates_from_page, - link=Link(url, cache_link_parsing=cache_link_parsing), - ) - return (url, source) - logger.warning( - "Location '%s' is ignored: it is neither a file nor a directory.", - location, - ) - return (url, None) diff --git a/venv/Lib/site-packages/pip/_internal/locations/__init__.py b/venv/Lib/site-packages/pip/_internal/locations/__init__.py deleted file mode 100644 index 3acb51b..0000000 --- a/venv/Lib/site-packages/pip/_internal/locations/__init__.py +++ /dev/null @@ -1,184 +0,0 @@ -import logging -import pathlib -import sys -import sysconfig -from typing import List, Optional - -from pip._internal.models.scheme import SCHEME_KEYS, Scheme - -from . import _distutils, _sysconfig -from .base import ( - USER_CACHE_DIR, - get_major_minor_version, - get_src_prefix, - site_packages, - user_site, -) - -__all__ = [ - "USER_CACHE_DIR", - "get_bin_prefix", - "get_bin_user", - "get_major_minor_version", - "get_platlib", - "get_prefixed_libs", - "get_purelib", - "get_scheme", - "get_src_prefix", - "site_packages", - "user_site", -] - - -logger = logging.getLogger(__name__) - - -def _default_base(*, user: bool) -> str: - if user: - base = sysconfig.get_config_var("userbase") - else: - base = sysconfig.get_config_var("base") - assert base is not None - return base - - -def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str) -> bool: - if old == new: - return False - issue_url = "https://github.com/pypa/pip/issues/9617" - message = ( - "Value for %s does not match. Please report this to <%s>" - "\ndistutils: %s" - "\nsysconfig: %s" - ) - logger.debug(message, key, issue_url, old, new) - return True - - -def _log_context( - *, - user: bool = False, - home: Optional[str] = None, - root: Optional[str] = None, - prefix: Optional[str] = None, -) -> None: - message = ( - "Additional context:" "\nuser = %r" "\nhome = %r" "\nroot = %r" "\nprefix = %r" - ) - logger.debug(message, user, home, root, prefix) - - -def get_scheme( - dist_name, # type: str - user=False, # type: bool - home=None, # type: Optional[str] - root=None, # type: Optional[str] - isolated=False, # type: bool - prefix=None, # type: Optional[str] -): - # type: (...) -> Scheme - old = _distutils.get_scheme( - dist_name, - user=user, - home=home, - root=root, - isolated=isolated, - prefix=prefix, - ) - new = _sysconfig.get_scheme( - dist_name, - user=user, - home=home, - root=root, - isolated=isolated, - prefix=prefix, - ) - - base = prefix or home or _default_base(user=user) - warned = [] - for k in SCHEME_KEYS: - # Extra join because distutils can return relative paths. - old_v = pathlib.Path(base, getattr(old, k)) - new_v = pathlib.Path(getattr(new, k)) - - # distutils incorrectly put PyPy packages under ``site-packages/python`` - # in the ``posix_home`` scheme, but PyPy devs said they expect the - # directory name to be ``pypy`` instead. So we treat this as a bug fix - # and not warn about it. See bpo-43307 and python/cpython#24628. - skip_pypy_special_case = ( - sys.implementation.name == "pypy" - and home is not None - and k in ("platlib", "purelib") - and old_v.parent == new_v.parent - and old_v.name == "python" - and new_v.name == "pypy" - ) - if skip_pypy_special_case: - continue - - warned.append(_warn_if_mismatch(old_v, new_v, key=f"scheme.{k}")) - - if any(warned): - _log_context(user=user, home=home, root=root, prefix=prefix) - - return old - - -def get_bin_prefix(): - # type: () -> str - old = _distutils.get_bin_prefix() - new = _sysconfig.get_bin_prefix() - if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="bin_prefix"): - _log_context() - return old - - -def get_bin_user(): - # type: () -> str - return _sysconfig.get_scheme("", user=True).scripts - - -def get_purelib(): - # type: () -> str - """Return the default pure-Python lib location.""" - old = _distutils.get_purelib() - new = _sysconfig.get_purelib() - if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="purelib"): - _log_context() - return old - - -def get_platlib(): - # type: () -> str - """Return the default platform-shared lib location.""" - old = _distutils.get_platlib() - new = _sysconfig.get_platlib() - if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="platlib"): - _log_context() - return old - - -def get_prefixed_libs(prefix): - # type: (str) -> List[str] - """Return the lib locations under ``prefix``.""" - old_pure, old_plat = _distutils.get_prefixed_libs(prefix) - new_pure, new_plat = _sysconfig.get_prefixed_libs(prefix) - - warned = [ - _warn_if_mismatch( - pathlib.Path(old_pure), - pathlib.Path(new_pure), - key="prefixed-purelib", - ), - _warn_if_mismatch( - pathlib.Path(old_plat), - pathlib.Path(new_plat), - key="prefixed-platlib", - ), - ] - if any(warned): - _log_context(prefix=prefix) - - if old_pure == old_plat: - return [old_pure] - return [old_pure, old_plat] diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 63c62e7691e73eed1ff7209834dc5adf09dbf8b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3681 zcmcImTW{RP73K^t%jK?CEBPkhH%*;%(^_(hqHPR2XzEzKxvF8M1xjo|Q#<1oC349O zxr!xlQ6Tn1U-aCEx`3630)FWa;$sUG$X`&Krr#M#vaH%~Er~fZbLRfdIp3LZX2vt{ zW%1Rpnm3HUQ|0*AK;=hBxyKAc7=p!yU+2tcy3T#BbJI7G^Vmvk-%cFgVbsrz8;R?? zNz-qlZV5Z~l9t~}+J0Ntop>hc_?=|dpG~@cH<|P2l6ilg86!h9zF__-X*@qI&+IY( ztUMTD|kryT7~}{NnC!S1V_AxGod2vj^3=kt~8F+(=cBL}SP;sd6k)b*Ld%!yr@gQS`W) z$)iFBSvcGbM>4OPlU%BRbp4iUV%2)US~NZ!(54BfPCXUff7K#Y7KcR~tyOcnq9>Ok zfF?g^pD0P~p5A~ymTF5G*q`Rp5wCi z*p!VuUFK9SVOkTGzw>kBbCdzMxl*|_@miS6$|8xSnn&=}N35X?wnEkC>NFNm=OA7f z>H@O;(cPN^A-80lW`j(nBNZmVbu`Gfi}iFIjG|&N3KJRRKvE92xbYD zvM3t_(YTNbS3QW+VMw>04+1EoA_x|^O{|@3A7d74bC0!|x&&R{ zs?0PNl{uE5RpzGLR%f6c5=itBU^Wu@-!Z^Sw#ikSEKu;NDa@%wpp{n1OS3dewr7)9 z0Wf=IdFS2rqR8@_OG`N0`ebc!m?lfvb`~z-6iZQ_Ph`II!S~<)!OrS$!gwNkk5bjU zmiI&|^WHcudP!Ie*B5*DV~KP0l+039^osQ;?-gn9*0uaY@5q*KVxV_)9aQ_|1+Sbq z9gScOwvcNR*toik)2J&Xu0r@ty@_C=;;NCzJcs@2yQ;-SbgAZo&q6g0qDOFoTyN+) z)OiQOU@joFIRBd4^Gp%Y%P%Z_@s+inCNLD0rbXq{euCw-O}vAC>Rl4wBB4=7L4OwH zE2xv@2zG=r5GJHG$_7y8D?7J85+bTyzXt;>&_7Tpj15L+qRquBZNYY( zsZ;RRXd9)S-70x@t1#h>e3wn#kuhx+*2l*0KA(Dp{oE}vL4J77VE^4)_oMJ z2DmaT3RRi#j;a$SS&V2fhK{J*8iR3QprL}Qa>6W=W1%g%GQ;tw#yE8Y^Yk0_ zHIWmmS##6z%RFoC@G5GZ!i2Kwm#2=7y9Td2(zq0KA2)Ui_ zJkZe^+%9_uv8zXZaQ(iHjXjui?=aRaszut{aeVP^d^5i47PX!LmPYI%)xerZz>@y| za>5(0J0a)*AuqX}ufzYuiBnRTdF7OJt#7oV*PfC_{1NHoDM>%10Dt%qXH(MV^B4sk z)M4)fK4nu*en8fb8U_5?8{h@n8^DLPHyr5ke$sjidXv0l#HV)Qls4FM4g8Gf!7dn- zSQAf)tYjlRCa5+dGqrc#JBHNpd(V55u|QON_^=LN4<9b>bnBuN*AG}z19n_pzbN}m zb5!50{c#Q_d@Yh6Py;z--_Zknm#B;8J}6;2-z6Tab-Dzdx=901*ch#{hm@1k8)k=f zOb!Qj8UM<%k4pPi+hrbH8*WV_`u6h5%JNG8?W#eK7d#Maz93#w3lNo4Y-gk<=Tjzx ze-ZDg#iLi@Vv-6O=ZkgR&_O{Fy{X$IbllJ(gJ@d6&-DxZ#6!Aj1VI?bK~OajKj3cn#PDLg{s4krZmlP1YsSVH1!dWDD9-$hBf>z!O|uD)^cxQ>yuc1 zNVb{(7=qxUzsvEnORhWXnce2X>_IU2Cmvq_j()!1o&^=x|GxJ_x9Qrh=X(DEUPn-7 diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc deleted file mode 100644 index e38fcaf5c0562c39a4b93e0279d9442625d5c5f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3878 zcmb6cU2h~uae8*XykB1X{CRiWO-v-R;=Bt=AjsUIg!3H`4hLbQh|!|ac)NE!zWGXb z@1AXq^AHEYLr#J`5=A<{Af3b`KY$;QUocNdJmoJW5>VB%yS9&<5Hp&Z>Z$7L>ZoGO|Kcxd-HM2YsCxRLcHiLD!LP0iJP(W+D_ka4}7Z3cOKlsfqQYN#WlcG6f($9|NL7MncxZk!4 zV>|52!gv%4Svc=zs6h}F=H4iaSYiG;fpKB<10g|>wc9^nF+-8>{cLCZ-S<%X8XqM| zm<;_40 zjfnW=JKBdt8q&s;FhCoz`S+Tl?+G zXy_WnQUJnW}I?Q=5L{z&+(y!Naq=RryfAKH4VpA(|Vg)^l7 zK`tI%d$t4=n=W9a$>lQ*_M+$7xtZ7K5?HB%Hkk3Qs2QtBTi4FXIibtz+G%4Vr;<15 zGPQoE0}V7%^J@^FD<|Ksx^Vr9$q`T7z@-o`BN;~GA|zF8C@wzne0>|Zc(@OY7)41C zvy;Z=W|D4>1mm0i!O*LTJ`XeL2Ye`YxB<@J!$9kE7D#qtBHz6e$IUn!gh%&I%!4#$ z_X^E(CNb?7wJC=2tQU4R;tWtgqChGnO#0D?vceFdWQA3Re_29Ed&F!Onwp{JrSvOpdb z#$g&Jd;vdJMHYpU@^H)wJJ=UUZ#RoM)YM03@Y^Wh6$BeN!3jkQMq`w__zf-KmE7o_ zg3zJ@`z=UVSVDQbs61xJUIPXDN$RVmo@@MdnD}M*V5>*jm_=#U%Xm8EK@7)#*qdaZ zVJLe;(7^|_`m8sGgwX?U_0UI~@ab_dWTKaaSr6ONG!!(~A#FW1 z;fUG655f8B{QQJTR~|5Tquk5}`1Emf{O*?AdG_jh`HseVoOOlkTMfn-7ZKHU~8-# zos`&iXRt$1^Jn*ze_qFb!My zzQ&?_4UQjQMQ{^9VV9)^5+kI{pl!ZD=if)pHvzPDb*^~>ahu=4?^iP;-^6b&g6|^0 z1XqGL04u6k5z5W)!B}8L(XKB-(y*rYR~(Z=9|_Y7izF7j`|yYefYkUKk{s&KD$+PK zDLL0qH8r-NniKJzOEev6xwfkTr%jmA zs@f}x%6^!9fz4Q9(SSdJ0q)?W)!jW7lEvLe;XV)eardOz9SPpWG#qtdPTS$ww()Nv zcnv`tKv5CLLK&;D*b(GuQ8-wOAyVQt@hq4KE$E9jRGq0JsWN#4f=W9=YHsOu(jrFX zRY=VIEudVnBaAi3oTVM{2STde@hO2_R(2jfCq)C7heE^p;UMgD{EfJ@ymF@UV-5W{ z=^uU%OhN~s=^Q=ue=NDj--ZeQYZ*`p>fOh{IbCKOm%*r*UWlWzxW2&X#+~IF)t~Bs zK~Id>0KIAKJcKCzF|a7Z@2SPxL=7%&Rqb*??NV8pQTz)Ke?s}H8Lw2K&hZB@ZkrEx zb{_6bU#}Fl??Vmn{nFd_fW>QE${8``Xf3a`J*~`>{}Jz^GwMt_qRyl`sBT9!ef$>8 zEv{Y2gAgj4E?&l^JkFr>aV)jmK`@5^z0GR~R1bCo+J(-nUFgIqWs&HV2UDHy;`&t% z)xn}xkg`-L7q`BS;o_gB?6wR{MXJXt69*n`6_+YfIQmi9@RH>(g3P%KdW|CXBlNE5 l05DAKP0CKBPFx6fxb?cB{k!@${4kXFm(^FDdB=3j{{Z{Q9=ZSk diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc deleted file mode 100644 index f9f4b40a44ef4f1ac98804a30138a37da63ebb65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4496 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 diff --git a/venv/Lib/site-packages/pip/_internal/locations/_distutils.py b/venv/Lib/site-packages/pip/_internal/locations/_distutils.py deleted file mode 100644 index 2d7ab73..0000000 --- a/venv/Lib/site-packages/pip/_internal/locations/_distutils.py +++ /dev/null @@ -1,150 +0,0 @@ -"""Locations where we look for configs, install stuff, etc""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import os -import sys -from distutils.cmd import Command as DistutilsCommand -from distutils.command.install import SCHEME_KEYS -from distutils.command.install import install as distutils_install_command -from distutils.sysconfig import get_python_lib -from typing import Dict, List, Optional, Tuple, Union, cast - -from pip._internal.models.scheme import Scheme -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.virtualenv import running_under_virtualenv - -from .base import get_major_minor_version - - -def _distutils_scheme( - dist_name, user=False, home=None, root=None, isolated=False, prefix=None -): - # type:(str, bool, str, str, bool, str) -> Dict[str, str] - """ - Return a distutils install scheme - """ - from distutils.dist import Distribution - - dist_args = {"name": dist_name} # type: Dict[str, Union[str, List[str]]] - if isolated: - dist_args["script_args"] = ["--no-user-cfg"] - - d = Distribution(dist_args) - d.parse_config_files() - obj = None # type: Optional[DistutilsCommand] - obj = d.get_command_obj("install", create=True) - assert obj is not None - i = cast(distutils_install_command, obj) - # NOTE: setting user or home has the side-effect of creating the home dir - # or user base for installations during finalize_options() - # ideally, we'd prefer a scheme class that has no side-effects. - assert not (user and prefix), f"user={user} prefix={prefix}" - assert not (home and prefix), f"home={home} prefix={prefix}" - i.user = user or i.user - if user or home: - i.prefix = "" - i.prefix = prefix or i.prefix - i.home = home or i.home - i.root = root or i.root - i.finalize_options() - - scheme = {} - for key in SCHEME_KEYS: - scheme[key] = getattr(i, "install_" + key) - - # install_lib specified in setup.cfg should install *everything* - # into there (i.e. it takes precedence over both purelib and - # platlib). Note, i.install_lib is *always* set after - # finalize_options(); we only want to override here if the user - # has explicitly requested it hence going back to the config - if "install_lib" in d.get_option_dict("install"): - scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) - - if running_under_virtualenv(): - scheme["headers"] = os.path.join( - i.prefix, - "include", - "site", - f"python{get_major_minor_version()}", - dist_name, - ) - - if root is not None: - path_no_drive = os.path.splitdrive(os.path.abspath(scheme["headers"]))[1] - scheme["headers"] = os.path.join( - root, - path_no_drive[1:], - ) - - return scheme - - -def get_scheme( - dist_name, # type: str - user=False, # type: bool - home=None, # type: Optional[str] - root=None, # type: Optional[str] - isolated=False, # type: bool - prefix=None, # type: Optional[str] -): - # type: (...) -> Scheme - """ - Get the "scheme" corresponding to the input parameters. The distutils - documentation provides the context for the available schemes: - https://docs.python.org/3/install/index.html#alternate-installation - - :param dist_name: the name of the package to retrieve the scheme for, used - in the headers scheme path - :param user: indicates to use the "user" scheme - :param home: indicates to use the "home" scheme and provides the base - directory for the same - :param root: root under which other directories are re-based - :param isolated: equivalent to --no-user-cfg, i.e. do not consider - ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for - scheme paths - :param prefix: indicates to use the "prefix" scheme and provides the - base directory for the same - """ - scheme = _distutils_scheme(dist_name, user, home, root, isolated, prefix) - return Scheme( - platlib=scheme["platlib"], - purelib=scheme["purelib"], - headers=scheme["headers"], - scripts=scheme["scripts"], - data=scheme["data"], - ) - - -def get_bin_prefix(): - # type: () -> str - if WINDOWS: - bin_py = os.path.join(sys.prefix, "Scripts") - # buildout uses 'bin' on Windows too? - if not os.path.exists(bin_py): - bin_py = os.path.join(sys.prefix, "bin") - return bin_py - # Forcing to use /usr/local/bin for standard macOS framework installs - # Also log to ~/Library/Logs/ for use with the Console.app log viewer - if sys.platform[:6] == "darwin" and sys.prefix[:16] == "/System/Library/": - return "/usr/local/bin" - return os.path.join(sys.prefix, "bin") - - -def get_purelib(): - # type: () -> str - return get_python_lib(plat_specific=False) - - -def get_platlib(): - # type: () -> str - return get_python_lib(plat_specific=True) - - -def get_prefixed_libs(prefix): - # type: (str) -> Tuple[str, str] - return ( - get_python_lib(plat_specific=False, prefix=prefix), - get_python_lib(plat_specific=True, prefix=prefix), - ) diff --git a/venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py b/venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py deleted file mode 100644 index 03366ce..0000000 --- a/venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +++ /dev/null @@ -1,180 +0,0 @@ -import distutils.util # FIXME: For change_root. -import logging -import os -import sys -import sysconfig -import typing - -from pip._internal.exceptions import InvalidSchemeCombination, UserInstallationInvalid -from pip._internal.models.scheme import SCHEME_KEYS, Scheme -from pip._internal.utils.virtualenv import running_under_virtualenv - -from .base import get_major_minor_version - -logger = logging.getLogger(__name__) - - -# Notes on _infer_* functions. -# Unfortunately ``_get_default_scheme()`` is private, so there's no way to -# ask things like "what is the '_prefix' scheme on this platform". These -# functions try to answer that with some heuristics while accounting for ad-hoc -# platforms not covered by CPython's default sysconfig implementation. If the -# ad-hoc implementation does not fully implement sysconfig, we'll fall back to -# a POSIX scheme. - -_AVAILABLE_SCHEMES = set(sysconfig.get_scheme_names()) - - -def _infer_prefix(): - # type: () -> str - """Try to find a prefix scheme for the current platform. - - This tries: - - * Implementation + OS, used by PyPy on Windows (``pypy_nt``). - * Implementation without OS, used by PyPy on POSIX (``pypy``). - * OS + "prefix", used by CPython on POSIX (``posix_prefix``). - * Just the OS name, used by CPython on Windows (``nt``). - - If none of the above works, fall back to ``posix_prefix``. - """ - implementation_suffixed = f"{sys.implementation.name}_{os.name}" - if implementation_suffixed in _AVAILABLE_SCHEMES: - return implementation_suffixed - if sys.implementation.name in _AVAILABLE_SCHEMES: - return sys.implementation.name - suffixed = f"{os.name}_prefix" - if suffixed in _AVAILABLE_SCHEMES: - return suffixed - if os.name in _AVAILABLE_SCHEMES: # On Windows, prefx is just called "nt". - return os.name - return "posix_prefix" - - -def _infer_user(): - # type: () -> str - """Try to find a user scheme for the current platform.""" - suffixed = f"{os.name}_user" - if suffixed in _AVAILABLE_SCHEMES: - return suffixed - if "posix_user" not in _AVAILABLE_SCHEMES: # User scheme unavailable. - raise UserInstallationInvalid() - return "posix_user" - - -def _infer_home(): - # type: () -> str - """Try to find a home for the current platform.""" - suffixed = f"{os.name}_home" - if suffixed in _AVAILABLE_SCHEMES: - return suffixed - return "posix_home" - - -# Update these keys if the user sets a custom home. -_HOME_KEYS = [ - "installed_base", - "base", - "installed_platbase", - "platbase", - "prefix", - "exec_prefix", -] -if sysconfig.get_config_var("userbase") is not None: - _HOME_KEYS.append("userbase") - - -def get_scheme( - dist_name, # type: str - user=False, # type: bool - home=None, # type: typing.Optional[str] - root=None, # type: typing.Optional[str] - isolated=False, # type: bool - prefix=None, # type: typing.Optional[str] -): - # type: (...) -> Scheme - """ - Get the "scheme" corresponding to the input parameters. - - :param dist_name: the name of the package to retrieve the scheme for, used - in the headers scheme path - :param user: indicates to use the "user" scheme - :param home: indicates to use the "home" scheme - :param root: root under which other directories are re-based - :param isolated: ignored, but kept for distutils compatibility (where - this controls whether the user-site pydistutils.cfg is honored) - :param prefix: indicates to use the "prefix" scheme and provides the - base directory for the same - """ - if user and prefix: - raise InvalidSchemeCombination("--user", "--prefix") - if home and prefix: - raise InvalidSchemeCombination("--home", "--prefix") - - if home is not None: - scheme_name = _infer_home() - elif user: - scheme_name = _infer_user() - else: - scheme_name = _infer_prefix() - - if home is not None: - variables = {k: home for k in _HOME_KEYS} - elif prefix is not None: - variables = {k: prefix for k in _HOME_KEYS} - else: - variables = {} - - paths = sysconfig.get_paths(scheme=scheme_name, vars=variables) - - # Logic here is very arbitrary, we're doing it for compatibility, don't ask. - # 1. Pip historically uses a special header path in virtual environments. - # 2. If the distribution name is not known, distutils uses 'UNKNOWN'. We - # only do the same when not running in a virtual environment because - # pip's historical header path logic (see point 1) did not do this. - if running_under_virtualenv(): - if user: - base = variables.get("userbase", sys.prefix) - else: - base = variables.get("base", sys.prefix) - python_xy = f"python{get_major_minor_version()}" - paths["include"] = os.path.join(base, "include", "site", python_xy) - elif not dist_name: - dist_name = "UNKNOWN" - - scheme = Scheme( - platlib=paths["platlib"], - purelib=paths["purelib"], - headers=os.path.join(paths["include"], dist_name), - scripts=paths["scripts"], - data=paths["data"], - ) - if root is not None: - for key in SCHEME_KEYS: - value = distutils.util.change_root(root, getattr(scheme, key)) - setattr(scheme, key, value) - return scheme - - -def get_bin_prefix(): - # type: () -> str - # Forcing to use /usr/local/bin for standard macOS framework installs. - if sys.platform[:6] == "darwin" and sys.prefix[:16] == "/System/Library/": - return "/usr/local/bin" - return sysconfig.get_paths()["scripts"] - - -def get_purelib(): - # type: () -> str - return sysconfig.get_paths()["purelib"] - - -def get_platlib(): - # type: () -> str - return sysconfig.get_paths()["platlib"] - - -def get_prefixed_libs(prefix): - # type: (str) -> typing.Tuple[str, str] - paths = sysconfig.get_paths(vars={"base": prefix, "platbase": prefix}) - return (paths["purelib"], paths["platlib"]) diff --git a/venv/Lib/site-packages/pip/_internal/locations/base.py b/venv/Lib/site-packages/pip/_internal/locations/base.py deleted file mode 100644 index 98557ab..0000000 --- a/venv/Lib/site-packages/pip/_internal/locations/base.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -import site -import sys -import sysconfig -import typing - -from pip._internal.utils import appdirs -from pip._internal.utils.virtualenv import running_under_virtualenv - -# Application Directories -USER_CACHE_DIR = appdirs.user_cache_dir("pip") - -# FIXME doesn't account for venv linked to global site-packages -site_packages = sysconfig.get_path("purelib") # type: typing.Optional[str] - - -def get_major_minor_version(): - # type: () -> str - """ - Return the major-minor version of the current Python as a string, e.g. - "3.7" or "3.10". - """ - return "{}.{}".format(*sys.version_info) - - -def get_src_prefix(): - # type: () -> str - if running_under_virtualenv(): - src_prefix = os.path.join(sys.prefix, "src") - else: - # FIXME: keep src in cwd for now (it is not a temporary folder) - try: - src_prefix = os.path.join(os.getcwd(), "src") - except OSError: - # In case the current working directory has been renamed or deleted - sys.exit("The folder you are executing pip from can no longer be found.") - - # under macOS + virtualenv sys.prefix is not properly resolved - # it is something like /path/to/python/bin/.. - return os.path.abspath(src_prefix) - - -try: - # Use getusersitepackages if this is present, as it ensures that the - # value is initialised properly. - user_site = site.getusersitepackages() # type: typing.Optional[str] -except AttributeError: - user_site = site.USER_SITE diff --git a/venv/Lib/site-packages/pip/_internal/main.py b/venv/Lib/site-packages/pip/_internal/main.py deleted file mode 100644 index 51eee15..0000000 --- a/venv/Lib/site-packages/pip/_internal/main.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import List, Optional - - -def main(args=None): - # type: (Optional[List[str]]) -> int - """This is preserved for old console scripts that may still be referencing - it. - - For additional details, see https://github.com/pypa/pip/issues/7498. - """ - from pip._internal.utils.entrypoints import _wrapper - - return _wrapper(args) diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__init__.py b/venv/Lib/site-packages/pip/_internal/metadata/__init__.py deleted file mode 100644 index 63335a1..0000000 --- a/venv/Lib/site-packages/pip/_internal/metadata/__init__.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import List, Optional - -from .base import BaseDistribution, BaseEnvironment - - -def get_default_environment(): - # type: () -> BaseEnvironment - """Get the default representation for the current environment. - - This returns an Environment instance from the chosen backend. The default - 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() - - -def get_environment(paths): - # type: (Optional[List[str]]) -> BaseEnvironment - """Get a representation of the environment specified by ``paths``. - - This returns an Environment instance from the chosen backend based on the - 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) - - -def get_wheel_distribution(wheel_path, canonical_name): - # type: (str, str) -> BaseDistribution - """Get the representation of the specified wheel's distribution metadata. - - This returns a Distribution instance from the chosen backend based on - the given wheel's ``.dist-info`` directory. - - :param canonical_name: Normalized project name of the given wheel. - """ - from .pkg_resources import Distribution - - return Distribution.from_wheel(wheel_path, canonical_name) diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index c4354905ab6264e651469660d6047fc1a7f390ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1724 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 diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc deleted file mode 100644 index 1d9cb303415d51b65222c553072ebb37f2e2066c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4252 zcmbVP&2JmI6(?s#(pX=XE!jyn8$<<)VwG;xv{-D@U|YD`d^G67+l3biI#4kli?lWN zjAlZPZCI6o0?xJQwTB+;WBw)f*i-(6y|nLfG}4T%6y2pj>XCdTAAj$IZ@fmMN}$BS zeeWMFLjH}Ne6gUj1y%kN8b%lmh=cz|KtsbZLenur%dseqnL#NmJ7rBuThpar zC9FC%O_zgu*l-$}t_00+)mhcF9kjwVXAS5TRt?s}w$lzfPAA-OHYj;PSdG=+5?1H! z3)9(zeuFik-{c+W-(qx!^j6=4gk-yCD*I)^g_lG^Szq}wQTEqy;zwgI=uy>(j}BbH zWppftT*AQG&>Kf%f9M7Ngu7!eLSGJX*#S>ne=HL(2)KZO9~bs<8Jr{h zy<3=@pNN7GHV0f29+dS2+E0YYU3X{^74D$&BGbV^(>k{$AnZX?1P zvUi5EBoFqLg#f-IVgp#eJ9_qH!1xIdqIeLC=s^W1t3H@Dz-VNx<~ z{hY{0j|kPjKS4VsQ|kgv*xddWps9k5MW>D*fBqTRPG#c9`+mSx1xB6&ArQ`9Ntwey zDl7Jqk+RTil`+{D9hlP~rp+dFRdruPVQP>#Ez8glvqc}!$*saY7kooB+^istRo@h^ zJSB&4*Bv4dvYsK<;7{2>H1yE?-%-(qfooETE{xrUnnG+|gE(7UI2e_IFzbW2fWU(< z!I0p1<~$&3o=;#l)7jmESVg|?Efj=e46^PF zgjBpr)>|T(_!)@uFegr@AkJ*%hvh)ONx@k_V~7*P zB;Wxs|3yxW^#Uk*`UlD|17z$TOLS2P;U5H~<}bK@n-k`CL6{uVc5f9!J_bzJRaMsw zBX%4hU3c9#$6k=mh+D9kstp5AN^rkX#Ke6ZvB7;}E|N1H&%{q*OrS|>+Z2zGLPHUs zVe>gQ3-8htMr5%H4OaORXl!a*2CbH%;(ulKk94l;HA7%86g03csPZW^|1%-5<_W

|MyK#;|x`%dn&WoXPnC1<@LQ0)Ze4H7_f*j>Ew=D zys{Y4vV!zHy6HSZzq5G<#uq}>P9t#yIf5&B(xU<&nrnxv3gi3Uagclkb6G%Z=LML} z-?%fTz}kzOKuqC$@MCyvZpcu5oyxESA{bf(%p;T0br@z3vYz@TC(LGE82uJ&mV!Je z3o2d9^C=Jz&_I%NV+vAT5qJ_e&&{cMXiSYG1D->3{`_HnVNCw@+#j>9*F`VS^3`tW zCBqSb*G)#eySs}Xu)Ev!$GXoKNov1Z?as=#BVTqU_r!3-Wfz6*K7h34L1AOr^-erL zz>v0Nw@aQOa9z$mqo z_N+8Bxd*tVUb`$^>VOU5y$Tz=f+aeSB^8_2X%&8xZeCx@78NvyTElR!HHYpB8Ux*3 zq3#T^J~ej8q=hf{CFG1(l#BV; zixC68*GE8L8VB~;Jf{ix(*=D6iQ1bo-Z0B6@j^Q8iFKqFkrac8YP&bp{1=#z=p)1c z1>MgJw}gAUR~7h>ipSXe3LA`2;t4ie*r2jfa4~F&m)I=CSOj!@2VX$dAk6~04&HXd zzAbRJcU#(5*LC8Df7_>>ix;fMw{7$sA! g;k}o^rR*=#SNAt)AQDZ`rX8aWj#Zzv9kccLziZCk8~^|S diff --git a/venv/Lib/site-packages/pip/_internal/metadata/base.py b/venv/Lib/site-packages/pip/_internal/metadata/base.py deleted file mode 100644 index 37f9a82..0000000 --- a/venv/Lib/site-packages/pip/_internal/metadata/base.py +++ /dev/null @@ -1,142 +0,0 @@ -import logging -import re -from typing import Container, Iterator, List, Optional, Union - -from pip._vendor.packaging.version import LegacyVersion, Version - -from pip._internal.utils.misc import stdlib_pkgs # TODO: Move definition here. - -DistributionVersion = Union[LegacyVersion, Version] - -logger = logging.getLogger(__name__) - - -class BaseDistribution: - @property - def location(self): - # type: () -> Optional[str] - """Where the distribution is loaded from. - - A string value is not necessarily a filesystem path, since distributions - can be loaded from other sources, e.g. arbitrary zip archives. ``None`` - means the distribution is created in-memory. - """ - raise NotImplementedError() - - @property - def metadata_version(self): - # type: () -> Optional[str] - """Value of "Metadata-Version:" in the distribution, if available.""" - raise NotImplementedError() - - @property - def canonical_name(self): - # type: () -> str - raise NotImplementedError() - - @property - def version(self): - # type: () -> DistributionVersion - raise NotImplementedError() - - @property - def installer(self): - # type: () -> str - raise NotImplementedError() - - @property - def editable(self): - # type: () -> bool - raise NotImplementedError() - - @property - def local(self): - # type: () -> bool - raise NotImplementedError() - - @property - def in_usersite(self): - # type: () -> bool - raise NotImplementedError() - - -class BaseEnvironment: - """An environment containing distributions to introspect.""" - - @classmethod - def default(cls): - # type: () -> BaseEnvironment - raise NotImplementedError() - - @classmethod - def from_paths(cls, paths): - # type: (Optional[List[str]]) -> BaseEnvironment - raise NotImplementedError() - - def get_distribution(self, name): - # type: (str) -> Optional[BaseDistribution] - """Given a requirement name, return the installed distributions.""" - raise NotImplementedError() - - def _iter_distributions(self): - # type: () -> Iterator[BaseDistribution] - """Iterate through installed distributions. - - This function should be implemented by subclass, but never called - directly. Use the public ``iter_distribution()`` instead, which - implements additional logic to make sure the distributions are valid. - """ - raise NotImplementedError() - - def iter_distributions(self): - # type: () -> Iterator[BaseDistribution] - """Iterate through installed distributions.""" - for dist in self._iter_distributions(): - # Make sure the distribution actually comes from a valid Python - # packaging distribution. Pip's AdjacentTempDirectory leaves folders - # e.g. ``~atplotlib.dist-info`` if cleanup was interrupted. The - # valid project name pattern is taken from PEP 508. - project_name_valid = re.match( - r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", - dist.canonical_name, - flags=re.IGNORECASE, - ) - if not project_name_valid: - logger.warning( - "Ignoring invalid distribution %s (%s)", - dist.canonical_name, - dist.location, - ) - continue - yield dist - - def iter_installed_distributions( - self, - local_only=True, # type: bool - skip=stdlib_pkgs, # type: Container[str] - include_editables=True, # type: bool - editables_only=False, # type: bool - user_only=False, # type: bool - ): - # type: (...) -> Iterator[BaseDistribution] - """Return a list of installed distributions. - - :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; - defaults to ``stdlib_pkgs``. - :param include_editables: If False, don't report editables. - :param editables_only: If True, only report editables. - :param user_only: If True, only report installations in the user - site directory. - """ - it = self.iter_distributions() - if local_only: - it = (d for d in it if d.local) - if not include_editables: - it = (d for d in it if not d.editable) - if editables_only: - it = (d for d in it if d.editable) - if user_only: - it = (d for d in it if d.in_usersite) - return (d for d in it if d.canonical_name not in skip) diff --git a/venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py b/venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py deleted file mode 100644 index f39a39e..0000000 --- a/venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +++ /dev/null @@ -1,126 +0,0 @@ -import zipfile -from typing import Iterator, List, Optional - -from pip._vendor import pkg_resources -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.utils import misc # TODO: Move definition here. -from pip._internal.utils.packaging import get_installer -from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel - -from .base import BaseDistribution, BaseEnvironment, DistributionVersion - - -class Distribution(BaseDistribution): - def __init__(self, dist): - # type: (pkg_resources.Distribution) -> None - self._dist = dist - - @classmethod - def from_wheel(cls, path, name): - # type: (str, str) -> Distribution - with zipfile.ZipFile(path, allowZip64=True) as zf: - dist = pkg_resources_distribution_for_wheel(zf, name, path) - return cls(dist) - - @property - def location(self): - # type: () -> Optional[str] - return self._dist.location - - @property - def metadata_version(self): - # type: () -> Optional[str] - for line in self._dist.get_metadata_lines(self._dist.PKG_INFO): - if line.lower().startswith("metadata-version:"): - return line.split(":", 1)[-1].strip() - return None - - @property - def canonical_name(self): - # type: () -> str - return canonicalize_name(self._dist.project_name) - - @property - def version(self): - # type: () -> DistributionVersion - return parse_version(self._dist.version) - - @property - def installer(self): - # type: () -> str - return get_installer(self._dist) - - @property - def editable(self): - # type: () -> bool - return misc.dist_is_editable(self._dist) - - @property - def local(self): - # type: () -> bool - return misc.dist_is_local(self._dist) - - @property - def in_usersite(self): - # type: () -> bool - return misc.dist_in_usersite(self._dist) - - -class Environment(BaseEnvironment): - def __init__(self, ws): - # type: (pkg_resources.WorkingSet) -> None - self._ws = ws - - @classmethod - def default(cls): - # type: () -> BaseEnvironment - return cls(pkg_resources.working_set) - - @classmethod - def from_paths(cls, paths): - # type: (Optional[List[str]]) -> BaseEnvironment - return cls(pkg_resources.WorkingSet(paths)) - - def _search_distribution(self, name): - # type: (str) -> Optional[BaseDistribution] - """Find a distribution matching the ``name`` in the environment. - - This searches from *all* distributions available in the environment, to - match the behavior of ``pkg_resources.get_distribution()``. - """ - canonical_name = canonicalize_name(name) - for dist in self.iter_distributions(): - if dist.canonical_name == canonical_name: - return dist - return None - - def get_distribution(self, name): - # type: (str) -> Optional[BaseDistribution] - - # Search the distribution by looking through the working set. - dist = self._search_distribution(name) - if dist: - return dist - - # If distribution could not be found, call working_set.require to - # update the working set, and try to find the distribution again. - # This might happen for e.g. when you install a package twice, once - # using setup.py develop and again using setup.py install. Now when - # running pip uninstall twice, the package gets removed from the - # working set in the first uninstall, so we have to populate the - # working set again so that pip knows about it and the packages gets - # picked up and is successfully uninstalled the second time too. - try: - # We didn't pass in any version specifiers, so this can never - # raise pkg_resources.VersionConflict. - self._ws.require(name) - except pkg_resources.DistributionNotFound: - return None - return self._search_distribution(name) - - def _iter_distributions(self): - # type: () -> Iterator[BaseDistribution] - for dist in self._ws: - yield Distribution(dist) diff --git a/venv/Lib/site-packages/pip/_internal/models/__init__.py b/venv/Lib/site-packages/pip/_internal/models/__init__.py deleted file mode 100644 index 7855226..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""A package that contains models that represent entities. -""" diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 1c4ba33fdfbd6ecce8fef6504bb44f59c81cacd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmYjMy-tHM49wSss#2eUtR3i#5aMTGWnn{>tnkH3E%GH+Vm_(75wFyhM_^;Zr3{>O zXWb3nD65X?l!;{-A-Y@UHgz+^b^12J^$67RS>3*t_ zazBNQq*14$-pI<-x2wm^a5zJZbwvDdZDDJFm?A%G5#?Nnw#yvW`0MOrR&-4CtO2ve8WtQSn4!dCII(-c;ww&^6V%1bX3lYtxXfkV zF-knqW-9S&|Lrd&F{n19_?|JR#}z8w>6gq6=_~FE>wCh zZd?sz8yK0P76Fju;d$%KLiu-P&(@&eqZnFOsGkeG`F|;;ta)x?6}^WV+FQM?=>>EtQKzBzW_~KUj_gG diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc deleted file mode 100644 index 2c9a16aa410a5b17b01f6f1b670a5c8a99ef424a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6285 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 BLVf@M diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc deleted file mode 100644 index c8ea1aa0daebcb658b134a394ddb46d3cb7884aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2529 zcmaJ@OK%%D5GJ_~tv0grGLp1On{CmTib#D0C}5;UfYeFbg9_9@4}wy5v!vyf_aT!j zJ65Di?IQURJ=n+mrM>o)zhIzEXSkMaB}P{mE;$@>=kd*q!i5E&z%xv4hpRCA8y9CE z3l{f*^a>1u2%3((fFM1(DzeIlGa*7bzDMw+!( za0h8xW&NSb$1+=!Md|%KEaE&1lhT4^la`mGFw3(z3X^y&c^0M;n2iT{nueKJRVr5z z-g5Ri(Xj(uNxD>!E)%qC2_~#Q>)PV7aD=;0yN;*{Z=ZBsQ5QbEYtj=JL}Q=q(QaKV zh(+M};-a_&?+d~Pov)M&4|A1<#e+O6RGy3<{UDQ}RKa?#0#GUJ$5|g2AfkhHm8ZeZ zMjUMfVK5A%&9E;6FerE;gE-Sgm?ToP{Q#b_p5^>WoP}z)ypU(f?(w1%p*gb$=M3lp zkiG-M1dJOIwOEinGNlt{R=3QGP3VMh;K2y|HS&^nz}c3Th4SF2s>1*bTgznql=G6P z1=u(mtS17xS@`Aje1G>lbrGl;D+E#qs2X#_~E^<@zjg=(^r zwZAOs=1W#Od9fjtLNkr46uLtn|5xGozHt zIezX2YJ?2J8q_wl$n1Z|OXuk}=Q?yFy3PRh8cYN|0QU{(0AM+=fb2sHT+TXU|Jn4j zXVW{uvuP7-aVwOl>u?6~ftkWz|y9cF&mI%Q~RH{aa4)U zWf&@ZqVQj^n2-Zd`jDzC1r=l zfDRm73FkWblYK{o3#X{Mg*mx(YXZ1?{PonH*uvdpYCOAROBC+J-lMR?4r-I?HhKVZ zc<+|L)6H7vh_=Sxwpv-#fEZWt90}*iHp*S5*aFhjS!_1XF@(z=&Z6PVjYD_ zK;WG1Fd50xg$n@t3Q<*BncOLD3}FSZ(|BFmfHIy)o{ox9m~iigh#;Gws( z`&df{47hg<7w`bw&jkV)Wq&#&yJWa1``f8(VNC!#rnZ#sahZ2@K2niXSW%j`DaWb_ za|80S4$T9aB2??9WuV?&JZXg{8%h_#IZBE*U3wMV&LODzjugDgBE1UNY77O|Ri8G_ z5P0u{dGDQb{{M5jN)d2{anhmr7hrO_GR;!$nN^jM@8i;7;1md#0YOITs_(^8{{m7P z!ABs2{nz8$^IEhFIY^e9(K!5AO4{7pQo3u3dpQl*q S-K*?h!NfLRTw)E@u>J!S!D^uZ diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc deleted file mode 100644 index 2cf77ba5fae5881b6e6f34f8ae292d24169591a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1182 zcmZ`%J8u**5VrSqo68*}3Pd~#w%sBZL>VE3cqmE}ML@M$$ueu_&d1)av7LyV(j`(V z{zF2SzvPyRzd!>sn;aYkmS!|F_Kd&zX83T}CvbHAgujUh`Hs%=ff#uSVxNH$M9`WP zbeD)ggy%$rXF(CjKtv)I$=9F=!S0E)vm-&@lYHd|N0zr## z47I<}BDx@lRD>crPm36bpozzBJ**Kf=?Di__ z?lRtpOq=#t328IQt&%3=RVA&>T${;8=vF~qKZBFUK0GqDPa5g!w(@_ZU2f6GC z@W4(xJLv3{(*PoUL7?Su-zPU{e1u5yRUg|UEsakZQ;l+r8T`{H0Jc^ieXO~$(x>2B zT`OmBlzxaEu*23c&E3Sr5Hks?9;iI@k(KpfSE!3zQ@_GkRdZ_@yCy&R+nrL#V_CPl z1X9O_&t|F_m-@s_+J=plE602WW@>n*}l zzRwu6cmx~6{D85~N4&nh=`mQI3c^6Kty>2acinei!K7|@uVh`r#a}e*h^B+I=+>qX zN@*0P;b3SmI$xhSr|r)6Htx!(HRJ91Ca$doig8qv);cNhBB$M?=bMWRC#{25i?qk+ zZ~Z4X_5)}fMm*}a?S@zc;G=_+gS{gC0Lf@A;r~OaPoLi~^MXQ#y@O4JcOC{b`jv#J Fe*@{LH(CGy diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc deleted file mode 100644 index cc9e805ddda0a0b799f3050d14fd04b32aa44383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7186 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 diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-39.pyc deleted file mode 100644 index 7b445e0bea202508c12f581924eec28310f6df30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3269 zcmcImOOM>f5oR|zGo0C7NeC=iavtu3lW2f7k;wLCAq!3-<$(liAzAytj6rj!duA!| zcUDposUJ=G&(U1G? zyOR%!op^_Nzwu;O_MUsPcfsRb$^PUG!xzx)9S;2__(NuF6MkIVtSZyI=^V}KTn$;{ zAEnbFZ}z6jCT3RGm9|PYH&2x|n3-hdq)Kd+l$ES3rr#@~NNX?Cj0q@Hh`xe3za%rw`s0!S9Bv?*cR z^lO+0{e@`;>lMxQb=!g3>?EhaQ6@H>n!|AiFkN03<#Aj_uMs8PMnj|2sSHEPSl)Edt1J!65sK4&=aT-I3JO zMoTBX?|Ys*HGzFlr#daf>Np4D7a~U#5z@wLKnc*bI0V3v_}#=c_JvWY9-qJ;fMBJH z)Gfg#zok~BT8UM-iQ~ER=6I$xa1>^4tSTb$Fl~<^$3`f8DII zvTGaiYK*X&w}G??>2@Fi*iux>%oLUqlQ2dQ8=)1#*Z>s3OU%Z(q)uTD*WF7aq6+d(hauSI?1>yY8ZZ;<(Zwkl!)s2PmS1OrMp8hnU!OL zU!(>}{hAfqsYv#;fx3><@79dN7f2wlVbKeY_i#^B321!4-|TMUuS4n&o>W=c_(fV{ ziq(1toqCtV9*JutP&qt(17g^10;BRtJLbCA^J(h8JpC44FSADnBdJbRUezPGYl<8$ z5Im#W5h+xfj?0!Mnxr6ZbmJIf(D6^ z;h!cG;T`g)}hp39dB1r zaXEXqioRdFlyO|)SbkrWRrxNFnn-P%?k$;7`hyEMviVSd4|Z;yg4|9gG4v213-7aQ z=gfKwcELXNnD+&j9xPyoL#A(I9Ho~>KWhSTt#$ru1p(Uh?@v{!zO40w-;+Ah9k8?g zEiBuNZwpj(-w}>^5Um!r(Q*?j*U|Noi7lJSUMknl=DTRXW-;RDC@Cl<9?<6t_7(iF z;9v2-`5UL;hcDTO&fuZ1e~6Wh|5VMJ4hq{$T{(?@8{?nQHdNjM#76jP*l`J>38>c6 zRY*hO9rVW6m#AM>-gtl=sB+Gfxw1pEy9vfa+KLjw>jZ3oJ9rg#LfV#v-vr$O_&Mw90pBq$zN+fH38A> zu;=KhbtL_@Xo6}z%MsczaNca$?8g{y0y@!E2ZluVG(h>^I{kNLtMjg4M|w#jt1-I!Nn-NKnk3ObAnV^D zL8-7|A;prWywrUNB6dURAM&6R?jp14{?A|--g4vM{x>k%bnUzb`)W#FO_`=Cn&P)W zun}Uql$DNJ*2S#IfkG@8|HMtWWZ($@9Jz^JuaYg;1bcJ)+g22r8M|WRjQY0IG~xXg Uod?9mhRzkTH~22U!FK)s0z24c2LJ#7 diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-39.pyc deleted file mode 100644 index b12179c4c35b5a532000657d7dc3841d2e14a92b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4184 zcmc&&&2QYs73YxLPp=dw6=KIo9TrUyuVb-B>J)*X%4uV{a8S60ox1II9d@)cyGw;j zQZtlnEmoJxKyzw=UW)?OE&i8?-g@e}w;+J~d&B+U+ENh|1xkTKaz5UB^WN|G=B@b3 zO4GuXM(^;;tCsZ-`Y2xxK0d~+KSd*~jwP6|Bi3PfI*~ncI?l-LxT8v^!f4Ems-s$` zX5K4NebneQnDui@R7LHnC2GfZrzz|QR=Ym_{e77#sb!pLk9&`YQbt}sjHJh7;iW1$ z2!+H*uP3$kvc$`V(mUWPO!l>xa)nh%pE{c{A4$CM%p39p>5U|h!+78~{|Sq&yKN_T zZ-u=quiwd};yaPd-Cu+{YqQ+>j1TZwyAvPqC=|aY6K=x-64;}~<;%s#$GG)vG}3|t ztd1>M$C2){im;`-TRpKmHQ@;Nsnw~Aim2k*5H(T9vnd*)iRU?SPPFiBi4{0uHLn<@ zFq(9I0Uxc0aX)Fl+q1Fd*+qaLU(i#3h2~3Z z*Lub#?1UZJ6I)-->aKo)x2dLldP4(+vDHNce$Z>r~$9jLcc+= zhz;Hdj|N_$_QC=sUO!PYyw1gq-|;XbPBM%bES17Z>;2rNN6vz;*?R6E9(lzCE3cU7 z+5KS*2H>re2iQ)aQ{I!^0~sH5qj0CI!%VKD>kB@Rx|@b+Hwa^p zF6L2pln5E=uA#Y~9_EcrEwf%SO1IvpjaAW9na$Q-jK60n;Rje7W= zVt@4)u2W@e&Khg6H|Wo4GWW%Jb$QQA03a|B**?Lo*U)4p2R{W2DD21Vm?4!o;~V#7 zwyz4@8q?lG+Jw;_r~IlDl}X`6U^V4UohbxV`%9XL=A=o}O{N2At4A!eCeZQFV%DB5 zEC7n#rQ`__&uv8p zQQJ?`B96vi&H1w1$Vu`EAElAJ=7r{1R5(a+f8^<H670vi+0o18MNP&P-fZTfuH=f(MgAqdv5YZ&2ACe$L4WHgjGJ5?LVIN|wV8-hB z!WjyCln7=Qy?4A0(le+s9+jI+d};PLTy-$(5&j=tT?p*|Tt_o1oE5mDGP_2Yay#PGtWa1;4)!Sa$H zXSLb?f!_pl!*4pX!S6TA{GPD4ti>s4*j;dK%Iw#$^hiA-w2>iD&#bSTB$_6k*VRJ;d4-V6{ev5%57$Xh|Mx6h;L zNG%9N(nGh6VzfrP#<`l;9&X?N*)Jb#tGCI3cd5BX4M9x(n3|8MSrjyL^HdE3E!?K! zt25U|_2{_YxV8GFdZm88zGh~$t4@Dnt7H9Mr_rD!XPVx}l(=a*23`vJ-bktn~Y z&N0g;$D3aQ`9(8fR;l~)Nl&JxDlz4>(Q}%Kd402R#uinmn*NR8I(4>Yx9pblZ|ui= A3;+NC diff --git a/venv/Lib/site-packages/pip/_internal/models/candidate.py b/venv/Lib/site-packages/pip/_internal/models/candidate.py deleted file mode 100644 index 3b91704..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/candidate.py +++ /dev/null @@ -1,34 +0,0 @@ -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.models.link import Link -from pip._internal.utils.models import KeyBasedCompareMixin - - -class InstallationCandidate(KeyBasedCompareMixin): - """Represents a potential "candidate" for installation. - """ - - __slots__ = ["name", "version", "link"] - - def __init__(self, name, version, link): - # type: (str, str, Link) -> None - self.name = name - self.version = parse_version(version) - self.link = link - - super().__init__( - key=(self.name, self.version, self.link), - defining_class=InstallationCandidate - ) - - def __repr__(self): - # type: () -> str - return "".format( - self.name, self.version, self.link, - ) - - def __str__(self): - # type: () -> str - return '{!r} candidate (version {} at {})'.format( - self.name, self.version, self.link, - ) diff --git a/venv/Lib/site-packages/pip/_internal/models/direct_url.py b/venv/Lib/site-packages/pip/_internal/models/direct_url.py deleted file mode 100644 index 345dbaf..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/direct_url.py +++ /dev/null @@ -1,233 +0,0 @@ -""" PEP 610 """ -import json -import re -import urllib.parse -from typing import Any, Dict, Iterable, Optional, Type, TypeVar, Union - -__all__ = [ - "DirectUrl", - "DirectUrlValidationError", - "DirInfo", - "ArchiveInfo", - "VcsInfo", -] - -T = TypeVar("T") - -DIRECT_URL_METADATA_NAME = "direct_url.json" -ENV_VAR_RE = re.compile(r"^\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?$") - - -class DirectUrlValidationError(Exception): - pass - - -def _get(d, expected_type, key, default=None): - # type: (Dict[str, Any], Type[T], str, Optional[T]) -> Optional[T] - """Get value from dictionary and verify expected type.""" - if key not in d: - return default - value = d[key] - if not isinstance(value, expected_type): - raise DirectUrlValidationError( - "{!r} has unexpected type for {} (expected {})".format( - value, key, expected_type - ) - ) - return value - - -def _get_required(d, expected_type, key, default=None): - # type: (Dict[str, Any], Type[T], str, Optional[T]) -> T - value = _get(d, expected_type, key, default) - if value is None: - raise DirectUrlValidationError(f"{key} must have a value") - return value - - -def _exactly_one_of(infos): - # type: (Iterable[Optional[InfoType]]) -> InfoType - infos = [info for info in infos if info is not None] - if not infos: - raise DirectUrlValidationError( - "missing one of archive_info, dir_info, vcs_info" - ) - if len(infos) > 1: - raise DirectUrlValidationError( - "more than one of archive_info, dir_info, vcs_info" - ) - assert infos[0] is not None - return infos[0] - - -def _filter_none(**kwargs): - # type: (Any) -> Dict[str, Any] - """Make dict excluding None values.""" - return {k: v for k, v in kwargs.items() if v is not None} - - -class VcsInfo: - name = "vcs_info" - - def __init__( - self, - vcs, # type: str - commit_id, # type: str - requested_revision=None, # type: Optional[str] - resolved_revision=None, # type: Optional[str] - resolved_revision_type=None, # type: Optional[str] - ): - 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): - # type: (Optional[Dict[str, Any]]) -> Optional[VcsInfo] - if d is None: - return None - return cls( - 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): - # type: () -> Dict[str, Any] - return _filter_none( - 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, - ) - - -class ArchiveInfo: - name = "archive_info" - - def __init__( - self, - hash=None, # type: Optional[str] - ): - self.hash = hash - - @classmethod - def _from_dict(cls, d): - # type: (Optional[Dict[str, Any]]) -> Optional[ArchiveInfo] - if d is None: - return None - return cls(hash=_get(d, str, "hash")) - - def _to_dict(self): - # type: () -> Dict[str, Any] - return _filter_none(hash=self.hash) - - -class DirInfo: - name = "dir_info" - - def __init__( - self, - editable=False, # type: bool - ): - self.editable = editable - - @classmethod - def _from_dict(cls, d): - # type: (Optional[Dict[str, Any]]) -> Optional[DirInfo] - if d is None: - return None - return cls( - editable=_get_required(d, bool, "editable", default=False) - ) - - def _to_dict(self): - # type: () -> Dict[str, Any] - return _filter_none(editable=self.editable or None) - - -InfoType = Union[ArchiveInfo, DirInfo, VcsInfo] - - -class DirectUrl: - - def __init__( - self, - url, # type: str - info, # type: InfoType - subdirectory=None, # type: Optional[str] - ): - self.url = url - self.info = info - self.subdirectory = subdirectory - - def _remove_auth_from_netloc(self, netloc): - # type: (str) -> str - if "@" not in netloc: - return netloc - user_pass, netloc_no_user_pass = netloc.split("@", 1) - if ( - isinstance(self.info, VcsInfo) and - self.info.vcs == "git" and - user_pass == "git" - ): - return netloc - if ENV_VAR_RE.match(user_pass): - return netloc - return netloc_no_user_pass - - @property - def redacted_url(self): - # type: () -> str - """url with user:password part removed unless it is formed with - environment variables as specified in PEP 610, or it is ``git`` - in the case of a git URL. - """ - purl = urllib.parse.urlsplit(self.url) - netloc = self._remove_auth_from_netloc(purl.netloc) - surl = urllib.parse.urlunsplit( - (purl.scheme, netloc, purl.path, purl.query, purl.fragment) - ) - return surl - - def validate(self): - # type: () -> None - self.from_dict(self.to_dict()) - - @classmethod - def from_dict(cls, d): - # type: (Dict[str, Any]) -> DirectUrl - return DirectUrl( - url=_get_required(d, str, "url"), - subdirectory=_get(d, str, "subdirectory"), - info=_exactly_one_of( - [ - ArchiveInfo._from_dict(_get(d, dict, "archive_info")), - DirInfo._from_dict(_get(d, dict, "dir_info")), - VcsInfo._from_dict(_get(d, dict, "vcs_info")), - ] - ), - ) - - def to_dict(self): - # type: () -> Dict[str, Any] - res = _filter_none( - url=self.redacted_url, - subdirectory=self.subdirectory, - ) - res[self.info.name] = self.info._to_dict() - return res - - @classmethod - def from_json(cls, s): - # type: (str) -> DirectUrl - return cls.from_dict(json.loads(s)) - - def to_json(self): - # type: () -> str - return json.dumps(self.to_dict(), sort_keys=True) diff --git a/venv/Lib/site-packages/pip/_internal/models/format_control.py b/venv/Lib/site-packages/pip/_internal/models/format_control.py deleted file mode 100644 index cf262af..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/format_control.py +++ /dev/null @@ -1,86 +0,0 @@ -from typing import FrozenSet, Optional, Set - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.exceptions import CommandError - - -class FormatControl: - """Helper for managing formats from which a package can be installed. - """ - - __slots__ = ["no_binary", "only_binary"] - - def __init__(self, no_binary=None, only_binary=None): - # type: (Optional[Set[str]], Optional[Set[str]]) -> None - if no_binary is None: - no_binary = set() - if only_binary is None: - only_binary = set() - - self.no_binary = no_binary - self.only_binary = only_binary - - def __eq__(self, other): - # type: (object) -> bool - if not isinstance(other, self.__class__): - return NotImplemented - - if self.__slots__ != other.__slots__: - return False - - return all( - getattr(self, k) == getattr(other, k) - for k in self.__slots__ - ) - - def __repr__(self): - # type: () -> str - return "{}({}, {})".format( - self.__class__.__name__, - self.no_binary, - self.only_binary - ) - - @staticmethod - def handle_mutual_excludes(value, target, other): - # type: (str, Set[str], Set[str]) -> None - if value.startswith('-'): - raise CommandError( - "--no-binary / --only-binary option requires 1 argument." - ) - new = value.split(',') - while ':all:' in new: - other.clear() - target.clear() - target.add(':all:') - del new[:new.index(':all:') + 1] - # Without a none, we want to discard everything as :all: covers it - if ':none:' not in new: - return - for name in new: - if name == ':none:': - target.clear() - continue - name = canonicalize_name(name) - other.discard(name) - target.add(name) - - def get_allowed_formats(self, canonical_name): - # type: (str) -> FrozenSet[str] - result = {"binary", "source"} - if canonical_name in self.only_binary: - result.discard('source') - elif canonical_name in self.no_binary: - result.discard('binary') - elif ':all:' in self.only_binary: - result.discard('source') - elif ':all:' in self.no_binary: - result.discard('binary') - return frozenset(result) - - def disallow_binaries(self): - # type: () -> None - self.handle_mutual_excludes( - ':all:', self.no_binary, self.only_binary, - ) diff --git a/venv/Lib/site-packages/pip/_internal/models/index.py b/venv/Lib/site-packages/pip/_internal/models/index.py deleted file mode 100644 index b148abb..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/index.py +++ /dev/null @@ -1,34 +0,0 @@ -import urllib.parse - - -class PackageIndex: - """Represents a Package Index and provides easier access to endpoints - """ - - __slots__ = ['url', 'netloc', 'simple_url', 'pypi_url', - 'file_storage_domain'] - - def __init__(self, url, file_storage_domain): - # type: (str, str) -> None - super().__init__() - self.url = url - self.netloc = urllib.parse.urlsplit(url).netloc - self.simple_url = self._url_for_path('simple') - self.pypi_url = self._url_for_path('pypi') - - # This is part of a temporary hack used to block installs of PyPI - # packages which depend on external urls only necessary until PyPI can - # block such packages themselves - self.file_storage_domain = file_storage_domain - - def _url_for_path(self, path): - # type: (str) -> str - return urllib.parse.urljoin(self.url, path) - - -PyPI = PackageIndex( - 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' -) -TestPyPI = PackageIndex( - 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' -) diff --git a/venv/Lib/site-packages/pip/_internal/models/link.py b/venv/Lib/site-packages/pip/_internal/models/link.py deleted file mode 100644 index 86d0be4..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/link.py +++ /dev/null @@ -1,248 +0,0 @@ -import os -import posixpath -import re -import urllib.parse -from typing import TYPE_CHECKING, Optional, Tuple, Union - -from pip._internal.utils.filetypes import WHEEL_EXTENSION -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.misc import ( - redact_auth_from_url, - split_auth_from_netloc, - splitext, -) -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 - - -class Link(KeyBasedCompareMixin): - """Represents a parsed link from a Package Index's simple URL - """ - - __slots__ = [ - "_parsed_url", - "_url", - "comes_from", - "requires_python", - "yanked_reason", - "cache_link_parsing", - ] - - def __init__( - self, - url, # type: str - comes_from=None, # type: Optional[Union[str, HTMLPage]] - requires_python=None, # type: Optional[str] - yanked_reason=None, # type: Optional[str] - cache_link_parsing=True, # type: bool - ): - # type: (...) -> None - """ - :param url: url of the resource pointed to (href of the link) - :param comes_from: instance of HTMLPage 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 - a data-requires-python attribute in the HTML link tag, as - described in PEP 503. - :param yanked_reason: the reason the file has been yanked, if the - file has been yanked, or None if the file hasn't been yanked. - This is the value of the "data-yanked" attribute, if present, in - a simple repository HTML link. If the file has been yanked but - no reason was provided, this should be the empty string. See - PEP 592 for more information and the specification. - :param cache_link_parsing: A flag that is used elsewhere to determine - whether resources retrieved from this link - should be cached. PyPI index urls should - generally have this set to False, for - example. - """ - - # url can be a UNC windows share - if url.startswith('\\\\'): - url = path_to_url(url) - - self._parsed_url = urllib.parse.urlsplit(url) - # Store the url as a private attribute to prevent accidentally - # trying to set a new value. - self._url = url - - self.comes_from = comes_from - self.requires_python = requires_python if requires_python else None - self.yanked_reason = yanked_reason - - super().__init__(key=url, defining_class=Link) - - self.cache_link_parsing = cache_link_parsing - - def __str__(self): - # type: () -> str - if self.requires_python: - rp = f' (requires-python:{self.requires_python})' - else: - rp = '' - if self.comes_from: - return '{} (from {}){}'.format( - redact_auth_from_url(self._url), self.comes_from, rp) - else: - return redact_auth_from_url(str(self._url)) - - def __repr__(self): - # type: () -> str - return f'' - - @property - def url(self): - # type: () -> str - return self._url - - @property - def filename(self): - # type: () -> str - path = self.path.rstrip('/') - name = posixpath.basename(path) - if not name: - # Make sure we don't leak auth information if the netloc - # includes a username and password. - netloc, user_pass = split_auth_from_netloc(self.netloc) - return netloc - - name = urllib.parse.unquote(name) - assert name, f'URL {self._url!r} produced no filename' - return name - - @property - def file_path(self): - # type: () -> str - return url_to_path(self.url) - - @property - def scheme(self): - # type: () -> str - return self._parsed_url.scheme - - @property - def netloc(self): - # type: () -> str - """ - This can contain auth information. - """ - return self._parsed_url.netloc - - @property - def path(self): - # type: () -> str - return urllib.parse.unquote(self._parsed_url.path) - - def splitext(self): - # type: () -> Tuple[str, str] - return splitext(posixpath.basename(self.path.rstrip('/'))) - - @property - def ext(self): - # type: () -> str - return self.splitext()[1] - - @property - def url_without_fragment(self): - # type: () -> str - scheme, netloc, path, query, fragment = self._parsed_url - return urllib.parse.urlunsplit((scheme, netloc, path, query, None)) - - _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') - - @property - def egg_fragment(self): - # type: () -> Optional[str] - match = self._egg_fragment_re.search(self._url) - if not match: - return None - return match.group(1) - - _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') - - @property - def subdirectory_fragment(self): - # type: () -> Optional[str] - match = self._subdirectory_fragment_re.search(self._url) - if not match: - return None - return match.group(1) - - _hash_re = re.compile( - r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' - ) - - @property - def hash(self): - # type: () -> Optional[str] - match = self._hash_re.search(self._url) - if match: - return match.group(2) - return None - - @property - def hash_name(self): - # type: () -> Optional[str] - match = self._hash_re.search(self._url) - if match: - return match.group(1) - return None - - @property - def show_url(self): - # type: () -> str - return posixpath.basename(self._url.split('#', 1)[0].split('?', 1)[0]) - - @property - def is_file(self): - # type: () -> bool - return self.scheme == 'file' - - def is_existing_dir(self): - # type: () -> bool - return self.is_file and os.path.isdir(self.file_path) - - @property - def is_wheel(self): - # type: () -> bool - return self.ext == WHEEL_EXTENSION - - @property - def is_vcs(self): - # type: () -> bool - from pip._internal.vcs import vcs - - return self.scheme in vcs.all_schemes - - @property - def is_yanked(self): - # type: () -> bool - return self.yanked_reason is not None - - @property - def has_hash(self): - # type: () -> bool - return self.hash_name is not None - - def is_hash_allowed(self, hashes): - # type: (Optional[Hashes]) -> bool - """ - Return True if the link has a hash and it is allowed. - """ - if hashes is None or not self.has_hash: - return False - # Assert non-None so mypy knows self.hash_name and self.hash are str. - assert self.hash_name is not None - assert self.hash is not None - - return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash) - - -# TODO: Relax this comparison logic to ignore, for example, fragments. -def links_equivalent(link1, link2): - # type: (Link, Link) -> bool - return link1 == link2 diff --git a/venv/Lib/site-packages/pip/_internal/models/scheme.py b/venv/Lib/site-packages/pip/_internal/models/scheme.py deleted file mode 100644 index 697cd19..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/scheme.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -For types associated with installation schemes. - -For a general overview of available schemes and their context, see -https://docs.python.org/3/install/index.html#alternate-installation. -""" - - -SCHEME_KEYS = ['platlib', 'purelib', 'headers', 'scripts', 'data'] - - -class Scheme: - """A Scheme holds paths which are used as the base directories for - artifacts associated with a Python package. - """ - - __slots__ = SCHEME_KEYS - - def __init__( - self, - platlib, # type: str - purelib, # type: str - headers, # type: str - scripts, # type: str - data, # type: str - ): - self.platlib = platlib - self.purelib = purelib - self.headers = headers - self.scripts = scripts - self.data = data diff --git a/venv/Lib/site-packages/pip/_internal/models/search_scope.py b/venv/Lib/site-packages/pip/_internal/models/search_scope.py deleted file mode 100644 index a3f0a5c..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/search_scope.py +++ /dev/null @@ -1,131 +0,0 @@ -import itertools -import logging -import os -import posixpath -import urllib.parse -from typing import List - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.models.index import PyPI -from pip._internal.utils.compat import has_tls -from pip._internal.utils.misc import normalize_path, redact_auth_from_url - -logger = logging.getLogger(__name__) - - -class SearchScope: - - """ - Encapsulates the locations that pip is configured to search. - """ - - __slots__ = ["find_links", "index_urls"] - - @classmethod - def create( - cls, - find_links, # type: List[str] - index_urls, # type: List[str] - ): - # type: (...) -> SearchScope - """ - Create a SearchScope object after normalizing the `find_links`. - """ - # Build find_links. If an argument starts with ~, it may be - # a local file relative to a home directory. So try normalizing - # it and if it exists, use the normalized version. - # This is deliberately conservative - it might be fine just to - # blindly normalize anything starting with a ~... - built_find_links = [] # type: List[str] - for link in find_links: - if link.startswith('~'): - new_link = normalize_path(link) - if os.path.exists(new_link): - link = new_link - built_find_links.append(link) - - # If we don't have TLS enabled, then WARN if anyplace we're looking - # relies on TLS. - if not has_tls(): - for link in itertools.chain(index_urls, built_find_links): - parsed = urllib.parse.urlparse(link) - if parsed.scheme == 'https': - logger.warning( - 'pip is configured with locations that require ' - 'TLS/SSL, however the ssl module in Python is not ' - 'available.' - ) - break - - return cls( - find_links=built_find_links, - index_urls=index_urls, - ) - - def __init__( - self, - find_links, # type: List[str] - index_urls, # type: List[str] - ): - # type: (...) -> None - self.find_links = find_links - self.index_urls = index_urls - - def get_formatted_locations(self): - # type: () -> str - lines = [] - redacted_index_urls = [] - if self.index_urls and self.index_urls != [PyPI.simple_url]: - for url in self.index_urls: - - redacted_index_url = redact_auth_from_url(url) - - # Parse the URL - purl = urllib.parse.urlsplit(redacted_index_url) - - # URL is generally invalid if scheme and netloc is missing - # there are issues with Python and URL parsing, so this test - # is a bit crude. See bpo-20271, bpo-23505. Python doesn't - # always parse invalid URLs correctly - it should raise - # exceptions for malformed URLs - if not purl.scheme and not purl.netloc: - logger.warning( - 'The index url "%s" seems invalid, ' - 'please provide a scheme.', redacted_index_url) - - redacted_index_urls.append(redacted_index_url) - - lines.append('Looking in indexes: {}'.format( - ', '.join(redacted_index_urls))) - - if self.find_links: - lines.append( - 'Looking in links: {}'.format(', '.join( - redact_auth_from_url(url) for url in self.find_links)) - ) - return '\n'.join(lines) - - def get_index_urls_locations(self, project_name): - # type: (str) -> List[str] - """Returns the locations found via self.index_urls - - Checks the url_name on the main (first in the list) index and - use this url_name to produce all locations - """ - - def mkurl_pypi_url(url): - # type: (str) -> str - loc = posixpath.join( - url, - urllib.parse.quote(canonicalize_name(project_name))) - # For maximum compatibility with easy_install, ensure the path - # ends in a trailing slash. Although this isn't in the spec - # (and PyPI can handle it without the slash) some other index - # implementations might break if they relied on easy_install's - # behavior. - if not loc.endswith('/'): - loc = loc + '/' - return loc - - return [mkurl_pypi_url(url) for url in self.index_urls] diff --git a/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py b/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py deleted file mode 100644 index edc1cf7..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +++ /dev/null @@ -1,47 +0,0 @@ -from typing import Optional - -from pip._internal.models.format_control import FormatControl - - -class SelectionPreferences: - """ - Encapsulates the candidate selection preferences for downloading - and installing files. - """ - - __slots__ = ['allow_yanked', 'allow_all_prereleases', 'format_control', - 'prefer_binary', 'ignore_requires_python'] - - # Don't include an allow_yanked default value to make sure each call - # site considers whether yanked releases are allowed. This also causes - # that decision to be made explicit in the calling code, which helps - # people when reading the code. - def __init__( - self, - allow_yanked, # type: bool - allow_all_prereleases=False, # type: bool - format_control=None, # type: Optional[FormatControl] - prefer_binary=False, # type: bool - ignore_requires_python=None, # type: Optional[bool] - ): - # type: (...) -> None - """Create a SelectionPreferences object. - - :param allow_yanked: Whether files marked as yanked (in the sense - of PEP 592) are permitted to be candidates for install. - :param format_control: A FormatControl object or None. Used to control - the selection of source packages / binary packages when consulting - the index and links. - :param prefer_binary: Whether to prefer an old, but valid, binary - dist over a new source dist. - :param ignore_requires_python: Whether to ignore incompatible - "Requires-Python" values in links. Defaults to False. - """ - if ignore_requires_python is None: - ignore_requires_python = False - - self.allow_yanked = allow_yanked - self.allow_all_prereleases = allow_all_prereleases - self.format_control = format_control - self.prefer_binary = prefer_binary - self.ignore_requires_python = ignore_requires_python diff --git a/venv/Lib/site-packages/pip/_internal/models/target_python.py b/venv/Lib/site-packages/pip/_internal/models/target_python.py deleted file mode 100644 index b91e349..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/target_python.py +++ /dev/null @@ -1,114 +0,0 @@ -import sys -from typing import List, Optional, Tuple - -from pip._vendor.packaging.tags import Tag - -from pip._internal.utils.compatibility_tags import get_supported, version_info_to_nodot -from pip._internal.utils.misc import normalize_version_info - - -class TargetPython: - - """ - Encapsulates the properties of a Python interpreter one is targeting - for a package install, download, etc. - """ - - __slots__ = [ - "_given_py_version_info", - "abis", - "implementation", - "platforms", - "py_version", - "py_version_info", - "_valid_tags", - ] - - def __init__( - self, - platforms=None, # type: Optional[List[str]] - py_version_info=None, # type: Optional[Tuple[int, ...]] - abis=None, # type: Optional[List[str]] - implementation=None, # type: Optional[str] - ): - # type: (...) -> None - """ - :param platforms: A list of strings or None. If None, searches for - packages that are supported by the current system. Otherwise, will - find packages that can be built on the platforms passed in. These - packages will only be downloaded for distribution: they will - not be built locally. - :param py_version_info: An optional tuple of ints representing the - Python version information to use (e.g. `sys.version_info[:3]`). - This can have length 1, 2, or 3 when provided. - :param abis: A list of strings or None. This is passed to - compatibility_tags.py's get_supported() function as is. - :param implementation: A string or None. This is passed to - compatibility_tags.py's get_supported() function as is. - """ - # Store the given py_version_info for when we call get_supported(). - self._given_py_version_info = py_version_info - - if py_version_info is None: - py_version_info = sys.version_info[:3] - else: - py_version_info = normalize_version_info(py_version_info) - - py_version = '.'.join(map(str, py_version_info[:2])) - - self.abis = abis - self.implementation = implementation - self.platforms = platforms - self.py_version = py_version - self.py_version_info = py_version_info - - # This is used to cache the return value of get_tags(). - self._valid_tags = None # type: Optional[List[Tag]] - - def format_given(self): - # type: () -> str - """ - Format the given, non-None attributes for display. - """ - display_version = None - if self._given_py_version_info is not None: - display_version = '.'.join( - str(part) for part in self._given_py_version_info - ) - - key_values = [ - ('platforms', self.platforms), - ('version_info', display_version), - ('abis', self.abis), - ('implementation', self.implementation), - ] - return ' '.join( - f'{key}={value!r}' for key, value in key_values - if value is not None - ) - - def get_tags(self): - # type: () -> List[Tag] - """ - Return the supported PEP 425 tags to check wheel candidates against. - - The tags are returned in order of preference (most preferred first). - """ - if self._valid_tags is None: - # Pass versions=None if no py_version_info was given since - # versions=None uses special default logic. - py_version_info = self._given_py_version_info - if py_version_info is None: - version = None - else: - version = version_info_to_nodot(py_version_info) - - tags = get_supported( - version=version, - platforms=self.platforms, - abis=self.abis, - impl=self.implementation, - ) - self._valid_tags = tags - - return self._valid_tags diff --git a/venv/Lib/site-packages/pip/_internal/models/wheel.py b/venv/Lib/site-packages/pip/_internal/models/wheel.py deleted file mode 100644 index 0a582b3..0000000 --- a/venv/Lib/site-packages/pip/_internal/models/wheel.py +++ /dev/null @@ -1,95 +0,0 @@ -"""Represents a wheel file and provides access to the various parts of the -name that have meaning. -""" -import re -from typing import Dict, Iterable, List - -from pip._vendor.packaging.tags import Tag - -from pip._internal.exceptions import InvalidWheelFilename - - -class Wheel: - """A wheel file""" - - wheel_file_re = re.compile( - r"""^(?P(?P.+?)-(?P.*?)) - ((-(?P\d[^-]*?))?-(?P.+?)-(?P.+?)-(?P.+?) - \.whl|\.dist-info)$""", - re.VERBOSE - ) - - def __init__(self, filename): - # type: (str) -> None - """ - :raises InvalidWheelFilename: when the filename is invalid for a wheel - """ - wheel_info = self.wheel_file_re.match(filename) - if not wheel_info: - raise InvalidWheelFilename( - f"{filename} is not a valid wheel filename." - ) - self.filename = filename - self.name = wheel_info.group('name').replace('_', '-') - # we'll assume "_" means "-" due to wheel naming scheme - # (https://github.com/pypa/pip/issues/1150) - self.version = wheel_info.group('ver').replace('_', '-') - self.build_tag = wheel_info.group('build') - self.pyversions = wheel_info.group('pyver').split('.') - self.abis = wheel_info.group('abi').split('.') - self.plats = wheel_info.group('plat').split('.') - - # All the tag combinations from this file - self.file_tags = { - Tag(x, y, z) for x in self.pyversions - for y in self.abis for z in self.plats - } - - def get_formatted_file_tags(self): - # type: () -> List[str] - """Return the wheel's tags as a sorted list of strings.""" - return sorted(str(tag) for tag in self.file_tags) - - def support_index_min(self, tags): - # type: (List[Tag]) -> int - """Return the lowest index that one of the wheel's file_tag combinations - achieves in the given list of supported tags. - - For example, if there are 8 supported tags and one of the file tags - is first in the list, then return 0. - - :param tags: the PEP 425 tags to check the wheel against, in order - with most preferred first. - - :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) - - def find_most_preferred_tag(self, tags, tag_to_priority): - # type: (List[Tag], Dict[Tag, int]) -> int - """Return the priority of the most preferred tag that one of the wheel's file - tag combinations acheives in the given list of supported tags using the given - tag_to_priority mapping, where lower priorities are more-preferred. - - This is used in place of support_index_min in some cases in order to avoid - an expensive linear scan of a large list of tags. - - :param tags: the PEP 425 tags to check the wheel against. - :param tag_to_priority: a mapping from tag to priority of that tag, where - lower is more preferred. - - :raises ValueError: If none of the wheel's file tags match one of - the supported tags. - """ - return min( - tag_to_priority[tag] for tag in self.file_tags if tag in tag_to_priority - ) - - def supported(self, tags): - # type: (Iterable[Tag]) -> bool - """Return whether the wheel is compatible with one of the given tags. - - :param tags: the PEP 425 tags to check the wheel against. - """ - return not self.file_tags.isdisjoint(tags) diff --git a/venv/Lib/site-packages/pip/_internal/network/__init__.py b/venv/Lib/site-packages/pip/_internal/network/__init__.py deleted file mode 100644 index b51bde9..0000000 --- a/venv/Lib/site-packages/pip/_internal/network/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""Contains purely network-related utilities. -""" diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index b391967eb19682fd44922953ecd74a459648bb53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmYk1u}T9$5Qg{C7y@|)uMLtEmLejEt&N=w3~P4S4B6WqcIQscH}aLz`UrMbPQ=0= z{(t!XVwmyk^~#wfUHWUApJ({5&fwnMmKMRixX?Yj&Eoy)p=9-(TQ6g!H20bGt<>Yz zz$=A*R8Fi+ZMS;bbf*i%Q1*x)t}blTZ+z3^4FsAf6#=OwRzD1!Bgm|Wk}>XlqpDin1k@%_u6#l-80>PgLSMis5x3;523z zyBJ{9jUhEt7#~6%d`Mi$RVk}>t9;2dr<{DqDY@r_9FwY)Qsql3CnY82dkxI&?AEX{ zQ)o0A{fF1@ecyX8TwQfF{D#T3@CRF(_HXpC_@lRPJ=@9J;Jklc)f>tB z;DUc)u;FhEp7Wm@T=XvvF8P<#J15y3T=p+BEn-JkqUVp9e>G}GFVMelT-N+=OUiJD|`#F01 zH-2#=b*uYb?XJdMzVeyozxX4KxA^L38eff8o*Mowu0PZ|?a6UB%AaK7(0gZ;??-7K z_rg5RQt$mJ8Ad|7?)@yy!#I^*oaT|}hrP&q>8GP4kKfG(X#Zg-;~tIecwx%DP|BMK53r`_1tEO|Rte={*+db<>2Q>nEvgRjU62wlH$*hZ9!IKk z&==Vt7>T63B8N$wSB;n~$$Im5SVQgUgS4N0_3}@mu^<`5(vyera0oGRNGZ=CJTLmR z7pV`r=iQP$oj$w%*|?J`-^V5Y2}Pj^C)XsD=AkzE)x^!U12)y6I_svE>*JRz)q&c) zc2~=dBa`ceMru;vUa+V7)F`0(BPRZ=Fb*tSb|0f3Y9B-CAEJl&wHjqqqjK%2LF10~ zsacrf*99xgS$|T@+!_BP)20?FCdM_nnY)EmD<%suD-@GWtzTJCOm$a^iIqCmrAx!Z&GIaT(RpfJXeCCa$6WRrub$ zT^>D-l5DsOTiO%hV1P+>hvR%dOM|^Q-`&Fo0y%_*?m}vhca!+hu8i~O4w??by-4m3 zk$*{w}&m*l-Q9G7df<5~hrm%oFBC16$4Ooy4e&UEIo7PIvh?hb3CX5zWU zOxD)hD4lOi;|dekF``Gq7JmjF-o_>W97Uu7f;C^~o7~{$XAD4WaT_pY^2^-eO|)1w zaM=}X`3>IY=g`C9Yy3R!O}@@A;O_Db{v7Tr{35@EdrJY^m2zVlNbPicw2#@3>SSm4 zamlMFpxIiWtR!GDtSrzul?I1xbXd1zmQ4tM04v4$xpB&)PYD1dnrnoR3kkM;0xm<@g7AGWG@+U?5QS1QDNfa5FEO&{pt*)*UeIl0a<1zg0IfvNhpD7qmI0edI9e#r+s7J{qg-(?@U3yL7)|uXM~xPtQS%N?QP|;$i8^JQTTn z5`!yEK>#6Mp!aN4+Cvfb<4@1(bvqzfnVZU=qPJ|L(Aq9A#bxWj5|>SGF4yr>W4C*x z+Or?+Yp&}5g@+u<{*>(+Q*&xf?ZV#Gr;VvoG!)UjQ8?8-S4v-4iVkg%od&fxkJ+?Y zG({hCG@r7mTezZMxR|RsU75Dj7^7&aF-`GB(cZyU6_=i)#-UJ^ zv*xg&%pr}QEV9G^-y+{ap;;i=Z(Pe^YecICnFy$tXxCT+fwB?o9aoQ zbe?TQXI4B#8VxKwx1`_UVQxuq6yfs0xjfRzVLaBM>ttIN*GHOotFY@k*$_Ks3vZe1 zs<%ueg*Dva#?&h8;V$kNUBKO>SqtM$P0htbQT3Le*K_}6HMjiy#~O##{H^v|(A8gn zwA5&WT*ojtO-qZK504rLtJH`LV2=5x2?@}x)FT31R?0~+%uEM~f`HAKhm(h%J)$^> z>}d{@y-bLxmoFO9610Aa)Qk`_8|90qetXU|x4jw7bhZHQ`N<04v)qH*mlBrKm&`O> zu`b0;DmGjA^xNnb%lQ`jqqL_2I{KO#B0`VH{eC16h0V8citJ8^prd!Y-4b?xU-4v` zVOIAX)>4>H@eXLu$g$#ZEDub@ALLT$-O>@W zDAW?)$J~`<$nPsxMYMy1J5~jF23)Laz%vC1f0F#GAoyoY zDO)HsW8JXzHN6dyJ=3SG#yndLk1$UT>LZin`fm+t~n9>E5=CDWldiL))E3=g{$JQ zXJPD;IeN6w*^laTUAlq?gzxZ3NN8NAAZQPQ4IGo1kI4?7vopD zzr5#_Y+SOmql*iePtXx}SY>KwVhb;*{9F}^%)gOhlX}Mgz*tFH1`QFN$tJHaH=6%v zmQz~O#AIYZKfxs(d_D{ZdUI%qc7e|(_?Meh%k=|fDDc*T6NZe#flc*FD1T*uQsB;U z9kgLezp!voHo`b?lo2XdPsM1>+W3e-NasE;%)(MM<5F)Bjg2<#XysVL9WClT)(e_g z59vLWt4Hl)L_Ybs!W{lRhYL3R2X2uWAFM$?8%5*jJX|*IU|kuqcF+|6K5x5F8TY}) z!E;5UPtl|PJN6p}2h=&Zcyx*A5om`S0~DRjas^&? zK9T`t&s4-%+Q2Hr^QAQm1(I719#yRZ0YX{vHWdn42^|Gtu%IxoY^d~FnwN$MpOh^T zB@q&2m^@8|!kb1Nu!(!reTDK90dfk!n{thU*G2d(T^a|{L*k7>+LV_K@J*hHacPIh zXr;WaP2VB+gu0(GPVq;0`v+W-*g`Ym4;eOm zqPF2McuHTp7WqPeHF!pAMvH+1m}_jZwq>)nvB6sUEl`H%_)gDkm!57d^1!51WVTX#-<}ZGVwj0p6DysmOkuo(C zZ>eAw4*!&7NGhZ(N-_y5L;@ow*WjNi&kT6BS*I9a#>98Ti((%VBV5zO{$x`n6%lK} z#577f{szW|q~%ql5bbflN?M{%g98c}l7^{{{5A2VJ$ZGhoJoUDfh025a@6ZZQc{wz zj_y-9Py)^m(hnYz1QEh+<&4enH2!M{XYv9Nmoga3F?VuhJB*Xc6Fj?W$Egrl+1>n< zN|OQxza}Y|b;ivlx1Qbfrbh%d;og#V{mwHA#_>hEM<~t+GRHn1PE-T#HR^ zEj>@#>!SU3^qnrQ?anG?oG51*1f?4UgN%>hV+3U@2tFBwN%cm&gypKBOJR(1RQ{OS z-ll@!MVY8lF+sar*tya|kJ@gacpsM}Dt2_YxYyr9@k+0>7;a@wPEXY3Ji1UJ1(H39?#23Mz+WA!+HI7_=tZ$;xv4tL602M4&DJ26Jw?iuZ$fT~ zpqzzrk$vy?|-Amr4qHd?x?w~+y+Y%gVg K>s+tlT>n3UK4qx@ diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-39.pyc deleted file mode 100644 index ac67f4b969ed7efebbabc8490655ae8a5ad72ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2726 zcmaJ@TW=dh6rS0Oz1}#9(>pC~w}5DkR4Yh`2Lx3iYH9nBR!s$BWwF}qjGayP)|qjF zt<6gv)HljcNRW8wU)oom`WJZOoU!9LDKOR^pV>Kc`Mz_R4Hp+(0pOKkaoux0LyP5%Nj zHb}cQy7uVBi)UUGMqAvA(<0$1&s3=5JnOjc;K*dXO{=9S&lLYfrC}EKxo8`e^H^~a zs$5jg(*mu-1ne5$g_5t~TG)9QC$o<8oXaB5B!{^xA=?fk*d|bE5%j>SstaBu@D8TA zJd*>#0~U*j;sK@&btH2Q9@zw;NU6yjn*hXIuiT!<(?BD620K$Ew>8Qy$0y&eYxI*={$9H@h-c{4TuO z0TN`lh>LCz11|!=cQdZ`a5e0BnqQANRaH4z9~?D=&;9E~Tfyi~0npWz%7Admxo3 zcj7{i0Z=c@m${%Rx~9oMq^j&{2S)q(^k$P(}$D82#1w0E$s*^yy`?Zz^-! z+O|uwUF*}*{DVFxzfEwyvtf3-F7N1dQmeNpc!4bs#xME2oJ7 zo9H+-!Iq$hX5e2zX9nI>2>xdTj}AVxOY;bV8v3=;9Md;f_pQ=8te3_Syn7GelX-y3 zDXr}W%rgGPQq5Z;6>sT!+dZK{;KeMiqtL+XkOdeZ0&7rZV|sFd5QGP!ZR;2k82FXF z8zuv;r-?ggfw#sKk~a?;)ZYYk|CDoMjE{PK69Ih}-Lsxd+OOHAAy@6ws`_+g5?a18siC9{1GfN&2{ws=)!5wPmJ0w78K+U z3W^&9Y0d@->dhc{IS7;KNIeKx9zi+5A~Nws8?_FKRS?zUwB$rQNsh~oKGzjA(FN!{ zXt&_e^g7hCn>DB5)SU%^Bkhag3p7Q~R_^r61g>X+6}76VVF5RsK&Ay&BmV|m)SUnd zIm<;yUye9O5&WksZ8ie$mkS6$I-ov}<~8BO9AKN55{Ys_;2sJYS?t@HK73HR{RNFsffiK*K%njo7{xSOV9 I!(F@Z4@!1_j{pDw diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-39.pyc deleted file mode 100644 index bb2315f6cf9d2065c5d9922ed6278bf763d0a212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5086 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 AApigX diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-39.pyc deleted file mode 100644 index 232ef7afedd8b6b8dd17f51f9e1b44aa0686c41e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9494 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 diff --git a/venv/Lib/site-packages/pip/_internal/network/auth.py b/venv/Lib/site-packages/pip/_internal/network/auth.py deleted file mode 100644 index bd54a5c..0000000 --- a/venv/Lib/site-packages/pip/_internal/network/auth.py +++ /dev/null @@ -1,312 +0,0 @@ -"""Network Authentication Helpers - -Contains interface (MultiDomainBasicAuth) and associated glue code for -providing credentials in the context of network requests. -""" - -import logging -import urllib.parse -from typing import Any, Dict, List, Optional, Tuple - -from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth -from pip._vendor.requests.models import Request, Response -from pip._vendor.requests.utils import get_netrc_auth - -from pip._internal.utils.misc import ( - ask, - ask_input, - ask_password, - remove_auth_from_url, - split_auth_netloc_from_url, -) -from pip._internal.vcs.versioncontrol import AuthInfo - -logger = logging.getLogger(__name__) - -Credentials = Tuple[str, str, str] - -try: - import keyring -except ImportError: - keyring = None -except Exception as exc: - logger.warning( - "Keyring is skipped due to an exception: %s", str(exc), - ) - keyring = None - - -def get_keyring_auth(url, username): - # type: (Optional[str], Optional[str]) -> Optional[AuthInfo] - """Return the tuple auth for a given url from keyring.""" - global keyring - if not url or not keyring: - return None - - try: - try: - get_credential = keyring.get_credential - except AttributeError: - pass - else: - logger.debug("Getting credentials from keyring for %s", url) - cred = get_credential(url, username) - if cred is not None: - return cred.username, cred.password - return None - - if username: - logger.debug("Getting password from keyring for %s", url) - password = keyring.get_password(url, username) - if password: - return username, password - - except Exception as exc: - logger.warning( - "Keyring is skipped due to an exception: %s", str(exc), - ) - keyring = None - return None - - -class MultiDomainBasicAuth(AuthBase): - - def __init__(self, prompting=True, index_urls=None): - # type: (bool, Optional[List[str]]) -> None - self.prompting = prompting - self.index_urls = index_urls - self.passwords = {} # type: Dict[str, AuthInfo] - # When the user is prompted to enter credentials and keyring is - # available, we will offer to save them. If the user accepts, - # this value is set to the credentials they entered. After the - # request authenticates, the caller should call - # ``save_credentials`` to save these. - self._credentials_to_save = None # type: Optional[Credentials] - - def _get_index_url(self, url): - # type: (str) -> Optional[str] - """Return the original index URL matching the requested URL. - - Cached or dynamically generated credentials may work against - the original index URL rather than just the netloc. - - The provided url should have had its username and password - removed already. If the original index url had credentials then - they will be included in the return value. - - Returns None if no matching index was found, or if --no-index - was specified by the user. - """ - if not url or not self.index_urls: - return None - - for u in self.index_urls: - prefix = remove_auth_from_url(u).rstrip("/") + "/" - if url.startswith(prefix): - return u - return None - - def _get_new_credentials(self, original_url, allow_netrc=True, - allow_keyring=False): - # type: (str, bool, bool) -> AuthInfo - """Find and return credentials for the specified URL.""" - # Split the credentials and netloc from the url. - url, netloc, url_user_password = split_auth_netloc_from_url( - original_url, - ) - - # Start with the credentials embedded in the url - username, password = url_user_password - if username is not None and password is not None: - logger.debug("Found credentials in url for %s", netloc) - return url_user_password - - # Find a matching index url for this request - index_url = self._get_index_url(url) - if index_url: - # Split the credentials from the url. - index_info = split_auth_netloc_from_url(index_url) - if index_info: - index_url, _, index_url_user_password = index_info - logger.debug("Found index url %s", index_url) - - # If an index URL was found, try its embedded credentials - if index_url and index_url_user_password[0] is not None: - username, password = index_url_user_password - if username is not None and password is not None: - logger.debug("Found credentials in index url for %s", netloc) - return index_url_user_password - - # Get creds from netrc if we still don't have them - if allow_netrc: - netrc_auth = get_netrc_auth(original_url) - if netrc_auth: - logger.debug("Found credentials in netrc for %s", netloc) - return netrc_auth - - # If we don't have a password and keyring is available, use it. - if allow_keyring: - # The index url is more specific than the netloc, so try it first - kr_auth = ( - get_keyring_auth(index_url, username) or - get_keyring_auth(netloc, username) - ) - if kr_auth: - logger.debug("Found credentials in keyring for %s", netloc) - return kr_auth - - return username, password - - def _get_url_and_credentials(self, original_url): - # type: (str) -> Tuple[str, Optional[str], Optional[str]] - """Return the credentials to use for the provided URL. - - If allowed, netrc and keyring may be used to obtain the - correct credentials. - - Returns (url_without_credentials, username, password). Note - that even if the original URL contains credentials, this - function may return a different username and password. - """ - url, netloc, _ = split_auth_netloc_from_url(original_url) - - # Use any stored credentials that we have for this netloc - username, password = self.passwords.get(netloc, (None, None)) - - if username is None and password is None: - # No stored credentials. Acquire new credentials without prompting - # the user. (e.g. from netrc, keyring, or the URL itself) - username, password = self._get_new_credentials(original_url) - - if username is not None or password is not None: - # Convert the username and password if they're None, so that - # this netloc will show up as "cached" in the conditional above. - # Further, HTTPBasicAuth doesn't accept None, so it makes sense to - # cache the value that is going to be used. - username = username or "" - password = password or "" - - # Store any acquired credentials. - self.passwords[netloc] = (username, password) - - assert ( - # Credentials were found - (username is not None and password is not None) or - # Credentials were not found - (username is None and password is None) - ), f"Could not load credentials from url: {original_url}" - - return url, username, password - - def __call__(self, req): - # type: (Request) -> Request - # Get credentials for this request - url, username, password = self._get_url_and_credentials(req.url) - - # Set the url of the request to the url without any credentials - req.url = url - - if username is not None and password is not None: - # Send the basic auth with this request - req = HTTPBasicAuth(username, password)(req) - - # Attach a hook to handle 401 responses - req.register_hook("response", self.handle_401) - - return req - - # Factored out to allow for easy patching in tests - def _prompt_for_password(self, netloc): - # type: (str) -> Tuple[Optional[str], Optional[str], bool] - username = ask_input(f"User for {netloc}: ") - if not username: - return None, None, False - auth = get_keyring_auth(netloc, username) - if auth and auth[0] is not None and auth[1] is not None: - return auth[0], auth[1], False - password = ask_password("Password: ") - return username, password, True - - # Factored out to allow for easy patching in tests - def _should_save_password_to_keyring(self): - # type: () -> bool - if not keyring: - return False - return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y" - - def handle_401(self, resp, **kwargs): - # type: (Response, **Any) -> Response - # We only care about 401 responses, anything else we want to just - # pass through the actual response - if resp.status_code != 401: - return resp - - # We are not able to prompt the user so simply return the response - if not self.prompting: - return resp - - parsed = urllib.parse.urlparse(resp.url) - - # Query the keyring for credentials: - username, password = self._get_new_credentials(resp.url, - allow_netrc=False, - allow_keyring=True) - - # Prompt the user for a new username and password - save = False - if not username and not password: - username, password, save = self._prompt_for_password(parsed.netloc) - - # Store the new username and password to use for future requests - self._credentials_to_save = None - if username is not None and password is not None: - self.passwords[parsed.netloc] = (username, password) - - # Prompt to save the password to keyring - if save and self._should_save_password_to_keyring(): - self._credentials_to_save = (parsed.netloc, username, password) - - # Consume content and release the original connection to allow our new - # request to reuse the same one. - resp.content - resp.raw.release_conn() - - # Add our new username and password to the request - req = HTTPBasicAuth(username or "", password or "")(resp.request) - req.register_hook("response", self.warn_on_401) - - # On successful request, save the credentials that were used to - # keyring. (Note that if the user responded "no" above, this member - # is not set and nothing will be saved.) - if self._credentials_to_save: - req.register_hook("response", self.save_credentials) - - # Send our new request - new_resp = resp.connection.send(req, **kwargs) - new_resp.history.append(resp) - - return new_resp - - def warn_on_401(self, resp, **kwargs): - # type: (Response, **Any) -> None - """Response callback to warn about incorrect credentials.""" - if resp.status_code == 401: - logger.warning( - '401 Error, Credentials not correct for %s', resp.request.url, - ) - - def save_credentials(self, resp, **kwargs): - # type: (Response, **Any) -> None - """Response callback to save credentials on success.""" - assert keyring is not None, "should never reach here without keyring" - if not keyring: - return - - creds = self._credentials_to_save - self._credentials_to_save = None - if creds and resp.status_code < 400: - try: - logger.info('Saving credentials to keyring') - keyring.set_password(*creds) - except Exception: - logger.exception('Failed to save credentials') diff --git a/venv/Lib/site-packages/pip/_internal/network/cache.py b/venv/Lib/site-packages/pip/_internal/network/cache.py deleted file mode 100644 index ce08932..0000000 --- a/venv/Lib/site-packages/pip/_internal/network/cache.py +++ /dev/null @@ -1,76 +0,0 @@ -"""HTTP cache implementation. -""" - -import os -from contextlib import contextmanager -from typing import Iterator, Optional - -from pip._vendor.cachecontrol.cache import BaseCache -from pip._vendor.cachecontrol.caches import FileCache -from pip._vendor.requests.models import Response - -from pip._internal.utils.filesystem import adjacent_tmp_file, replace -from pip._internal.utils.misc import ensure_dir - - -def is_from_cache(response): - # type: (Response) -> bool - return getattr(response, "from_cache", False) - - -@contextmanager -def suppressed_cache_errors(): - # type: () -> Iterator[None] - """If we can't access the cache then we can just skip caching and process - requests as if caching wasn't enabled. - """ - try: - yield - except OSError: - pass - - -class SafeFileCache(BaseCache): - """ - A file based cache which is safe to use even when the target directory may - not be accessible or writable. - """ - - def __init__(self, directory): - # type: (str) -> None - assert directory is not None, "Cache directory must not be None." - super().__init__() - self.directory = directory - - def _get_cache_path(self, name): - # type: (str) -> str - # From cachecontrol.caches.file_cache.FileCache._fn, brought into our - # class for backwards-compatibility and to avoid using a non-public - # method. - hashed = FileCache.encode(name) - parts = list(hashed[:5]) + [hashed] - return os.path.join(self.directory, *parts) - - def get(self, key): - # type: (str) -> Optional[bytes] - path = self._get_cache_path(key) - with suppressed_cache_errors(): - with open(path, 'rb') as f: - return f.read() - - def set(self, key, value): - # type: (str, bytes) -> None - path = self._get_cache_path(key) - with suppressed_cache_errors(): - ensure_dir(os.path.dirname(path)) - - with adjacent_tmp_file(path) as f: - f.write(value) - - replace(f.name, path) - - def delete(self, key): - # type: (str) -> None - path = self._get_cache_path(key) - with suppressed_cache_errors(): - os.remove(path) diff --git a/venv/Lib/site-packages/pip/_internal/network/download.py b/venv/Lib/site-packages/pip/_internal/network/download.py deleted file mode 100644 index 1897d99..0000000 --- a/venv/Lib/site-packages/pip/_internal/network/download.py +++ /dev/null @@ -1,196 +0,0 @@ -"""Download files with progress indicators. -""" -import cgi -import logging -import mimetypes -import os -from typing import Iterable, Optional, Tuple - -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response - -from pip._internal.cli.progress_bars import DownloadProgressProvider -from pip._internal.exceptions import NetworkConnectionError -from pip._internal.models.index import PyPI -from pip._internal.models.link import Link -from pip._internal.network.cache import is_from_cache -from pip._internal.network.session import PipSession -from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks -from pip._internal.utils.misc import format_size, redact_auth_from_url, splitext - -logger = logging.getLogger(__name__) - - -def _get_http_response_size(resp): - # type: (Response) -> Optional[int] - try: - return int(resp.headers['content-length']) - except (ValueError, KeyError, TypeError): - return None - - -def _prepare_download( - resp, # type: Response - link, # type: Link - progress_bar # type: str -): - # type: (...) -> Iterable[bytes] - total_length = _get_http_response_size(resp) - - if link.netloc == PyPI.file_storage_domain: - url = link.show_url - else: - url = link.url_without_fragment - - logged_url = redact_auth_from_url(url) - - if total_length: - logged_url = '{} ({})'.format(logged_url, format_size(total_length)) - - if is_from_cache(resp): - logger.info("Using cached %s", logged_url) - else: - logger.info("Downloading %s", logged_url) - - if logger.getEffectiveLevel() > logging.INFO: - show_progress = False - elif is_from_cache(resp): - show_progress = False - elif not total_length: - show_progress = True - elif total_length > (40 * 1000): - show_progress = True - else: - show_progress = False - - chunks = response_chunks(resp, CONTENT_CHUNK_SIZE) - - if not show_progress: - return chunks - - return DownloadProgressProvider( - progress_bar, max=total_length - )(chunks) - - -def sanitize_content_filename(filename): - # type: (str) -> str - """ - Sanitize the "filename" value from a Content-Disposition header. - """ - return os.path.basename(filename) - - -def parse_content_disposition(content_disposition, default_filename): - # type: (str, str) -> 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') - if filename: - # We need to sanitize the filename to prevent directory traversal - # in case the filename contains ".." path parts. - filename = sanitize_content_filename(filename) - return filename or default_filename - - -def _get_http_response_filename(resp, link): - # type: (Response, Link) -> str - """Get an ideal filename from the given HTTP response, falling back to - the link filename if not provided. - """ - filename = link.filename # fallback - # Have a look at the Content-Disposition header for a better guess - content_disposition = resp.headers.get('content-disposition') - if content_disposition: - filename = parse_content_disposition(content_disposition, filename) - ext = splitext(filename)[1] # type: Optional[str] - if not ext: - ext = mimetypes.guess_extension( - resp.headers.get('content-type', '') - ) - if ext: - filename += ext - if not ext and link.url != resp.url: - ext = os.path.splitext(resp.url)[1] - if ext: - filename += ext - return filename - - -def _http_get_download(session, link): - # type: (PipSession, Link) -> Response - target_url = link.url.split('#', 1)[0] - resp = session.get(target_url, headers=HEADERS, stream=True) - raise_for_status(resp) - return resp - - -class Downloader: - def __init__( - self, - session, # type: PipSession - progress_bar, # type: str - ): - # type: (...) -> None - self._session = session - self._progress_bar = progress_bar - - def __call__(self, link, location): - # type: (Link, str) -> Tuple[str, str] - """Download the file given by link into location.""" - try: - resp = _http_get_download(self._session, link) - except NetworkConnectionError as e: - assert e.response is not None - logger.critical( - "HTTP error %s while getting %s", e.response.status_code, link - ) - raise - - filename = _get_http_response_filename(resp, link) - filepath = os.path.join(location, filename) - - chunks = _prepare_download(resp, link, self._progress_bar) - with open(filepath, 'wb') as content_file: - for chunk in chunks: - content_file.write(chunk) - content_type = resp.headers.get('Content-Type', '') - return filepath, content_type - - -class BatchDownloader: - - def __init__( - self, - session, # type: PipSession - progress_bar, # type: str - ): - # type: (...) -> None - self._session = session - self._progress_bar = progress_bar - - def __call__(self, links, location): - # type: (Iterable[Link], str) -> Iterable[Tuple[Link, Tuple[str, str]]] - """Download the files given by links into location.""" - for link in links: - try: - resp = _http_get_download(self._session, link) - except NetworkConnectionError as e: - assert e.response is not None - logger.critical( - "HTTP error %s while getting %s", - e.response.status_code, link, - ) - raise - - filename = _get_http_response_filename(resp, link) - filepath = os.path.join(location, filename) - - chunks = _prepare_download(resp, link, self._progress_bar) - with open(filepath, 'wb') as content_file: - for chunk in chunks: - content_file.write(chunk) - content_type = resp.headers.get('Content-Type', '') - yield link, (filepath, content_type) diff --git a/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py b/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py deleted file mode 100644 index b877d3b..0000000 --- a/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +++ /dev/null @@ -1,224 +0,0 @@ -"""Lazy ZIP over HTTP""" - -__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 zipfile import BadZipfile, ZipFile - -from pip._vendor.pkg_resources import Distribution -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response - -from pip._internal.network.session import PipSession -from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks -from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel - - -class HTTPRangeRequestUnsupported(Exception): - pass - - -def dist_from_wheel_url(name, url, session): - # type: (str, str, PipSession) -> Distribution - """Return a pkg_resources.Distribution from the given wheel URL. - - This uses HTTP range requests to only fetch the potion of the wheel - containing metadata, just enough for the object to be constructed. - If such requests are not supported, HTTPRangeRequestUnsupported - is raised. - """ - with LazyZipOverHTTP(url, session) as wheel: - # For read-only ZIP files, ZipFile only needs methods read, - # seek, seekable and tell, not the whole IO protocol. - zip_file = ZipFile(wheel) # type: ignore - # After context manager exit, wheel.name - # is an invalid file by intention. - return pkg_resources_distribution_for_wheel(zip_file, name, wheel.name) - - -class LazyZipOverHTTP: - """File-like object mapped to a ZIP file over HTTP. - - This uses HTTP range requests to lazily fetch the file's content, - which is supposed to be fed to ZipFile. If such requests are not - supported by the server, raise HTTPRangeRequestUnsupported - during initialization. - """ - - def __init__(self, url, session, chunk_size=CONTENT_CHUNK_SIZE): - # type: (str, PipSession, int) -> None - head = session.head(url, headers=HEADERS) - raise_for_status(head) - assert head.status_code == 200 - self._session, self._url, self._chunk_size = session, url, chunk_size - self._length = int(head.headers['Content-Length']) - self._file = NamedTemporaryFile() - self.truncate(self._length) - self._left = [] # type: List[int] - self._right = [] # type: List[int] - if 'bytes' not in head.headers.get('Accept-Ranges', 'none'): - raise HTTPRangeRequestUnsupported('range request is not supported') - self._check_zip() - - @property - def mode(self): - # type: () -> str - """Opening mode, which is always rb.""" - return 'rb' - - @property - def name(self): - # type: () -> str - """Path to the underlying file.""" - return self._file.name - - def seekable(self): - # type: () -> bool - """Return whether random access is supported, which is True.""" - return True - - def close(self): - # type: () -> None - """Close the file.""" - self._file.close() - - @property - def closed(self): - # type: () -> bool - """Whether the file is closed.""" - return self._file.closed - - def read(self, size=-1): - # type: (int) -> bytes - """Read up to size bytes from the object and return them. - - As a convenience, if size is unspecified or -1, - all bytes until EOF are returned. Fewer than - size bytes may be returned if EOF is reached. - """ - download_size = max(size, self._chunk_size) - start, length = self.tell(), self._length - stop = length if size < 0 else min(start+download_size, length) - start = max(0, stop-download_size) - self._download(start, stop-1) - return self._file.read(size) - - def readable(self): - # type: () -> bool - """Return whether the file is readable, which is True.""" - return True - - def seek(self, offset, whence=0): - # type: (int, int) -> int - """Change stream position and return the new absolute position. - - Seek to offset relative position indicated by whence: - * 0: Start of stream (the default). pos should be >= 0; - * 1: Current position - pos may be negative; - * 2: End of stream - pos usually negative. - """ - return self._file.seek(offset, whence) - - def tell(self): - # type: () -> int - """Return the current possition.""" - return self._file.tell() - - def truncate(self, size=None): - # type: (Optional[int]) -> int - """Resize the stream to the given size in bytes. - - If size is unspecified resize to the current position. - The current stream position isn't changed. - - Return the new file size. - """ - return self._file.truncate(size) - - def writable(self): - # type: () -> bool - """Return False.""" - return False - - def __enter__(self): - # type: () -> LazyZipOverHTTP - self._file.__enter__() - return self - - def __exit__(self, *exc): - # type: (*Any) -> Optional[bool] - return self._file.__exit__(*exc) - - @contextmanager - def _stay(self): - # type: ()-> Iterator[None] - """Return a context manager keeping the position. - - At the end of the block, seek back to original position. - """ - pos = self.tell() - try: - yield - finally: - self.seek(pos) - - def _check_zip(self): - # type: () -> None - """Check and download until the file is a valid ZIP.""" - end = self._length - 1 - for start in reversed(range(0, end, self._chunk_size)): - self._download(start, end) - with self._stay(): - try: - # For read-only ZIP files, ZipFile only needs - # methods read, seek, seekable and tell. - ZipFile(self) # type: ignore - except BadZipfile: - pass - else: - break - - def _stream_response(self, start, end, base_headers=HEADERS): - # type: (int, int, Dict[str, str]) -> Response - """Return HTTP response to a range request from start to end.""" - headers = base_headers.copy() - headers['Range'] = f'bytes={start}-{end}' - # TODO: Get range requests to be correctly cached - headers['Cache-Control'] = 'no-cache' - return self._session.get(self._url, headers=headers, stream=True) - - def _merge(self, start, end, left, right): - # type: (int, int, int, int) -> Iterator[Tuple[int, int]] - """Return an iterator of intervals to be fetched. - - Args: - start (int): Start of needed interval - end (int): End of needed interval - left (int): Index of first overlapping downloaded data - right (int): Index after last overlapping downloaded data - """ - lslice, rslice = self._left[left:right], self._right[left:right] - i = start = min([start]+lslice[:1]) - end = max([end]+rslice[-1:]) - for j, k in zip(lslice, rslice): - if j > i: - yield i, j-1 - i = k + 1 - if i <= end: - yield i, end - self._left[left:right], self._right[left:right] = [start], [end] - - def _download(self, start, end): - # type: (int, int) -> None - """Download bytes from start to end inclusively.""" - with self._stay(): - left = bisect_left(self._right, start) - right = bisect_right(self._left, end) - for start, end in self._merge(start, end, left, right): - response = self._stream_response(start, end) - response.raise_for_status() - self.seek(start) - for chunk in response_chunks(response, self._chunk_size): - self._file.write(chunk) diff --git a/venv/Lib/site-packages/pip/_internal/network/session.py b/venv/Lib/site-packages/pip/_internal/network/session.py deleted file mode 100644 index 4af800f..0000000 --- a/venv/Lib/site-packages/pip/_internal/network/session.py +++ /dev/null @@ -1,449 +0,0 @@ -"""PipSession and supporting code, containing all pip-specific -network request configuration and behavior. -""" - -# When mypy runs on Windows the call to distro.linux_distribution() is skipped -# resulting in the failure: -# -# error: unused 'type: ignore' comment -# -# If the upstream module adds typing, this comment should be removed. See -# https://github.com/nir0s/distro/pull/269 -# -# mypy: warn-unused-ignores=False - -import email.utils -import ipaddress -import json -import logging -import mimetypes -import os -import platform -import sys -import urllib.parse -import warnings -from typing import Any, Dict, Iterator, 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.requests.models import PreparedRequest, Response -from pip._vendor.requests.structures import CaseInsensitiveDict -from pip._vendor.urllib3.connectionpool import ConnectionPool -from pip._vendor.urllib3.exceptions import InsecureRequestWarning - -from pip import __version__ -from pip._internal.metadata import get_default_environment -from pip._internal.models.link import Link -from pip._internal.network.auth import MultiDomainBasicAuth -from pip._internal.network.cache import SafeFileCache - -# Import ssl from compat so the initial import occurs in only one place. -from pip._internal.utils.compat import has_tls -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 - -logger = logging.getLogger(__name__) - -SecureOrigin = Tuple[str, str, Optional[Union[int, str]]] - - -# Ignore warning raised when using --trusted-host. -warnings.filterwarnings("ignore", category=InsecureRequestWarning) - - -SECURE_ORIGINS = [ - # protocol, hostname, port - # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) - ("https", "*", "*"), - ("*", "localhost", "*"), - ("*", "127.0.0.0/8", "*"), - ("*", "::1/128", "*"), - ("file", "*", None), - # ssh is always secure. - ("ssh", "*", "*"), -] # type: List[SecureOrigin] - - -# These are environment variables present when running under various -# CI systems. For each variable, some CI systems that use the variable -# are indicated. The collection was chosen so that for each of a number -# of popular systems, at least one of the environment variables is used. -# This list is used to provide some indication of and lower bound for -# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive. -# For more background, see: https://github.com/pypa/pip/issues/5499 -CI_ENVIRONMENT_VARIABLES = ( - # Azure Pipelines - 'BUILD_BUILDID', - # Jenkins - 'BUILD_ID', - # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI - 'CI', - # Explicit environment variable. - 'PIP_IS_CI', -) - - -def looks_like_ci(): - # type: () -> bool - """ - Return whether it looks like pip is running under CI. - """ - # We don't use the method of checking for a tty (e.g. using isatty()) - # because some CI systems mimic a tty (e.g. Travis CI). Thus that - # method doesn't provide definitive information in either direction. - return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) - - -def user_agent(): - # type: () -> str - """ - Return a string representing the user agent. - """ - data = { - "installer": {"name": "pip", "version": __version__}, - "python": platform.python_version(), - "implementation": { - "name": platform.python_implementation(), - }, - } # type: Dict[str, Any] - - if data["implementation"]["name"] == 'CPython': - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == 'PyPy': - pypy_version_info = sys.pypy_version_info # type: ignore - if pypy_version_info.releaselevel == 'final': - pypy_version_info = pypy_version_info[:3] - data["implementation"]["version"] = ".".join( - [str(x) for x in pypy_version_info] - ) - elif data["implementation"]["name"] == 'Jython': - # Complete Guess - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == 'IronPython': - # Complete Guess - data["implementation"]["version"] = platform.python_version() - - if sys.platform.startswith("linux"): - from pip._vendor import distro - - # https://github.com/nir0s/distro/pull/269 - linux_distribution = distro.linux_distribution() # type: ignore - distro_infos = dict(filter( - lambda x: x[1], - zip(["name", "version", "id"], linux_distribution), - )) - libc = dict(filter( - lambda x: x[1], - zip(["lib", "version"], libc_ver()), - )) - if libc: - distro_infos["libc"] = libc - if distro_infos: - data["distro"] = distro_infos - - if sys.platform.startswith("darwin") and platform.mac_ver()[0]: - data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} - - if platform.system(): - data.setdefault("system", {})["name"] = platform.system() - - if platform.release(): - data.setdefault("system", {})["release"] = platform.release() - - if platform.machine(): - data["cpu"] = platform.machine() - - if has_tls(): - import _ssl as ssl - data["openssl_version"] = ssl.OPENSSL_VERSION - - setuptools_dist = get_default_environment().get_distribution("setuptools") - if setuptools_dist is not None: - data["setuptools_version"] = str(setuptools_dist.version) - - # Use None rather than False so as not to give the impression that - # pip knows it is not being run under CI. Rather, it is a null or - # inconclusive result. Also, we include some value rather than no - # value to make it easier to know that the check has been run. - data["ci"] = True if looks_like_ci() else None - - user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") - if user_data is not None: - data["user_data"] = user_data - - return "{data[installer][name]}/{data[installer][version]} {json}".format( - data=data, - json=json.dumps(data, separators=(",", ":"), sort_keys=True), - ) - - -class LocalFSAdapter(BaseAdapter): - - def send( - self, - request, # type: PreparedRequest - stream=False, # type: bool - timeout=None, # type: Optional[Union[float, Tuple[float, float]]] - verify=True, # type: Union[bool, str] - cert=None, # type: Optional[Union[str, Tuple[str, str]]] - proxies=None, # type:Optional[Mapping[str, str]] - ): - # type: (...) -> Response - pathname = url_to_path(request.url) - - resp = Response() - resp.status_code = 200 - resp.url = request.url - - try: - stats = os.stat(pathname) - except OSError as exc: - resp.status_code = 404 - resp.raw = exc - else: - modified = email.utils.formatdate(stats.st_mtime, usegmt=True) - content_type = mimetypes.guess_type(pathname)[0] or "text/plain" - resp.headers = CaseInsensitiveDict({ - "Content-Type": content_type, - "Content-Length": stats.st_size, - "Last-Modified": modified, - }) - - resp.raw = open(pathname, "rb") - resp.close = resp.raw.close - - return resp - - def close(self): - # type: () -> None - pass - - -class InsecureHTTPAdapter(HTTPAdapter): - - def cert_verify( - self, - conn, # type: ConnectionPool - url, # type: str - verify, # type: Union[bool, str] - cert, # type: Optional[Union[str, Tuple[str, str]]] - ): - # type: (...) -> None - super().cert_verify(conn=conn, url=url, verify=False, cert=cert) - - -class InsecureCacheControlAdapter(CacheControlAdapter): - - def cert_verify( - self, - conn, # type: ConnectionPool - url, # type: str - verify, # type: Union[bool, str] - cert, # type: Optional[Union[str, Tuple[str, str]]] - ): - # type: (...) -> None - super().cert_verify(conn=conn, url=url, verify=False, cert=cert) - - -class PipSession(requests.Session): - - timeout = None # type: Optional[int] - - def __init__( - self, - *args, # type: Any - retries=0, # type: int - cache=None, # type: Optional[str] - trusted_hosts=(), # type: Sequence[str] - index_urls=None, # type: Optional[List[str]] - **kwargs, # type: Any - ): - # type: (...) -> None - """ - :param trusted_hosts: Domains not to emit warnings for when not using - HTTPS. - """ - super().__init__(*args, **kwargs) - - # Namespace the attribute with "pip_" just in case to prevent - # possible conflicts with the base class. - self.pip_trusted_origins = [] # type: List[Tuple[str, Optional[int]]] - - # Attach our User Agent to the request - self.headers["User-Agent"] = user_agent() - - # Attach our Authentication handler to the session - self.auth = MultiDomainBasicAuth(index_urls=index_urls) - - # Create our urllib3.Retry instance which will allow us to customize - # how we handle retries. - retries = urllib3.Retry( - # Set the total number of retries that a particular request can - # have. - total=retries, - - # A 503 error from PyPI typically means that the Fastly -> Origin - # connection got interrupted in some way. A 503 error in general - # is typically considered a transient error so we'll go ahead and - # retry it. - # A 500 may indicate transient error in Amazon S3 - # A 520 or 527 - may indicate transient error in CloudFlare - status_forcelist=[500, 503, 520, 527], - - # Add a small amount of back off between failed requests in - # order to prevent hammering the service. - backoff_factor=0.25, - ) # type: ignore - - # Our Insecure HTTPAdapter disables HTTPS validation. It does not - # support caching so we'll use it for all http:// URLs. - # If caching is disabled, we will also use it for - # https:// hosts that we've marked as ignoring - # TLS errors for (trusted-hosts). - insecure_adapter = InsecureHTTPAdapter(max_retries=retries) - - # We want to _only_ cache responses on securely fetched origins or when - # the host is specified as trusted. We do this because - # we can't validate the response of an insecurely/untrusted fetched - # origin, and we don't want someone to be able to poison the cache and - # require manual eviction from the cache to fix it. - if cache: - secure_adapter = CacheControlAdapter( - cache=SafeFileCache(cache), - max_retries=retries, - ) - self._trusted_host_adapter = InsecureCacheControlAdapter( - cache=SafeFileCache(cache), - max_retries=retries, - ) - else: - secure_adapter = HTTPAdapter(max_retries=retries) - self._trusted_host_adapter = insecure_adapter - - self.mount("https://", secure_adapter) - self.mount("http://", insecure_adapter) - - # Enable file:// urls - self.mount("file://", LocalFSAdapter()) - - for host in trusted_hosts: - self.add_trusted_host(host, suppress_logging=True) - - def update_index_urls(self, new_index_urls): - # type: (List[str]) -> None - """ - :param new_index_urls: New index urls to update the authentication - handler with. - """ - self.auth.index_urls = new_index_urls - - def add_trusted_host(self, host, source=None, suppress_logging=False): - # type: (str, Optional[str], bool) -> None - """ - :param host: It is okay to provide a host that has previously been - added. - :param source: An optional source string, for logging where the host - string came from. - """ - if not suppress_logging: - msg = f'adding trusted host: {host!r}' - if source is not None: - msg += f' (from {source})' - logger.info(msg) - - host_port = parse_netloc(host) - if host_port not in self.pip_trusted_origins: - self.pip_trusted_origins.append(host_port) - - self.mount( - build_url_from_netloc(host) + '/', - self._trusted_host_adapter - ) - if not host_port[1]: - # Mount wildcard ports for the same host. - self.mount( - build_url_from_netloc(host) + ':', - self._trusted_host_adapter - ) - - def iter_secure_origins(self): - # type: () -> Iterator[SecureOrigin] - yield from SECURE_ORIGINS - for host, port in self.pip_trusted_origins: - yield ('*', host, '*' if port is None else port) - - def is_secure_origin(self, location): - # type: (Link) -> bool - # Determine if this url used a secure transport mechanism - parsed = urllib.parse.urlparse(str(location)) - origin_protocol, origin_host, origin_port = ( - parsed.scheme, parsed.hostname, parsed.port, - ) - - # The protocol to use to see if the protocol matches. - # Don't count the repository type as part of the protocol: in - # cases such as "git+ssh", only use "ssh". (I.e., Only verify against - # the last scheme.) - origin_protocol = origin_protocol.rsplit('+', 1)[-1] - - # Determine if our origin is a secure origin by looking through our - # hardcoded list of secure origins, as well as any additional ones - # configured on this PackageFinder instance. - for secure_origin in self.iter_secure_origins(): - secure_protocol, secure_host, secure_port = secure_origin - if origin_protocol != secure_protocol and secure_protocol != "*": - continue - - try: - addr = ipaddress.ip_address(origin_host) - network = ipaddress.ip_network(secure_host) - except ValueError: - # We don't have both a valid address or a valid network, so - # we'll check this origin against hostnames. - if ( - origin_host and - origin_host.lower() != secure_host.lower() and - secure_host != "*" - ): - continue - else: - # We have a valid address and network, so see if the address - # is contained within the network. - if addr not in network: - continue - - # Check to see if the port matches. - if ( - origin_port != secure_port and - secure_port != "*" and - secure_port is not None - ): - continue - - # If we've gotten here, then this origin matches the current - # secure origin and we should return True - return True - - # If we've gotten to this point, then the origin isn't secure and we - # will not accept it as a valid location to search. We will however - # log a warning that we are ignoring it. - logger.warning( - "The repository located at %s is not a trusted or secure host and " - "is being ignored. If this repository is available via HTTPS we " - "recommend you use HTTPS instead, otherwise you may silence " - "this warning and allow it anyway with '--trusted-host %s'.", - origin_host, - origin_host, - ) - - return False - - def request(self, method, url, *args, **kwargs): - # type: (str, str, *Any, **Any) -> Response - # Allow setting a default timeout on a session - kwargs.setdefault("timeout", self.timeout) - - # Dispatch the actual request - return super().request(method, url, *args, **kwargs) diff --git a/venv/Lib/site-packages/pip/_internal/network/utils.py b/venv/Lib/site-packages/pip/_internal/network/utils.py deleted file mode 100644 index 6e5cf0d..0000000 --- a/venv/Lib/site-packages/pip/_internal/network/utils.py +++ /dev/null @@ -1,95 +0,0 @@ -from typing import Dict, Iterator - -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response - -from pip._internal.exceptions import NetworkConnectionError - -# The following comments and HTTP headers were originally added by -# Donald Stufft in git commit 22c562429a61bb77172039e480873fb239dd8c03. -# -# We use Accept-Encoding: identity here because requests defaults to -# accepting compressed responses. This breaks in a variety of ways -# depending on how the server is configured. -# - Some servers will notice that the file isn't a compressible file -# and will leave the file alone and with an empty Content-Encoding -# - Some servers will notice that the file is already compressed and -# will leave the file alone, adding a Content-Encoding: gzip header -# - Some servers won't notice anything at all and will take a file -# that's already been compressed and compress it again, and set -# the Content-Encoding: gzip header -# By setting this to request only the identity encoding we're hoping -# to eliminate the third case. Hopefully there does not exist a server -# which when given a file will notice it is already compressed and that -# you're not asking for a compressed file and will then decompress it -# before sending because if that's the case I don't think it'll ever be -# possible to make this work. -HEADERS = {'Accept-Encoding': 'identity'} # type: Dict[str, str] - - -def raise_for_status(resp): - # type: (Response) -> None - http_error_msg = '' - if isinstance(resp.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. - try: - reason = resp.reason.decode('utf-8') - except UnicodeDecodeError: - reason = resp.reason.decode('iso-8859-1') - else: - reason = resp.reason - - if 400 <= resp.status_code < 500: - http_error_msg = ( - f'{resp.status_code} Client Error: {reason} for url: {resp.url}') - - elif 500 <= resp.status_code < 600: - http_error_msg = ( - f'{resp.status_code} Server Error: {reason} for url: {resp.url}') - - if http_error_msg: - raise NetworkConnectionError(http_error_msg, response=resp) - - -def response_chunks(response, chunk_size=CONTENT_CHUNK_SIZE): - # type: (Response, int) -> Iterator[bytes] - """Given a requests Response, provide the data chunks. - """ - try: - # Special case for urllib3. - for chunk in response.raw.stream( - chunk_size, - # We use decode_content=False here because we don't - # want urllib3 to mess with the raw bytes we get - # from the server. If we decompress inside of - # urllib3 then we cannot verify the checksum - # because the checksum will be of the compressed - # file. This breakage will only occur if the - # server adds a Content-Encoding header, which - # depends on how the server was configured: - # - Some servers will notice that the file isn't a - # compressible file and will leave the file alone - # and with an empty Content-Encoding - # - Some servers will notice that the file is - # already compressed and will leave the file - # alone and will add a Content-Encoding: gzip - # header - # - Some servers won't notice anything at all and - # will take a file that's already been compressed - # and compress it again and set the - # Content-Encoding: gzip header - # - # By setting this not to decode automatically we - # hope to eliminate problems with the second case. - decode_content=False, - ): - yield chunk - except AttributeError: - # Standard file-like object. - while True: - chunk = response.raw.read(chunk_size) - if not chunk: - break - yield chunk diff --git a/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py b/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py deleted file mode 100644 index b92b8d9..0000000 --- a/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +++ /dev/null @@ -1,49 +0,0 @@ -"""xmlrpclib.Transport implementation -""" - -import logging -import urllib.parse -import xmlrpc.client -from typing import TYPE_CHECKING, Tuple - -from pip._internal.exceptions import NetworkConnectionError -from pip._internal.network.session import PipSession -from pip._internal.network.utils import raise_for_status - -if TYPE_CHECKING: - from xmlrpc.client import _HostType, _Marshallable - -logger = logging.getLogger(__name__) - - -class PipXmlrpcTransport(xmlrpc.client.Transport): - """Provide a `xmlrpclib.Transport` implementation via a `PipSession` - object. - """ - - def __init__(self, index_url, session, use_datetime=False): - # type: (str, PipSession, bool) -> None - super().__init__(use_datetime) - index_parts = urllib.parse.urlparse(index_url) - self._scheme = index_parts.scheme - self._session = session - - def request(self, host, handler, request_body, verbose=False): - # type: (_HostType, str, bytes, bool) -> Tuple[_Marshallable, ...] - assert isinstance(host, str) - parts = (self._scheme, host, handler, None, None, None) - url = urllib.parse.urlunparse(parts) - try: - headers = {'Content-Type': 'text/xml'} - response = self._session.post(url, data=request_body, - headers=headers, stream=True) - raise_for_status(response) - self.verbose = verbose - return self.parse_response(response.raw) - except NetworkConnectionError as exc: - assert exc.response - logger.critical( - "HTTP error %s while getting %s", - exc.response.status_code, url, - ) - raise diff --git a/venv/Lib/site-packages/pip/_internal/operations/__init__.py b/venv/Lib/site-packages/pip/_internal/operations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index e4b8e261744c062dc12e67b27ae1296be3b0f8dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 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 TVgW&fWb@X_viF{Q$-Vqvh2`6w diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc deleted file mode 100644 index 001d0dfe1dd746bd18b0806291dbd7d72ae5effb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14231 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 diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py b/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 56253be808bec391f8fc20c9443bb6f1c78d8321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmYk0JqiLb5QQUHh_Gj{w$KBJh>fj{?Le3{LmbS{kYpG3NM6a-BiLD)RQlk3!@So# z?7F3@61T#3Uk(47)#q59=M_d>)OvP)sMO*gKH;UEf=up zNoT<;!AM~Q$30{&w5ib@EoBfE&>RY-fDWQi!oo3R=m&NNbnUoky_M;?*!yS(M~AlK GU9G-3MLA9Y diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc deleted file mode 100644 index 7c467c7795c31a2f654269ea4bb372bd948062a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1147 zcmZuwPiqu06i;Tdvwz&;)`N-_o$DSP6cj;3#99>5QdAI!fgw9dchhE)kYrn0wjk7N z=~u8vztUVi`4zm>H?!TfqFM4b@6Y7@-tWE8m6aZXW#nCYLJ;~DB^8xW2dLK;4u@#MNMnn@0~Gzt(zpol41V zZF?~ll5MCxVYMo`@?cxDQw6u@`@&ChXGEiv+&Mbt;9mL2OY>4#UU+Q}in`Xtir~*@777G<`ZEVFrQ_}0ju-M6)vBA0jMW9SA)oiB zicRx9&lkyZ7=nCMH#Bc9tOD&SvZI9>Mpbw2;A*dGk7%*W6-%!!zx1VnQqum?09qBz z6Q%unqJ-MkIat3VI{-kx)W(yH@jWiJ$pF~c(z1k7GIQW3TIFNmvoS3>3=l1Nwg-7L zDMpzSp5Fu0E>PeyBTSYH<$*FPGi@$r+GP#cY=I^*2i5Au$p0yK1z@=AAW#%wavqT= zh)4(bF~Pz4b7HT7XLzM*=Q-0wp4%&+S8I?m$pH@2HZjeENcJr?klNXLma7|0!~#^Z zq|Ju4_s-v5cx2Kge|j@-*6sfVd3ZK8flX^0a1D`{#A=L66)t6t)vjCNrJgZYxAvR7!-lg+1)3z^znO1uY1P_Rv;Bj0UBd*pp2+v4fr2 zvP1U5_F5s%2x<4oU&@tJ{{j*$pFKOHEvo7$&(HR={rtV}y<}~zPtdC3gXEw~$X|AF zw)q&`#cw18CnLfs_X;|quJ=YBdcW{XHe%GSv7%E3qrmB%qFaWe(CIw)HlGgM8^xl*{PpYV>s2kI>%e z=40#Tdk`6E$PX8-Ye$IqG1aW0zj;40Tu0}<)irp0C?q$}^Ll5?YrWykmQMd9+Vbh| z+5KB%F7`yBsxiRIbW)bN%*NGzy`yBD<@GpAN`PG@sTl7Gxi>EI$=Kwz*v8auk_j`e z@@fqHYoTRQj8%0?05hK0fR4*kZo~^346FUNf4cw)QdL%W-m%ZIAqeRF!*~jiR^c4p zE)*hZ?m$_Z&!dOx41_Dhz_S_f1&Xh1Z0Fk#lonCF1HhFOZ{P9rfwp_Lx~->7+qHM$ zTy0aT^$Q`}03T@3ich$|aEOtuAkS(;RjH$~agT;+);T{`!+PFlVkp5Ejtz zBw&ns=ouTJhkoLnut2|y_0&>w*^u!h#P2A|p;&TqM809iJ|&K~Y?)x6H4w}v(1&exf`Sl{5 zMYIfJG&A5w8qUo*#W|A-{FqY(>i?cNOK7d(m|>AAo+_%ba?GxUgN2sNKj4H9;BJkIO`YrW`AS zSRBS9mbO})6GNIcJ7n510 z0|Z82w1Qb-1L#5t%brVx82Qt#Iqc$UKXz>DFRG&Ts10+YQ0fG4yBtZA7e-&fAuY3Y z?f=ZWa9V0byoB>3*qR#2S*H^_)si<5*cWE=)e0>?UzA(cx72BQWU}~?u(R5Y2 z9gOYOHyPC^=@vH!eA~-J{p}(iVI13JjALz6&Beey_6&r!`e~P;;q6lKSt0J&8enWW RVtze7bb80U~=85m|)&$DA|q^YE_ zv&-hv-+NEhl`AR1)rl{vgNTr~PPx27 zRKCY;?xWy@Q$ePiKb=z40}-_0G^Fk>6j2*bV}FiB(vGGhN`Rb=Ve6buQy%l=C7Et> z`iM+Me_=ebH=)D$VP_j9D}m>$`_O%T=bN9EI=)v40UGaa=w3?D(!lOUJ7xa0wrf1`JKSs(CiO372D6ifj=E-eB{r42*Vj`-@;4}BvzQxe!O(pcnq0KfK)h8Cn{y=i34>;l;S?moj} zu$edSw3;L7JWUy{1F*f8hIN%)Fss<<0zk0lkePn&%no}Ymfq9m>>)UgQg-VC+63Ektp!{0%2wqE z*VX4gRgD0?LH>X5n`V*@iBNS7dWbp9`dYgt4j-9*cEPdSbbQ$M%uAno*xG$I2R|u8 z3|cEa1j-DNE5HyPsYXtcA(B-K!)R8`k3n)BySTB1w&O!`5i|ACN@w^d(Vw8j-^aUm z3l1kBR97H^T32n0po?y47fP0OV~ZNiarUY?6el203en68(^&Wlua0pJP0=-7Q8v$pLTvjVwdV1j{0BNLLy7-&-=a8mIwr+w%KqDkMw1p7_MPeriU^qaHHmIs%v0Bp7Ci^3h zlpQInlZ&1j^Z|?j^0Bu*K_7(Ip7IK9({{*RJC4x;U17Q8kTc|PzWGMc!h(T#-M3Re zYj&GitJ}&Jx(gUlG(Sfdk8pR1IK=%PbagasNX~?MN zW)NH&hj1OQ&6!zZzE+yV{0z;^{I0-r;|K}!nf2Ua>mawZ{A!8kHZhJc-zqUNK!#z? zF7Y7}&LMiOwM!GOz?oiusE-xY#|o0XIwxF20KFhB27@FYbfzm0s)GmM?Kq>k;Ol|J z{&e+NUW~!+@q{tKu;6_9~S%HO_$Cr^xH1;zC`a9cP?-8{}G3r6!1}w@l@V+;ih+&b3gGBTOQ3gO5MKSH|(R{C$CjA~y z1icBO=h1-j-Y6OM!Xy`z0hW3IBo--L@m_zNq@-72CZ&TYo^(bNdEpE&80F(sEWvU3 zDm2LPaLcf;kI!M>@Ue%N4R!(Kv8`t7M>(#>8ax6zHFy9*{0_l$fY1@1*`+Ov(k!h5 z1qxf3bE~wEFl3RjgM_W%MofTGpIAzxL`TMd>j>wWJNHUlB4S^Jl^Ra>zJwHEc_4-~ z7)4^J0IN_ofMeuKf?Y4?9BW(5QE4Wm2&m}(mx{~=h)A*?*O5f6)kL&RZ*anW86Ue0`` zHfT4b!wUv`OQ#B$4gymYC*A#s<)9@^FeHtFOG`N~t!G7&w;gF~>(Wz>hv2QWlz=UQ zE>nS)X2u5^fmNg8E-wM_!wM#$zNeaPl;vx%fUiM=d=FcO@wZ_Ze_19V1V$}2Hm$do zr4Yl^vRL8c_yI0P4R|$HeuWNT1qh-9ED-$4nmGg_4}@a^;kW{q?g9SkhnXjgIS>rs z#lUE~EUeN2gm}b$WzHH;QU0j~2%1bWQoquhJH%1Q0xg%g3P~7!gPtPdS-^4!CScCn zLAQ|b<_(3xnJ@g(F9CyKw?P`O>{+vHK1IeUjU99w@n3G~9h9}oM%$nMcwc3fj_5d7 zc?bxp(=iz9a4HP0RhPL|gR3Uyj_(KXRJi3QpsfMB8}M8-g2LrO6~E)*A`p*Aa?J_~4$~EVeg(T~TLt%NGq|Da z4RAzzdU4~O%Da4753X@2UuL{dq+1s&X;a1uHvRBn1h6KRv+tX}#<$xxy9|+MS5yVH0IhZZCEa7 zFT&9z)H&hvV$5Qy{AM33&8te&R;fX{enpO|pmtlzp%Ai?1FN#@YL!zlxIVh9*D9lD zQ)l^fzEn}yVE-J9palchzds$f1sMbRax8i4+ggHGfoV^q*!aV7*&WbruQHWA(k*yL zZ>-&R!~~8yV5*ukQ_X(>HK21+13Gb&UzeWz zvCuV7$EK>A4WNy!s&sl`sCXs}br>tYQf#1IIdx~M^fApj-rcMq diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py b/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py deleted file mode 100644 index 1c82683..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Metadata generation logic for source distributions. -""" - -import os - -from pip._vendor.pep517.wrappers import Pep517HookCaller - -from pip._internal.build_env import BuildEnvironment -from pip._internal.utils.subprocess import runner_with_spinner_message -from pip._internal.utils.temp_dir import TempDirectory - - -def generate_metadata(build_env, backend): - # type: (BuildEnvironment, Pep517HookCaller) -> str - """Generate metadata using mechanisms described in PEP 517. - - Returns the generated metadata directory. - """ - metadata_tmpdir = TempDirectory( - kind="modern-metadata", globally_managed=True - ) - - metadata_dir = metadata_tmpdir.path - - with build_env: - # Note that Pep517HookCaller implements a fallback for - # prepare_metadata_for_build_wheel, so we don't have to - # consider the possibility that this hook doesn't exist. - runner = runner_with_spinner_message("Preparing wheel metadata") - with backend.subprocess_runner(runner): - distinfo_dir = backend.prepare_metadata_for_build_wheel( - metadata_dir - ) - - return os.path.join(metadata_dir, distinfo_dir) diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py b/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py deleted file mode 100644 index f46538a..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Metadata generation logic for legacy source distributions. -""" - -import logging -import os - -from pip._internal.build_env import BuildEnvironment -from pip._internal.exceptions import InstallationError -from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args -from pip._internal.utils.subprocess import call_subprocess -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -def _find_egg_info(directory): - # type: (str) -> str - """Find an .egg-info subdirectory in `directory`. - """ - filenames = [ - f for f in os.listdir(directory) if f.endswith(".egg-info") - ] - - if not filenames: - raise InstallationError( - f"No .egg-info directory found in {directory}" - ) - - if len(filenames) > 1: - raise InstallationError( - "More than one .egg-info directory found in {}".format( - directory - ) - ) - - return os.path.join(directory, filenames[0]) - - -def generate_metadata( - build_env, # type: BuildEnvironment - setup_py_path, # type: str - source_dir, # type: str - isolated, # type: bool - details, # type: str -): - # type: (...) -> str - """Generate metadata using setup.py-based defacto mechanisms. - - Returns the generated metadata directory. - """ - logger.debug( - 'Running setup.py (path:%s) egg_info for package %s', - setup_py_path, details, - ) - - egg_info_dir = TempDirectory( - kind="pip-egg-info", globally_managed=True - ).path - - args = make_setuptools_egg_info_args( - setup_py_path, - egg_info_dir=egg_info_dir, - no_user_config=isolated, - ) - - with build_env: - call_subprocess( - args, - cwd=source_dir, - command_desc='python setup.py egg_info', - ) - - # Return the .egg-info directory. - return _find_egg_info(egg_info_dir) diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py b/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py deleted file mode 100644 index 903bd7a..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +++ /dev/null @@ -1,38 +0,0 @@ -import logging -import os -from typing import Optional - -from pip._vendor.pep517.wrappers import Pep517HookCaller - -from pip._internal.utils.subprocess import runner_with_spinner_message - -logger = logging.getLogger(__name__) - - -def build_wheel_pep517( - name, # type: str - backend, # type: Pep517HookCaller - metadata_directory, # type: str - tempd, # type: str -): - # type: (...) -> Optional[str] - """Build one InstallRequirement using the PEP 517 build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - assert metadata_directory is not None - try: - logger.debug('Destination directory: %s', tempd) - - runner = runner_with_spinner_message( - f'Building wheel for {name} (PEP 517)' - ) - with backend.subprocess_runner(runner): - wheel_name = backend.build_wheel( - tempd, - metadata_directory=metadata_directory, - ) - except Exception: - logger.error('Failed building wheel for %s', name) - return None - return os.path.join(tempd, wheel_name) diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py b/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py deleted file mode 100644 index 755c3bc..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +++ /dev/null @@ -1,110 +0,0 @@ -import logging -import os.path -from typing import List, Optional - -from pip._internal.cli.spinners import open_spinner -from pip._internal.utils.setuptools_build import make_setuptools_bdist_wheel_args -from pip._internal.utils.subprocess import ( - LOG_DIVIDER, - call_subprocess, - format_command_args, -) - -logger = logging.getLogger(__name__) - - -def format_command_result( - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> str - """Format command information for logging.""" - command_desc = format_command_args(command_args) - text = f'Command arguments: {command_desc}\n' - - if not command_output: - text += 'Command output: None' - elif logger.getEffectiveLevel() > logging.DEBUG: - text += 'Command output: [use --verbose to show]' - else: - if not command_output.endswith('\n'): - command_output += '\n' - text += f'Command output:\n{command_output}{LOG_DIVIDER}' - - return text - - -def get_legacy_build_wheel_path( - names, # type: List[str] - temp_dir, # type: str - name, # type: str - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> Optional[str] - """Return the path to the wheel in the temporary build directory.""" - # Sort for determinism. - names = sorted(names) - if not names: - msg = ( - 'Legacy build of wheel for {!r} created no files.\n' - ).format(name) - msg += format_command_result(command_args, command_output) - logger.warning(msg) - return None - - if len(names) > 1: - msg = ( - 'Legacy build of wheel for {!r} created more than one file.\n' - 'Filenames (choosing first): {}\n' - ).format(name, names) - msg += format_command_result(command_args, command_output) - logger.warning(msg) - - return os.path.join(temp_dir, names[0]) - - -def build_wheel_legacy( - name, # type: str - setup_py_path, # type: str - source_dir, # type: str - global_options, # type: List[str] - build_options, # type: List[str] - tempd, # type: str -): - # type: (...) -> Optional[str] - """Build one unpacked package using the "legacy" build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - wheel_args = make_setuptools_bdist_wheel_args( - setup_py_path, - global_options=global_options, - build_options=build_options, - destination_dir=tempd, - ) - - spin_message = f'Building wheel for {name} (setup.py)' - with open_spinner(spin_message) as spinner: - logger.debug('Destination directory: %s', tempd) - - try: - output = call_subprocess( - wheel_args, - cwd=source_dir, - spinner=spinner, - ) - except Exception: - spinner.finish("error") - logger.error('Failed building wheel for %s', name) - return None - - names = os.listdir(tempd) - wheel_path = get_legacy_build_wheel_path( - names=names, - temp_dir=tempd, - name=name, - command_args=wheel_args, - command_output=output, - ) - return wheel_path diff --git a/venv/Lib/site-packages/pip/_internal/operations/check.py b/venv/Lib/site-packages/pip/_internal/operations/check.py deleted file mode 100644 index 5699c0b..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/check.py +++ /dev/null @@ -1,153 +0,0 @@ -"""Validation of dependencies of packages -""" - -import logging -from collections import namedtuple -from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Set, Tuple - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import RequirementParseError - -from pip._internal.distributions import make_distribution_for_install_requirement -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.misc import get_installed_distributions - -if TYPE_CHECKING: - from pip._vendor.packaging.utils import NormalizedName - -logger = logging.getLogger(__name__) - -# Shorthands -PackageSet = Dict['NormalizedName', 'PackageDetails'] -Missing = Tuple[str, Any] -Conflicting = Tuple[str, str, Any] - -MissingDict = Dict['NormalizedName', List[Missing]] -ConflictingDict = Dict['NormalizedName', List[Conflicting]] -CheckResult = Tuple[MissingDict, ConflictingDict] -ConflictDetails = Tuple[PackageSet, CheckResult] - -PackageDetails = namedtuple('PackageDetails', ['version', 'requires']) - - -def create_package_set_from_installed(**kwargs: Any) -> Tuple["PackageSet", bool]: - """Converts a list of distributions into a PackageSet. - """ - # Default to using all packages installed on the system - if kwargs == {}: - kwargs = {"local_only": False, "skip": ()} - - package_set = {} - problems = False - for dist in get_installed_distributions(**kwargs): - name = canonicalize_name(dist.project_name) - try: - package_set[name] = PackageDetails(dist.version, dist.requires()) - except (OSError, RequirementParseError) as e: - # Don't crash on unreadable or broken metadata - logger.warning("Error parsing requirements for %s: %s", name, e) - problems = True - return package_set, problems - - -def check_package_set(package_set, should_ignore=None): - # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult - """Check if a package set is consistent - - If should_ignore is passed, it should be a callable that takes a - package name and returns a boolean. - """ - - missing = {} - conflicting = {} - - for package_name, package_detail in package_set.items(): - # Info about dependencies of package_name - missing_deps = set() # type: Set[Missing] - conflicting_deps = set() # type: Set[Conflicting] - - if should_ignore and should_ignore(package_name): - continue - - for req in package_detail.requires: - name = canonicalize_name(req.project_name) - - # Check if it's missing - if name not in package_set: - missed = True - if req.marker is not None: - missed = req.marker.evaluate() - if missed: - missing_deps.add((name, req)) - continue - - # Check if there's a conflict - version = package_set[name].version # type: str - if not req.specifier.contains(version, prereleases=True): - conflicting_deps.add((name, version, req)) - - if missing_deps: - missing[package_name] = sorted(missing_deps, key=str) - if conflicting_deps: - conflicting[package_name] = sorted(conflicting_deps, key=str) - - return missing, conflicting - - -def check_install_conflicts(to_install): - # type: (List[InstallRequirement]) -> ConflictDetails - """For checking if the dependency graph would be consistent after \ - installing given requirements - """ - # Start from the current state - package_set, _ = create_package_set_from_installed() - # Install packages - would_be_installed = _simulate_installation_of(to_install, package_set) - - # Only warn about directly-dependent packages; create a whitelist of them - whitelist = _create_whitelist(would_be_installed, package_set) - - return ( - package_set, - check_package_set( - package_set, should_ignore=lambda name: name not in whitelist - ) - ) - - -def _simulate_installation_of(to_install, package_set): - # type: (List[InstallRequirement], PackageSet) -> Set[NormalizedName] - """Computes the version of packages after installing to_install. - """ - - # Keep track of packages that were installed - installed = set() - - # Modify it as installing requirement_set would (assuming no errors) - for inst_req in to_install: - abstract_dist = make_distribution_for_install_requirement(inst_req) - dist = abstract_dist.get_pkg_resources_distribution() - - assert dist is not None - name = canonicalize_name(dist.key) - package_set[name] = PackageDetails(dist.version, dist.requires()) - - installed.add(name) - - return installed - - -def _create_whitelist(would_be_installed, package_set): - # type: (Set[NormalizedName], PackageSet) -> Set[NormalizedName] - packages_affected = set(would_be_installed) - - for package_name in package_set: - if package_name in packages_affected: - continue - - for req in package_set[package_name].requires: - if canonicalize_name(req.name) in packages_affected: - packages_affected.add(package_name) - break - - return packages_affected diff --git a/venv/Lib/site-packages/pip/_internal/operations/freeze.py b/venv/Lib/site-packages/pip/_internal/operations/freeze.py deleted file mode 100644 index f34a9d4..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/freeze.py +++ /dev/null @@ -1,264 +0,0 @@ -import collections -import logging -import os -from typing import ( - Container, - Dict, - Iterable, - Iterator, - List, - Optional, - Set, - Tuple, - Union, -) - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import Distribution, Requirement, RequirementParseError - -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.req.constructors import ( - install_req_from_editable, - install_req_from_line, -) -from pip._internal.req.req_file import COMMENT_RE -from pip._internal.utils.direct_url_helpers import ( - direct_url_as_pep440_direct_reference, - dist_get_direct_url, -) -from pip._internal.utils.misc import dist_is_editable, get_installed_distributions - -logger = logging.getLogger(__name__) - -RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] - - -def freeze( - requirement=None, # type: Optional[List[str]] - find_links=None, # type: Optional[List[str]] - local_only=False, # type: bool - user_only=False, # type: bool - paths=None, # type: Optional[List[str]] - isolated=False, # type: bool - exclude_editable=False, # type: bool - skip=() # type: Container[str] -): - # type: (...) -> Iterator[str] - find_links = find_links or [] - - for link in find_links: - yield f'-f {link}' - installations = {} # type: Dict[str, FrozenRequirement] - - for dist in get_installed_distributions( - local_only=local_only, - skip=(), - user_only=user_only, - paths=paths - ): - try: - req = FrozenRequirement.from_dist(dist) - except RequirementParseError as exc: - # We include dist rather than dist.project_name because the - # dist string includes more information, like the version and - # location. We also include the exception message to aid - # troubleshooting. - logger.warning( - 'Could not generate requirement for distribution %r: %s', - dist, exc - ) - continue - if exclude_editable and req.editable: - continue - installations[req.canonical_name] = req - - if requirement: - # the options that don't get turned into an InstallRequirement - # should only be emitted once, even if the same option is in multiple - # requirements files, so we need to keep track of what has been emitted - # so that we don't emit it again if it's seen again - emitted_options = set() # type: Set[str] - # keep track of which files a requirement is in so that we can - # give an accurate warning if a requirement appears multiple times. - req_files = collections.defaultdict(list) # type: Dict[str, List[str]] - for req_file_path in requirement: - with open(req_file_path) as req_file: - for line in req_file: - if (not line.strip() or - line.strip().startswith('#') or - line.startswith(( - '-r', '--requirement', - '-f', '--find-links', - '-i', '--index-url', - '--pre', - '--trusted-host', - '--process-dependency-links', - '--extra-index-url', - '--use-feature'))): - line = line.rstrip() - if line not in emitted_options: - emitted_options.add(line) - yield line - continue - - if line.startswith('-e') or line.startswith('--editable'): - if line.startswith('-e'): - line = line[2:].strip() - else: - line = line[len('--editable'):].strip().lstrip('=') - line_req = install_req_from_editable( - line, - isolated=isolated, - ) - else: - line_req = install_req_from_line( - COMMENT_RE.sub('', line).strip(), - isolated=isolated, - ) - - if not line_req.name: - logger.info( - "Skipping line in requirement file [%s] because " - "it's not clear what it would install: %s", - req_file_path, line.strip(), - ) - logger.info( - " (add #egg=PackageName to the URL to avoid" - " this warning)" - ) - else: - line_req_canonical_name = canonicalize_name( - line_req.name) - if line_req_canonical_name not in installations: - # either it's not installed, or it is installed - # but has been processed already - if not req_files[line_req.name]: - logger.warning( - "Requirement file [%s] contains %s, but " - "package %r is not installed", - req_file_path, - COMMENT_RE.sub('', line).strip(), - line_req.name - ) - else: - req_files[line_req.name].append(req_file_path) - else: - yield str(installations[ - line_req_canonical_name]).rstrip() - del installations[line_req_canonical_name] - req_files[line_req.name].append(req_file_path) - - # Warn about requirements that were included multiple times (in a - # single requirements file or in different requirements files). - for name, files in req_files.items(): - if len(files) > 1: - logger.warning("Requirement %s included multiple times [%s]", - name, ', '.join(sorted(set(files)))) - - yield( - '## The following requirements were added by ' - 'pip freeze:' - ) - for installation in sorted( - installations.values(), key=lambda x: x.name.lower()): - if installation.canonical_name not in skip: - yield str(installation).rstrip() - - -def get_requirement_info(dist): - # type: (Distribution) -> RequirementInfo - """ - Compute and return values (req, editable, comments) for use in - FrozenRequirement.from_dist(). - """ - if not dist_is_editable(dist): - return (None, False, []) - - location = os.path.normcase(os.path.abspath(dist.location)) - - from pip._internal.vcs import RemoteNotFoundError, vcs - vcs_backend = vcs.get_backend_for_dir(location) - - if vcs_backend is None: - req = dist.as_requirement() - logger.debug( - 'No VCS found for editable requirement "%s" in: %r', req, - location, - ) - comments = [ - f'# Editable install with no version control ({req})' - ] - return (location, True, comments) - - try: - req = vcs_backend.get_src_requirement(location, dist.project_name) - except RemoteNotFoundError: - req = dist.as_requirement() - comments = [ - '# Editable {} install with no remote ({})'.format( - type(vcs_backend).__name__, req, - ) - ] - return (location, True, comments) - - except BadCommand: - logger.warning( - 'cannot determine version of editable source in %s ' - '(%s command not found in path)', - location, - vcs_backend.name, - ) - return (None, True, []) - - except InstallationError as exc: - logger.warning( - "Error when trying to get requirement for VCS system %s, " - "falling back to uneditable format", exc - ) - else: - return (req, True, []) - - logger.warning( - 'Could not determine repository location of %s', location - ) - comments = ['## !! Could not determine repository location'] - - return (None, False, comments) - - -class FrozenRequirement: - def __init__(self, name, req, editable, comments=()): - # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None - self.name = name - self.canonical_name = canonicalize_name(name) - self.req = req - self.editable = editable - self.comments = comments - - @classmethod - def from_dist(cls, dist): - # type: (Distribution) -> FrozenRequirement - # TODO `get_requirement_info` is taking care of editable requirements. - # TODO This should be refactored when we will add detection of - # editable that provide .dist-info metadata. - req, editable, comments = get_requirement_info(dist) - if req is None and not editable: - # if PEP 610 metadata is present, attempt to use it - direct_url = dist_get_direct_url(dist) - if direct_url: - req = direct_url_as_pep440_direct_reference( - direct_url, dist.project_name - ) - comments = [] - if req is None: - # name==version requirement - req = dist.as_requirement() - - return cls(dist.project_name, req, editable, comments=comments) - - def __str__(self): - # type: () -> str - req = self.req - if self.editable: - req = f'-e {req}' - return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py b/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py deleted file mode 100644 index 24d6a5d..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""For modules related to installing packages. -""" diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 0a4818b43214613c626828342eb7eb9073333ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmYjMy-I^Y5WFvqA&_VA+JL696OlBrw6T+gWz8*@!~1TRyYqwiM!r&7AHmMbjX&VP z%rY!H%+hkXa0boibY=7XWd36?voW^0NpO!Y3=eKKd%d`m>PHDLnVYYisdMmMd@8L| z&Z$JNw0ow=ZN0c(4aYOYAUni2S7#RWEuXr*hQJeNQP3)}(m2{F=%MeWU`!n%jf~B* z7$zq6b8XT1=kI$?J)h?YS}$(bc7o8KesaCVFu4ca zoB~i(B8q7waEaj^i>QmsxJ$~Uo0JpmZHY*`X*mt!iO9NHISb=d)&TCjpkV{0L5%ats8tr}*`or15} zs(50U9r{(jEhsx9*u+4sHwuofZlwuuIywL4;f}+iF8aE8TDP9nD~3Bofz0oeu?3uN z@O&5;F>p5KuH9%gw41zuW>s-T$to41zqJkF2 z9q%>0TsV@742EgaD0#|Tm-d>S^50ytQ5|!0Fzw8STQ6VSJfn}66PJQkEz>UH684$` z(K_{z0W1%+mqdFV^r45jha&)&$l8YuM zLRW&XD}SE5dr3^y^S&ZnTBf01E7da{ir!Rvx~hviK}5JCz_nXkP0nnkP+e~B}6ZLy8dKA gmuqm-Cz*W(wLS>;HHMk-zDbnf528aHo+yw10~u?4Z~y=R diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc deleted file mode 100644 index 300e8a465673094a219f22f864c4f2cf6c4f82a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3190 zcmZt|%Z?kzv3ocqhg`n)&3#Fe#12A4BILkGg1`_2$8r!rkl|eefhP>cv+Q2(tmdWe zruLB`5O@W|7h#PY6C@yy`U@kUkYitcO76J?LFB5Q-3=uzhf~wtRbAcnuAteh6ZmD( z?cmc6A>ZO;{%6DF0lf0>02uKIqs)q^N6pvrEb}dSCHR&iJ1%==iZpgqiK|{Uc04Dp zc{Q_Ej_UD(w_wJVs1Y~4rWseGR^0a5X6!_rc+p!l<65*7FMG>oT#r`bRd3ad7oxRz z-CH-~M%0ZrybVe?oo@228TGb*MOc%yo)gyMJLe_u7HhN4bK>1*)*k6Cp8fO@9|glx zH%z1oq9{;dnz)%rhg`}#ZrJC2_Y29@IO}KEL|^pl{{;ET;~v!u!^0pMabKjV>Xo$p zD3nS&pJd1a}c z2?IhuN=G>3i5v^=vk^x9B~}96*?OhW-K7X02Vn%a8&cSC z^}{i8`X#)w1wfH0ospdQ79)G)C4CG!E6G!-9ey$d2@X=k$Oq4O@@x==`vVy&eixRWfYfr3 zh1md3QCxs=25H8HF}NID>TVDjZvb0s#|Oet`TjcI9fcs)+0IQ8_pc})gHB*ug4ghM z-S^{^jUya4eE;b!>uf^Y#%~YGzG3s+>DH%}L(*isW|Q%1e1UujLhHzgU{ zHjgzoa`MiM%73WZw9cw9HazF|F=r3>Bx^QN3#b1oc&o;j^mCF}_lRodopXAzJz36| zr>z;8wr6CrGQU4rdXIcfWq1DM8}L7$$N!NWP*!90=gwp`U-^jq?#^V*+_sai&FEx3 zU!N|rg&F8p?B=WaI_RiN;gqL;f_IlSrb~Gf=r+`HzHv^!q$4ufG<+UR*7CLK3fyta z@LSCx9|4zdax*_#`x#*J&FQ+qc7gZSInBE>Yeo(KKLc)K2AWlydG{RF44s{KSrcr! z4cgddt#j+*9ixve)&`4j&M0fI6Xfug+?KpIFE{I8{(Gz|5VEOYkP+-BkZsPEE<@pN zvEElFs#n*oQIzfnk)N8xCUyHN*<3FaI@IM*2K!QAcIZ*jgU?GUZo{XDYz%7M02O3BVWvd<7FJ{h0I^o6 z4GHB^kNpp#bQnbPet(|&tk&nF(Opc7XU~5>aaqWWNMNUM7%1+l!$7$q{EI5WnHwbT z^&X%Ht6+NXyPqV{>Hif73G@gs(j9Rq5s(8xyKip`xpW~HyKy%m8EEcfZ|68P$$|xO2b4f;JksLhKm(`0<}`=3KX{y7rM;&{um7Z z@MOr1mzngZZOGCIcoX=KuFEV6RTL&%>M96l9L)jUN-T1^0{##ON>q`3St=1`Xd(2u zlH{4L1Q{AaR|SuZ`D_Vd32b?E`B;D(_I3oOSh0=3*zx-~auNIh!Mgx-MVk7oo5msi z?9?~hoKU9FKyaoV!JnEkplkbB^L?mBdSjem9pcQF=~xU+8857(+epv29KwyUaS-3b zV;lt)8Y4#Bf~nWI3OTIr5VoeeYkJ@{EmnQ zzYog|+OXEFhE=cD=_9LAbttS*ht^BhE6cY2YnL6%hPgvqux``NE2nfdd*2efaB9!h zRo`dn5DIJ+od~?Ra5`vRiEc4)udxav*+*!CR9Dm~bV4J6(J!!@6=kGdhsL0P-5B(* zjV3Tub@z2FbSi~|%EHsOUPnXG=Wu4>Bf>!jZ%`DMy1KCmhBuBVDB=)2!g%L9uOCsM z=UP8=VH05b){Ug&{mY)#1fbr&iRjwhFnV=u#ML7cnF2c?@e>5^Bftj47+|h_!4|FX e4(EfS>$#7;pL7A(#&Brh6$_0#_gM8(r}7<+eKWhadjOQEd{^7s(~oby?*97g@70?h9L#9=tCe=-ttCzScYNsnOX1-Z zKK^eSn&xVb=IX9d(j8sC4abo0gp-hO(=p{c=_KVl<)q|0?O5{N=k&>U#>vQcztb<@ z1I_@x6Q#lOkTaz79cF2`JmQQz(!GF=tH5Ql$;$ac8`|(b-tuGARt&J&U!Eaysq?2 z`IK|2eA+oJ&!eSh%V(T3<+IM&@;T>R`Mh&p%GZ~kD?jf%U%ud6D1XTLQ27Pt1t}jZ zy;#2JTr5vJ)4Jwud{~2N!Om!+;Ml~P0iity|j{WE_tcehrP>pbmxk< z!`z2eQx8Jo4a#AeNT)jjKOaUZ&=J0Eeky4!AQ&PUzt?hbrA zuI=u`_s85_?rwZvb@#XrtNBf!JO(^2;^JUxad4^PM3$MN*IcMO=%xlg!HqR%|akGoHy{3&k& z8u{E zTT&%IKj-CUj~(?Yg{teJFn!VUeKgM|!en6~U#x`vbH!5NskwZ~_rf$@3oy0pNN8Mm zDIA>n=%sVHGtZwp^TLJc=fcG4%5rEuEAK_Ebp|NrXG>mao-G!F(7FIP@*L%YstU~) zi+&KMr@b39%QY{wUaAGfY9(I^tt;N^OF+vD6IZ+-OwKIT04Vu#1=XQh$ooOo2-8ln zcD{&mW-e6bsu;mw?b>`!d46?C6+9mW{Z|UASPL%ZuXzfOBlBL6^WNZ8=DbRvmQglv z7Fej_>=Iv&p=Z2`zofhz3d8<5A9!y7QH2o{ea_Un3(*?n+2@>6RRZ5g;N|>cRprXX z3exMI@(I%jH=Vt3`P`YA+{>3=%w0S;bNcM*nbW!H(-+T$eP@fxD+DjA5}Ng2!E|0c zmwVydN3VpbD}@EG?4fvF-d)TWfNw4+*K$}Aj9GcL63Vh>I9$lr0wC-HW4F2#bOzuS zRoJ(X_ZOlreYLy_iZVzu94ss;MTkq~yniiRU-WY~iors$l0z@xQ&r31VP7UIQ29at z=zMQ3sODU6F27X5NI^8YT4~A0gnEUgKo)nrUaaMcfmhA};%Yg^hS&REPUth-)3Z)^ z=jsaNK&w$JOsREARfB4wS}KrmyZ^x5BR+2<<7wdU8hJbUI(a(yx#1?T=fKaggUrw* zsZ1C2E*Q-7a|R#ZMB-{!wDL&~<;z&) z`Kz_%V4+&c%@>2K^Z7EU23yX%dflsBzgjBJUiC2-lkqO}uhxpStGQwYI{{RFwORu` zaXtL2@s_?Svolp&#_RLfy=RFS2dWwMKH@*c(rh}ka=8j$mJ2gEuEP>mCKnFma<4Dt zOL5JxuL{@-g{pFMwS2G;_PL%PMA1(D2S026k}tIP)rSz(17n7!na`;pKw z<5T`Z{_tbR_GjzqDED-jDq)r@kA9#(olU6&z)2C~FcksBH^$?7VM>t*YheOk*<@%& zlQvtb7Owflx)e07?R_Y$VJ~%W_jfK?b1o z1B%(*w=(jm=6~`KHah=5ijTZEjrZ=6_YO4hJ{>gL8fciz-P8Nq-Mw84E7Mp1@a2gA z+Pil~9Ka^~#M42N&B360Fe;W=k5_RXBmk@I1$j4*8Crwu2I0Lq1yDS@ zY7wXakYX0B7S|$}Kmkdd-~Jm&>YE}IL7=+iKw3@XRjsnc)B=6^a72Vft*FfzDG=io z?GT3Hnm4t#w7|Hf&FOB^P2IFWjEOtiSun{JK#FV9Qe$-0fZ!X3uuE&&87|-;sp24r z=G%Ar=a-7@hn{&Q_aoQ2LbUfHA&&+>78MC|i-S`J0HtO#_Jx~-Sk0ME)jx)*6uv@E z37!if1j`PFB*&OtowLtTsJc|e88;!M4_1U$NytdLlP#XC)QNQ@Fb7(45YqxE&Ff`;}totb`#y?Y}bqvjXY07FsWO%OcW-rc22^bv<8Nf-s#32fF37FdY*dHrP@z0xvJ(JHp`(%xI>U zQ5YYK2DbZC;WY$h8?|4YPaUTdZr$(EGAHVZK)(M$*H8folYD;RB9E4pi4 zGt}?7eXaEk%gt=&@zqz^@(cPhq8lDF?Ya69iBh?ykhtaRE zk+>tr)aze&N17SHO+|2_Gaq8BMh4Kuw2f-CWuN-3e%Ca4E8i*yHU8%~BzI1x#dD-KU#%bqq z(5VV|MRdqTC!xPuY?mXIljmX;kfGj|s{r=^&=FIqLeo_@po!Vj=o3Ni746C5D1cnS z$G4HpbL(ybFO7r{tZOTQJP!PyF!5b6WbtL->CTk!UEuQ6XjIhJA(tV z=z7Y|yJ9avUx?8{u~jue3S6!(L9F)X&;~U=Y%Vz7e4KcI71Qwq)D6#`oUBwQSuzF#QqA@E!?;-iL# za6%^M1O1cJ5zGBc=n~~R)TqedzlV>Ip{du8{xoFRKBel#>6d2C9k)5lv9TbUE3o|l zwjm$JrC?#dpS4BYq&OfV@Fza`iHUdx%K2qkf?3bT!3SFv)@XLwhGEFg*Kj~bQ|3>F zdL}y__Cw7t!Sq0dIP8zD3~~Zt?**&m8>TUrB6C`^*q)M0U`fL?lLm? z6Gw`(DZJ3DxI+5sW30c*`Xo&iewgxM5c1qG0sSsaMXW0{7a=2r2{5|sp!y72J45rT zx>SQHWOiBhi$#r^LbRfo5%x#4AgZ}z$>ss5u&?aT=R~ZA@wlkkT)-KMUfOw%#P%Fb zP0nBmHZJLun=1#-P#ah-fUVDS*2$ObPt1D`FNjFsuW(?pO?Uo3m;7^R>(3z3Qqb)a z8HnTq_#a86jIlpYrMBXfPTftJtTQ2~vv$NV^{sbJmg(kQ<8CTt+%?Q0ebg99So+vq z3w>FVNvJOaZV#PPmLr{?!AAsvKt%bQp!Z15C2i+_5zVG)t1Lm|?$TgY^@dOJGH=6- z_R{6EqC-t(M0mWwCFI`s^4RrgDd!QW6y`T9Dr&fw12tt|CKMi4*pd}HntpEdGOU9F z3gxy)JJBJ8-B0?XVN0wH0hZg3-+He7GO&icePlAAiPGLrdYcei#Dq<&K~{Jbj4)s% zwQ9u$GpV9|WS7B+#%4rHBh)-uA+VPxp1hG%AD^)iaIahoaL|jm zA04zkt4cM3N0M+anpVKQc3n;IK!Q9*tJM^ zg9Zvx`cpJ(tDj#*zQ@+q*5l+YA3-grdr4O(V_AR#r4At&s^qG4&@O>U8nrWNpSxo; zfnzJlc8e)kVDKEIU07&VA{{$Ebq=aicu&^q;>HDlUhI}P17afE-IV)6p9p8 zCoHg7EwHGx$6co_`Q918xH0;!b^jr{`a?)G!%B?mqp+t9fgP!@qoilfduD?#q*e>j z+ISoCQ2=Kht&m_c=CmT+sb6Gr3JDP7xf>(t48||VX|zBqK|97m_9xJJK>? z+EA2>3fvX#KcY`^k%jut$UtXElJC9t*=7o8QkK`RnQBh}1DR_;;x@!gm2#oOKsHa) zJl04z(pVO&VKt2FntCNj1}SP6D>?+gzGkL!D28ML(qbb;<-KCK$!1?%oSE89K@Q>RMM*^k@o+4$xPuj_5 z)X(D!Hs0zyIAfTO1wL8MFj1@4#D1%|4b|tFkOUPK+w71tP%XJR8b`@!!oJQh)ibCM z`^ax#>xYN|1KTWx2WP0$ChC(wPiL55x(Le|hIzKTK%M1FUm#F@PBxUYp$pKexqmIy zZlOZnMo@e#oo*RY?;e2E2FzFrpd?`7T;HT`(npcY;CWO&>etY&XXB+&(4lS%uxR;$ z8J1K|D_Cq+qH$M!-c1C?Vgd@vQPQ+)HVkUIpmvnP^b51@9m7psOQ?@aeY%wj(up05M~D>k~s3NnmpUI8Kr zHiQitE!L);b?2t9ynOlGr3;sGFI}3s@Y3{^dI}Zx(~)`2$>dA$hR80gXHWqx=xL}? zkmz`;|EjzH>eN*?`%LzkJ+z1^ z_-^5TE-Z8u=xb}pQ+*nsJ$S~RBN?k5bV zKGt0@84vd_G{}wJ5cf}Bb)(VlQGXAkQ2&65C}XP{8HcyTZ6@=ne~^yRfH~hRRBOxX zZ?lsaA1Iec{6*B5FYu8HOE?g_lQB}L6+2m!g04WVhAX6g7D+a(-ekr4Sa;@O+U7kD zS3A}=9Fhdgqv{``wX?o^Jna@e^T?*XLkc%NXpJ7>ILW58v}KsP2cRs#;Af2Ddqk86 zrbA#VR4G^|UNTWCQcx<)R7!_x0foX!j2r4ZfKwo_?my1rDSU)$tvY{Q0}kH=mvG`Ai~*@kGmk;~<6Hiqvpfk`M>6 zF?}8aDxIV1B$BW%N1wN-fn@fmdz^Kv4XjT6nkj@Ew^)IhI!7C)_-EH`z1|dXTmFRX&+CBCJ^q@yox>br?evEs5QdfyvykAo~vK&l{FrAMGU& z1_n&Sy?q?b)l*DPF!@a;g6RW2{oh5Czsy&WiD1*EEmN`V!JCddekcoF12zQY?jKmA_?cH(eH_#A%ie$9OIvY!5D@gC0+0c{?*h|wg z{J+VuS!lw&mBD{~{VH+~-dG(hx1cAnqRWwTN<=rn(CoN=u)4p4R#7yC#~c}hpr`J$ z)ui1wiI$0GngNuCyHJXjGI`&neBdhna{&5A8zfgzvE-gLOz?&HlcT)7hT`9VqIA=8 z61T9g9N5F*?b&d#=rgjS9msWMX%6n(do)mPe}WbNSfH&?E})-3cAmuBtNxV>6;l~!|&~aLEC+*W6=?9iqzKRxHg+MR_B)L=enK^qQ2x|WEgK)7kstu?iQijnt zQ&ly8kn%xsu5D91DDWpE=hMO6u-Q)H(2T9MzL-+P&mj8{vI$MM7;_RfUr$Bbh9_@K zT@K>F;55t$I0Ogv<#GjB==@wR+PF`ksdW1LT!IXqNNi@p__1-fzWu)Q*r7ZS&wVy+ zI2ga8;FU`4*9dk09^WM|{9WX}#TSxREnV@shcmOBOLGPvpVk?w#Ple~hJw8feGx+3 zlBV_s@T8GXujrpfN&E0H)kEk7-X`lIFNh2@MmX3r-(gZFXbl?+x8)>YE><^W{kz<+ zzd_u|b)ecqyHFu=1wMBF$reF@*v8uw>zYEd1|q!rx@a~T4qYnNqOBwmf71mHzx~HN z!SOq$*7#`BLAByczXJ<_cyn=X5*_s~kRVb9211kw3;$OvNmnIQ(O0q>vM#bD{|1%c zYi~mitG>P$qbUKUPv5)h?5h4HlT{|Ry4Jssir?y5Yd+7MF9=^lmVcxop2IS{FJqvA zcH5!>2lfFARsg-xhm&u6Be7__m8zuhop>u%)ZR)4=8E=~4s9*tPTkUPC2ytX5Sqog zZT8=?5R(8=>Za8kaOnfpnuE8}D6`zYo7P*AZ0UT8}ga zRtInBh1FuDF)CQCZ;myFZd*b6b}GQhe@Ami-Zs!?Ly&1~XskzW++F96 z0?J18+SnMAUYnYm8^ah`0`*(aa!X?qat{Uljq%1q>=O)d+_%#!iRMG|yf!nsmcFARep*TlqEE{i(L*KKTI~qG$!#n|C8QHNog3mg9 zMpqKL_OAZ=hh)|acY`|)*tWaT-2|+6Hq3Vo^@(8piuTSoo4bOs)`mOUJGXI)jJ3wy z%_95QD;nU>HFpOa8@pF$p}8m6w79vk2XV}ZWPUr*e7Ny2{IlO^>}>4D4&EDVS$wFq zwXye({;ux-K*FiExp;1EXU*acciSD#;R$~Pp6jW`BQh7vvHXC$)7?^pQBq2in8QB`4mKV^zlp|# zyM0NQ61#P%F~Jt@uHexXZCE>{y_E z_hCF8Y)m!|uITSRV)q;X-(!t~f>}y%NvL0MLk%7W)JFmJ zQ9#|(Jlr_kdJNw5C+=viC*6H_B%0u!IZpV$bPxPT1%CQnQ)Sw)-Ti=lBsktU;${)N zhMNZWf%IqhKsq9jwzi&f4`8;BVl7Uzo^Bj%o#Yx~ejW>+X*_m2d0TH}Zl~Nw-cB}; zb>4UYZ+sl1d3;VUYQZUYVnzR&{#pHu!I{RfmHUs; z^xy5q%-s$N<6!=698eb`wcSRb03+99?@DYfq*>&+Jx${XoIkXMAn0)sKEf{Rpx8d* z_E88I#OvcxP$XnzilB1bOC7u)G{3BxzHI!(oqY+nK5jD{oT9uBQH256aNWWO1nnt` zu#fw8J9N8IfWU$XXOVoCIG_iC;yW|9s6hK6YHb}g%8*puz zPIrvvxc%yahq(|R_3Sd@i{pybVcC~NE)p+U3k-?v{zB)!~Q@Lb^Rm5z4?c!0|t#i+JD2y7#I)8ji$v0x=2J!ZqdVPP}Y8D0DuUgmEb}ayO=Z^vg=j8}K{sa=t zfEauO1ZPp;pn!=(ZG_=jFq~k<#O*iUR<%!|5A->U+naGSVFGs1E+-7+a8~)wU=*6| zic8%OO_t(TK%cA_%`RQT?Stu5d}h7@wi0W6mW;H%^Fib6^y!hCF;5~ziP4kNJS-Gg zSc!vzrQmBsA9oXAd6OVpxGAVbZ8yo&m>M_E5wAsH2QKOviBun6FH< zYMhR)W!prjHE!cns?s5c+a|Pg=1aqzGRDM1L6)cjLm#+XKlGr3;y`BA6F0K4{h?+PSMM0zh$5YLyS%7rr0>v;-MJ>raTME_i~0tzs(sVEq0s*+MMI zMl@q2U7z~tFzi{?Bw+9(3v?bCC^c9laG<@>?tqw+5Z)w<6C`-ofME&PGl>&$dkPgK zKnJF%Jr?hxfDYg(rjxjbHBiCgN8a@_K* zt|<^;nub%@Tnj~T>T9HEE^S&EB^|{i%6_!BZYM~T+2pkPCE#D5eVI|okg0Io@~FYd z4tor2GT7}?_7p?qyLbSDzaXtZHd?4Il@QK_$WJh3*De*WK{DBQB9@tOW98(*6C~o3 z`=-=wzUZ&MT)9@M-az0@BvzpbW9dXHk{34Z{g8oH`4fU%{y$z1bp55-wh)2vx)>o5 z8uAS15u=kxa(w0fH=Eh)K$o5O2S84u#UxfC%)G*IX9<872B&P+-(Vt}_2-!TE|P4Y z>{#{RkPr2olZp2cUV_`fWQo8_w();K3&g9-uw`RA>mpmoY7bvbhVUJ5uZM_+B)-zt zSAUG6`|o@%4#YWW%e9;0o}!^gLmYyE*y;gt&V>16I9v?yPyFNiu938UWTuB;O#Vr{ zVJ-0c@`kmIVAtRYC5O2<9r8h-qJX=Pqa4-b8n7q{(qV#=1>+hoV7WOwsQ<}UM#S zBbmV&uyvXu7GO7h4Nan$0(SZ!DYOgp%Pjv-O#X<;s&z+3!<(1gc#vQ&awzy?_PFAARY7%<6#wj2E|Zlb&YFg^$;wA9FD=^$P+Gozz@&kFdYw#+(Nv>>I3FV zOg@7ICxHy{=UKpUV$76>!sLDLW^4fBu?Esb<*#wb1Ly_H1?>*pHH^%U>ytlW@b|*# zSvZcmbJW-IKpQ^Cyoeh#G)~K9GaLknI>3{fY8Z%BGZ=^8OjJ%lq>Ae3t@@DEnQ@)n zsY{}6uBRX38ALhIu4}b7s3csccPTYpH>Yq>>iz%2@a0Twg@*CE_-8CIk;}t(BTj=? zfNCU8zRTPK6PZ*~eZN!n?~!x*M1v8L*buL;YOq0;*8%5t3WXAKhheH;UoC?B!B>So}e1YWzQ8V1cwn+CigX{JmF}<6~ILt zWLypZ(CZ^OJkwkY{{-`*GK{p{2MNp(!p?;GeipDL?xu^03u}Ir6%hq?hu3gRIqT<^ zpdWN}Az`f`)L&tjHHy;)sM@*c3VC$tnE?EEId4N~uBFB>XXLLLd>%Yw_l43!qdj^C ziGNj?0M+RA)A7YYF?;}r$O5ulh>pk`asV$tT*fI3U7A<*a5lp<62*hq_=8KMuUO`F zcZ3~_h96#4sGwb`>6S-DzT+;_v6z3t& zdNa7PmBiUzKp+VGIf&*y1vtVnr=v?>-{v#vxA=E4D?PKsU2Ng=6h0ELO!bErsfI4r zsB!LOQVZ;1V0K-8;fZdW6JzTdh%&kj$`knuFRY}D=us&6$QdUln~k$^T6NXAV}q* zexshg@Y2WNaeghUpU<9Ehgh}9s&sti5g7z%@*1UVG;V422$SthKE{Mcx%xvUWV7l~ zCQT-EI!12LUN5cMkBU%Y;-PW+;SfUq3k&T4c05CR!R4Yj{_F^R(X(}hxXcGgplbv>_&2(0oQ zi$8TBOZOdiHffcJqH4atZa<5}85CuxjGsOzBGg;`BUXHw$uBdRKthZm9={=*Z79x{ z^A-H0hKhv8Jez)=$u1;L8sRyMK5i_$#-fiP2?v01u6;)}Odw*9H_P)NsxXSQm74?- zg(r8e!<1anRZd^@jqpQ>N6sFPNcTSw@*gw#Uj*NW9U7St!!fy3u*Mh|W+F*Chu;SY z`)HqpAnUn~MFSdjd{rbYA*erK?mselpUHn`^1qq<2nkPra7_nSfN>`^%CGCz1mmK$ zvX8I+M0&HEuYQcYGb;DJ+H!8xFAi|(DHPdpP3s5@&wq87u-5d8s=v=_25c(^@)_ghzIVYa+}I`m_3VzG`FF{o9^6tj((|BaY^a z1tK4YFkI#62NJPSr9JDb$5~`g>VD=JoZ;1Fi&5(;kQPIo#f%!XgX`tKN&7*fS52m( z+c@oVLQq>dLliHd`A|)XOpk9emtmENAHsCxKoz1B@)JRKsF%@wA3gj(KwoVOE`sWo zk-{|;_{@z_YoO0E2l@y4hxS_#QFzFjcP-Pv_t2l4W(LL;gGzYY+fKEvDMho}&Ll?zDk|sJfxaUv*GB_)I z5McO6!wSWqGx+#5Bs8l>A^h)L!fjf)L-G!O_ljm_M6Sb}(=Z!Jm^W}$;cbK--y;E> z?Un%Ush#bvji+jcmP(vB2*xhfjva-}DH1?08&%s#@7tN|U}7VIe6SHH%cx|{u}h?D zhxw`lY zoLem*isY{m!BJu{&SWza&>7DD*x`i027ijIEfTH2#rEH0LUK^UY?|VwyJJVA-%uI! z%D9d+6&raK(8LjgJ9R3kR!e>)9f$xy`*oNKmKpu5(genZS6p$$y`cJ;aPie36AIdD zn8^r}bxcN?tYT1BVZO!%3Ayo>039C>m%7P~0@qwIk!q!)&&_7ovDP zr#OqzFM>ppFomkMh(|5UMa&(gI*E>qepZK4Vz}*oa3hBv*M5RsCYekzIf%rGX10TI z^aAk~MB?eAYW%2`#$~qj zm{8)4L{<^uzQV_^GWj}_Z!q~aCf{N5T_z&h{w{MNliz1T)~+@(Aup3n*tL;)R7STk ztrJ)U{74giHV+&5CK8kJ&G-4IiEd1Pew4qF68(=!j=z;Mg3B12@arj1+l`S7Pn_{Y zCSzIF1}kZ8ww|-LSjo(Qm9lnPuMA~}hDQ3W^vD3@8vg$<^C|69+Ovqa9%+~SU-wNl A+yDRo diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py b/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py deleted file mode 100644 index 6882c47..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Legacy editable installation process, i.e. `setup.py develop`. -""" -import logging -from typing import List, Optional, Sequence - -from pip._internal.build_env import BuildEnvironment -from pip._internal.utils.logging import indent_log -from pip._internal.utils.setuptools_build import make_setuptools_develop_args -from pip._internal.utils.subprocess import call_subprocess - -logger = logging.getLogger(__name__) - - -def install_editable( - install_options, # type: List[str] - global_options, # type: Sequence[str] - prefix, # type: Optional[str] - home, # type: Optional[str] - use_user_site, # type: bool - name, # type: str - setup_py_path, # type: str - isolated, # type: bool - build_env, # type: BuildEnvironment - unpacked_source_directory, # type: str -): - # type: (...) -> None - """Install a package in editable mode. Most arguments are pass-through - to setuptools. - """ - logger.info('Running setup.py develop for %s', name) - - args = make_setuptools_develop_args( - setup_py_path, - global_options=global_options, - install_options=install_options, - no_user_config=isolated, - prefix=prefix, - home=home, - use_user_site=use_user_site, - ) - - with indent_log(): - with build_env: - call_subprocess( - args, - cwd=unpacked_source_directory, - ) diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py b/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py deleted file mode 100644 index 41d0c1f..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py +++ /dev/null @@ -1,125 +0,0 @@ -"""Legacy installation process, i.e. `setup.py install`. -""" - -import logging -import os -import sys -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 -from pip._internal.models.scheme import Scheme -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ensure_dir -from pip._internal.utils.setuptools_build import make_setuptools_install_args -from pip._internal.utils.subprocess import runner_with_spinner_message -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -class LegacyInstallFailure(Exception): - def __init__(self): - # type: () -> None - self.parent = sys.exc_info() - - -def install( - install_options, # type: List[str] - global_options, # type: Sequence[str] - root, # type: Optional[str] - home, # type: Optional[str] - prefix, # type: Optional[str] - use_user_site, # type: bool - pycompile, # type: bool - scheme, # type: Scheme - setup_py_path, # type: str - isolated, # type: bool - req_name, # type: str - build_env, # type: BuildEnvironment - unpacked_source_directory, # type: str - req_description, # type: str -): - # type: (...) -> bool - - header_dir = scheme.headers - - with TempDirectory(kind="record") as temp_dir: - try: - record_filename = os.path.join(temp_dir.path, 'install-record.txt') - install_args = make_setuptools_install_args( - setup_py_path, - global_options=global_options, - install_options=install_options, - record_filename=record_filename, - root=root, - prefix=prefix, - header_dir=header_dir, - home=home, - use_user_site=use_user_site, - no_user_config=isolated, - pycompile=pycompile, - ) - - runner = runner_with_spinner_message( - f"Running setup.py install for {req_name}" - ) - with indent_log(), build_env: - runner( - cmd=install_args, - cwd=unpacked_source_directory, - ) - - if not os.path.exists(record_filename): - logger.debug('Record file %s not found', record_filename) - # Signal to the caller that we didn't install the new package - return False - - except Exception: - # Signal to the caller that we didn't install the new package - raise LegacyInstallFailure - - # At this point, we have successfully installed the requirement. - - # We intentionally do not use any encoding to read the file because - # setuptools writes the file using distutils.file_util.write_file, - # which does not specify an encoding. - with open(record_filename) as f: - record_lines = f.read().splitlines() - - def prepend_root(path): - # type: (str) -> str - if root is None or not os.path.isabs(path): - return path - else: - return change_root(root, path) - - for line in record_lines: - directory = os.path.dirname(line) - if directory.endswith('.egg-info'): - egg_info_dir = prepend_root(directory) - break - else: - message = ( - "{} did not indicate that it installed an " - ".egg-info directory. Only setup.py projects " - "generating .egg-info directories are supported." - ).format(req_description) - raise InstallationError(message) - - new_lines = [] - for line in record_lines: - filename = line.strip() - if os.path.isdir(filename): - filename += os.path.sep - new_lines.append( - os.path.relpath(prepend_root(filename), egg_info_dir) - ) - new_lines.sort() - ensure_dir(egg_info_dir) - inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') - with open(inst_files_path, 'w') as f: - f.write('\n'.join(new_lines) + '\n') - - return True diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py b/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py deleted file mode 100644 index 10e5b15..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +++ /dev/null @@ -1,819 +0,0 @@ -"""Support for installing and building the "wheel" binary package format. -""" - -import collections -import compileall -import contextlib -import csv -import importlib -import logging -import os.path -import re -import shutil -import sys -import warnings -from base64 import urlsafe_b64encode -from email.message import Message -from itertools import chain, filterfalse, starmap -from typing import ( - IO, - TYPE_CHECKING, - Any, - BinaryIO, - Callable, - Dict, - Iterable, - Iterator, - List, - NewType, - Optional, - Sequence, - Set, - Tuple, - Union, - cast, -) -from zipfile import ZipFile, ZipInfo - -from pip._vendor import pkg_resources -from pip._vendor.distlib.scripts import ScriptMaker -from pip._vendor.distlib.util import get_export_entry -from pip._vendor.pkg_resources import Distribution -from pip._vendor.six import ensure_str, ensure_text, reraise - -from pip._internal.exceptions import InstallationError -from pip._internal.locations import get_major_minor_version -from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl -from pip._internal.models.scheme import SCHEME_KEYS, Scheme -from pip._internal.utils.filesystem import adjacent_tmp_file, replace -from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file, partition -from pip._internal.utils.unpacking import ( - current_umask, - is_within_directory, - set_extracted_file_to_default_mode_plus_executable, - zip_item_is_executable, -) -from pip._internal.utils.wheel import parse_wheel, pkg_resources_distribution_for_wheel - -if TYPE_CHECKING: - from typing import Protocol - - class File(Protocol): - src_record_path = None # type: RecordPath - dest_path = None # type: str - changed = None # type: bool - - def save(self): - # type: () -> None - pass - - -logger = logging.getLogger(__name__) - -RecordPath = NewType('RecordPath', str) -InstalledCSVRow = Tuple[RecordPath, str, Union[int, str]] - - -def rehash(path, blocksize=1 << 20): - # type: (str, int) -> Tuple[str, str] - """Return (encoded_digest, length) for path using hashlib.sha256()""" - h, length = hash_file(path, blocksize) - digest = 'sha256=' + urlsafe_b64encode( - h.digest() - ).decode('latin1').rstrip('=') - return (digest, str(length)) - - -def csv_io_kwargs(mode): - # type: (str) -> Dict[str, Any] - """Return keyword arguments to properly open a CSV file - in the given mode. - """ - return {'mode': mode, 'newline': '', 'encoding': 'utf-8'} - - -def fix_script(path): - # type: (str) -> bool - """Replace #!python with #!/path/to/python - Return True if file was changed. - """ - # XXX RECORD hashes will need to be updated - assert os.path.isfile(path) - - with open(path, 'rb') as script: - firstline = script.readline() - if not firstline.startswith(b'#!python'): - return False - exename = sys.executable.encode(sys.getfilesystemencoding()) - firstline = b'#!' + exename + os.linesep.encode("ascii") - rest = script.read() - with open(path, 'wb') as script: - script.write(firstline) - script.write(rest) - return True - - -def wheel_root_is_purelib(metadata): - # type: (Message) -> bool - return metadata.get("Root-Is-Purelib", "").lower() == "true" - - -def get_entrypoints(distribution): - # type: (Distribution) -> Tuple[Dict[str, str], Dict[str, str]] - # get the entry points and then the script names - try: - console = distribution.get_entry_map('console_scripts') - gui = distribution.get_entry_map('gui_scripts') - except KeyError: - # Our dict-based Distribution raises KeyError if entry_points.txt - # doesn't exist. - return {}, {} - - def _split_ep(s): - # type: (pkg_resources.EntryPoint) -> Tuple[str, str] - """get the string representation of EntryPoint, - remove space and split on '=' - """ - split_parts = str(s).replace(" ", "").split("=") - return split_parts[0], split_parts[1] - - # convert the EntryPoint objects into strings with module:function - console = dict(_split_ep(v) for v in console.values()) - gui = dict(_split_ep(v) for v in gui.values()) - return console, gui - - -def message_about_scripts_not_on_PATH(scripts): - # type: (Sequence[str]) -> Optional[str] - """Determine if any scripts are not on PATH and format a warning. - Returns a warning message if one or more scripts are not on PATH, - otherwise None. - """ - if not scripts: - return None - - # Group scripts by the path they were installed in - grouped_by_dir = collections.defaultdict(set) # type: Dict[str, Set[str]] - for destfile in scripts: - parent_dir = os.path.dirname(destfile) - script_name = os.path.basename(destfile) - grouped_by_dir[parent_dir].add(script_name) - - # We don't want to warn for directories that are on PATH. - not_warn_dirs = [ - os.path.normcase(i).rstrip(os.sep) for i in - os.environ.get("PATH", "").split(os.pathsep) - ] - # If an executable sits with sys.executable, we don't warn for it. - # This covers the case of venv invocations without activating the venv. - not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) - warn_for = { - parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() - if os.path.normcase(parent_dir) not in not_warn_dirs - } # type: Dict[str, Set[str]] - if not warn_for: - return None - - # Format a message - msg_lines = [] - for parent_dir, dir_scripts in warn_for.items(): - sorted_scripts = sorted(dir_scripts) # type: List[str] - if len(sorted_scripts) == 1: - start_text = "script {} is".format(sorted_scripts[0]) - else: - start_text = "scripts {} are".format( - ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] - ) - - msg_lines.append( - "The {} installed in '{}' which is not on PATH." - .format(start_text, parent_dir) - ) - - last_line_fmt = ( - "Consider adding {} to PATH or, if you prefer " - "to suppress this warning, use --no-warn-script-location." - ) - if len(msg_lines) == 1: - msg_lines.append(last_line_fmt.format("this directory")) - else: - msg_lines.append(last_line_fmt.format("these directories")) - - # Add a note if any directory starts with ~ - warn_for_tilde = any( - i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i - ) - if warn_for_tilde: - tilde_warning_msg = ( - "NOTE: The current PATH contains path(s) starting with `~`, " - "which may not be expanded by all applications." - ) - msg_lines.append(tilde_warning_msg) - - # Returns the formatted multiline message - return "\n".join(msg_lines) - - -def _normalized_outrows(outrows): - # type: (Iterable[InstalledCSVRow]) -> List[Tuple[str, str, str]] - """Normalize the given rows of a RECORD file. - - Items in each row are converted into str. Rows are then sorted to make - the value more predictable for tests. - - Each row is a 3-tuple (path, hash, size) and corresponds to a record of - a RECORD file (see PEP 376 and PEP 427 for details). For the rows - passed to this function, the size can be an integer as an int or string, - or the empty string. - """ - # Normally, there should only be one row per path, in which case the - # second and third elements don't come into play when sorting. - # However, in cases in the wild where a path might happen to occur twice, - # we don't want the sort operation to trigger an error (but still want - # determinism). Since the third element can be an int or string, we - # coerce each element to a string to avoid a TypeError in this case. - # For additional background, see-- - # https://github.com/pypa/pip/issues/5868 - return sorted( - (ensure_str(record_path, encoding='utf-8'), hash_, str(size)) - for record_path, hash_, size in outrows - ) - - -def _record_to_fs_path(record_path): - # type: (RecordPath) -> str - return record_path - - -def _fs_to_record_path(path, relative_to=None): - # type: (str, Optional[str]) -> 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) - path = path.replace(os.path.sep, '/') - return cast('RecordPath', path) - - -def _parse_record_path(record_column): - # type: (str) -> RecordPath - p = ensure_text(record_column, encoding='utf-8') - return cast('RecordPath', p) - - -def get_csv_rows_for_installed( - old_csv_rows, # type: List[List[str]] - installed, # type: Dict[RecordPath, RecordPath] - changed, # type: Set[RecordPath] - generated, # type: List[str] - lib_dir, # type: str -): - # type: (...) -> List[InstalledCSVRow] - """ - :param installed: A map from archive RECORD path to installation RECORD - path. - """ - installed_rows = [] # type: List[InstalledCSVRow] - for row in old_csv_rows: - if len(row) > 3: - logger.warning('RECORD line has more than three elements: %s', row) - old_record_path = _parse_record_path(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)) - else: - digest = row[1] if len(row) > 1 else '' - length = row[2] if len(row) > 2 else '' - installed_rows.append((new_record_path, digest, length)) - for f in generated: - path = _fs_to_record_path(f, lib_dir) - digest, length = rehash(f) - installed_rows.append((path, digest, length)) - for installed_record_path in installed.values(): - installed_rows.append((installed_record_path, '', '')) - return installed_rows - - -def get_console_script_specs(console): - # type: (Dict[str, str]) -> List[str] - """ - Given the mapping from entrypoint name to callable, return the relevant - console script specs. - """ - # Don't mutate caller's version - console = console.copy() - - scripts_to_generate = [] - - # Special case pip and setuptools to generate versioned wrappers - # - # The issue is that some projects (specifically, pip and setuptools) use - # code in setup.py to create "versioned" entry points - pip2.7 on Python - # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into - # the wheel metadata at build time, and so if the wheel is installed with - # a *different* version of Python the entry points will be wrong. The - # correct fix for this is to enhance the metadata to be able to describe - # such versioned entry points, but that won't happen till Metadata 2.0 is - # available. - # In the meantime, projects using versioned entry points will either have - # incorrect versioned entry points, or they will not be able to distribute - # "universal" wheels (i.e., they will need a wheel per Python version). - # - # Because setuptools and pip are bundled with _ensurepip and virtualenv, - # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we - # override the versioned entry points in the wheel and generate the - # correct ones. This code is purely a short-term measure until Metadata 2.0 - # is available. - # - # To add the level of hack in this section of code, in order to support - # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment - # variable which will control which version scripts get installed. - # - # ENSUREPIP_OPTIONS=altinstall - # - Only pipX.Y and easy_install-X.Y will be generated and installed - # ENSUREPIP_OPTIONS=install - # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note - # that this option is technically if ENSUREPIP_OPTIONS is set and is - # not altinstall - # DEFAULT - # - The default behavior is to install pip, pipX, pipX.Y, easy_install - # and easy_install-X.Y. - pip_script = console.pop('pip', None) - if pip_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - scripts_to_generate.append('pip = ' + pip_script) - - if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": - scripts_to_generate.append( - 'pip{} = {}'.format(sys.version_info[0], pip_script) - ) - - scripts_to_generate.append( - f'pip{get_major_minor_version()} = {pip_script}' - ) - # Delete any other versioned pip entry points - pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] - for k in pip_ep: - del console[k] - easy_install_script = console.pop('easy_install', None) - if easy_install_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - scripts_to_generate.append( - 'easy_install = ' + easy_install_script - ) - - scripts_to_generate.append( - 'easy_install-{} = {}'.format( - get_major_minor_version(), easy_install_script - ) - ) - # Delete any other versioned easy_install entry points - easy_install_ep = [ - k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) - ] - for k in easy_install_ep: - del console[k] - - # Generate the console entry points specified in the wheel - scripts_to_generate.extend(starmap('{} = {}'.format, console.items())) - - return scripts_to_generate - - -class ZipBackedFile: - def __init__(self, src_record_path, dest_path, zip_file): - # type: (RecordPath, str, ZipFile) -> None - self.src_record_path = src_record_path - self.dest_path = dest_path - self._zip_file = zip_file - self.changed = False - - def _getinfo(self): - # type: () -> ZipInfo - return self._zip_file.getinfo(self.src_record_path) - - def save(self): - # type: () -> None - # directory creation is lazy and after file filtering - # to ensure we don't install empty dirs; empty dirs can't be - # uninstalled. - parent_dir = os.path.dirname(self.dest_path) - ensure_dir(parent_dir) - - # When we open the output file below, any existing file is truncated - # before we start writing the new contents. This is fine in most - # cases, but can cause a segfault if pip has loaded a shared - # object (e.g. from pyopenssl through its vendored urllib3) - # Since the shared object is mmap'd an attempt to call a - # symbol in it will then cause a segfault. Unlinking the file - # allows writing of new contents while allowing the process to - # continue to use the old copy. - if os.path.exists(self.dest_path): - os.unlink(self.dest_path) - - zipinfo = self._getinfo() - - with self._zip_file.open(zipinfo) as f: - with open(self.dest_path, "wb") as dest: - shutil.copyfileobj(f, dest) - - if zip_item_is_executable(zipinfo): - set_extracted_file_to_default_mode_plus_executable(self.dest_path) - - -class ScriptFile: - def __init__(self, file): - # type: (File) -> None - self._file = file - self.src_record_path = self._file.src_record_path - self.dest_path = self._file.dest_path - self.changed = False - - def save(self): - # type: () -> None - self._file.save() - self.changed = fix_script(self.dest_path) - - -class MissingCallableSuffix(InstallationError): - def __init__(self, entry_point): - # type: (str) -> None - super().__init__( - "Invalid script entry point: {} - A callable " - "suffix is required. Cf https://packaging.python.org/" - "specifications/entry-points/#use-for-scripts for more " - "information.".format(entry_point) - ) - - -def _raise_for_invalid_entrypoint(specification): - # type: (str) -> None - entry = get_export_entry(specification) - if entry is not None and entry.suffix is None: - raise MissingCallableSuffix(str(entry)) - - -class PipScriptMaker(ScriptMaker): - def make(self, specification, options=None): - # type: (str, Dict[str, Any]) -> List[str] - _raise_for_invalid_entrypoint(specification) - return super().make(specification, options) - - -def _install_wheel( - name, # type: str - wheel_zip, # type: ZipFile - wheel_path, # type: str - scheme, # type: Scheme - pycompile=True, # type: bool - warn_script_location=True, # type: bool - direct_url=None, # type: Optional[DirectUrl] - requested=False, # type: bool -): - # type: (...) -> None - """Install a wheel. - - :param name: Name of the project to install - :param wheel_zip: open ZipFile for wheel being installed - :param scheme: Distutils scheme dictating the install directories - :param req_description: String used in place of the requirement, for - logging - :param pycompile: Whether to byte-compile installed Python files - :param warn_script_location: Whether to check that scripts are installed - into a directory on PATH - :raises UnsupportedWheel: - * when the directory holds an unpacked wheel with incompatible - Wheel-Version - * when the .dist-info dir does not match the wheel - """ - info_dir, metadata = parse_wheel(wheel_zip, name) - - if wheel_root_is_purelib(metadata): - lib_dir = scheme.purelib - else: - lib_dir = scheme.platlib - - # Record details of the files moved - # installed = files copied from the wheel to the destination - # changed = files changed while installing (scripts #! line typically) - # generated = files newly generated during the install (script wrappers) - installed = {} # type: Dict[RecordPath, RecordPath] - changed = set() # type: Set[RecordPath] - generated = [] # type: List[str] - - def record_installed(srcfile, destfile, modified=False): - # type: (RecordPath, str, bool) -> None - """Map archive RECORD paths to installation RECORD paths.""" - newpath = _fs_to_record_path(destfile, lib_dir) - installed[srcfile] = newpath - if modified: - changed.add(_fs_to_record_path(destfile)) - - def all_paths(): - # type: () -> Iterable[RecordPath] - names = wheel_zip.namelist() - # If a flag is set, names may be unicode in Python 2. We convert to - # text explicitly so these are valid for lookup in RECORD. - decoded_names = map(ensure_text, names) - for name in decoded_names: - yield cast("RecordPath", name) - - def is_dir_path(path): - # type: (RecordPath) -> bool - return path.endswith("/") - - def assert_no_path_traversal(dest_dir_path, target_path): - # type: (str, str) -> None - if not is_within_directory(dest_dir_path, target_path): - message = ( - "The wheel {!r} has a file {!r} trying to install" - " outside the target directory {!r}" - ) - raise InstallationError( - message.format(wheel_path, target_path, dest_dir_path) - ) - - def root_scheme_file_maker(zip_file, dest): - # type: (ZipFile, str) -> Callable[[RecordPath], File] - def make_root_scheme_file(record_path): - # type: (RecordPath) -> File - normed_path = os.path.normpath(record_path) - dest_path = os.path.join(dest, normed_path) - assert_no_path_traversal(dest, dest_path) - return ZipBackedFile(record_path, dest_path, zip_file) - - return make_root_scheme_file - - def data_scheme_file_maker(zip_file, scheme): - # type: (ZipFile, Scheme) -> Callable[[RecordPath], File] - scheme_paths = {} - for key in SCHEME_KEYS: - encoded_key = ensure_text(key) - scheme_paths[encoded_key] = ensure_text( - getattr(scheme, key), encoding=sys.getfilesystemencoding() - ) - - def make_data_scheme_file(record_path): - # type: (RecordPath) -> File - normed_path = os.path.normpath(record_path) - try: - _, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2) - except ValueError: - message = ( - "Unexpected file in {}: {!r}. .data directory contents" - " should be named like: '/'." - ).format(wheel_path, record_path) - raise InstallationError(message) - - try: - scheme_path = scheme_paths[scheme_key] - except KeyError: - valid_scheme_keys = ", ".join(sorted(scheme_paths)) - message = ( - "Unknown scheme key used in {}: {} (for file {!r}). .data" - " directory contents should be in subdirectories named" - " with a valid scheme key ({})" - ).format( - wheel_path, scheme_key, record_path, valid_scheme_keys - ) - raise InstallationError(message) - - dest_path = os.path.join(scheme_path, dest_subpath) - assert_no_path_traversal(scheme_path, dest_path) - return ZipBackedFile(record_path, dest_path, zip_file) - - return make_data_scheme_file - - def is_data_scheme_path(path): - # type: (RecordPath) -> bool - return path.split("/", 1)[0].endswith(".data") - - paths = all_paths() - file_paths = filterfalse(is_dir_path, paths) - root_scheme_paths, data_scheme_paths = partition( - is_data_scheme_path, file_paths - ) - - make_root_scheme_file = root_scheme_file_maker( - wheel_zip, - ensure_text(lib_dir, encoding=sys.getfilesystemencoding()), - ) - files = map(make_root_scheme_file, root_scheme_paths) - - def is_script_scheme_path(path): - # type: (RecordPath) -> bool - parts = path.split("/", 2) - return ( - len(parts) > 2 and - parts[0].endswith(".data") and - parts[1] == "scripts" - ) - - other_scheme_paths, script_scheme_paths = partition( - is_script_scheme_path, data_scheme_paths - ) - - make_data_scheme_file = data_scheme_file_maker(wheel_zip, scheme) - other_scheme_files = map(make_data_scheme_file, other_scheme_paths) - files = chain(files, other_scheme_files) - - # Get the defined entry points - distribution = pkg_resources_distribution_for_wheel( - wheel_zip, name, wheel_path - ) - console, gui = get_entrypoints(distribution) - - def is_entrypoint_wrapper(file): - # type: (File) -> bool - # EP, EP.exe and EP-script.py are scripts generated for - # entry point EP by setuptools - path = file.dest_path - name = os.path.basename(path) - if name.lower().endswith('.exe'): - matchname = name[:-4] - elif name.lower().endswith('-script.py'): - matchname = name[:-10] - elif name.lower().endswith(".pya"): - matchname = name[:-4] - else: - matchname = name - # Ignore setuptools-generated scripts - return (matchname in console or matchname in gui) - - script_scheme_files = map(make_data_scheme_file, script_scheme_paths) - script_scheme_files = filterfalse( - is_entrypoint_wrapper, script_scheme_files - ) - script_scheme_files = map(ScriptFile, script_scheme_files) - files = chain(files, script_scheme_files) - - for file in files: - file.save() - record_installed(file.src_record_path, file.dest_path, file.changed) - - def pyc_source_file_paths(): - # type: () -> Iterator[str] - # 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 - # issues related to permissions on existing files. - for installed_path in sorted(set(installed.values())): - full_installed_path = os.path.join(lib_dir, installed_path) - if not os.path.isfile(full_installed_path): - continue - if not full_installed_path.endswith('.py'): - continue - yield full_installed_path - - def pyc_output_path(path): - # type: (str) -> str - """Return the path the pyc file would have been written to. - """ - return importlib.util.cache_from_source(path) - - # Compile all of the pyc files for the installed files - if pycompile: - with captured_stdout() as stdout: - with warnings.catch_warnings(): - warnings.filterwarnings('ignore') - for path in pyc_source_file_paths(): - # Python 2's `compileall.compile_file` requires a str in - # error cases, so we must convert to the native type. - path_arg = ensure_str( - path, encoding=sys.getfilesystemencoding() - ) - success = compileall.compile_file( - path_arg, force=True, quiet=True - ) - if success: - pyc_path = pyc_output_path(path) - assert os.path.exists(pyc_path) - pyc_record_path = cast( - "RecordPath", pyc_path.replace(os.path.sep, "/") - ) - record_installed(pyc_record_path, pyc_path) - logger.debug(stdout.getvalue()) - - maker = PipScriptMaker(None, scheme.scripts) - - # Ensure old scripts are overwritten. - # See https://github.com/pypa/pip/issues/1800 - maker.clobber = True - - # Ensure we don't generate any variants for scripts because this is almost - # never what somebody wants. - # See https://bitbucket.org/pypa/distlib/issue/35/ - maker.variants = {''} - - # This is required because otherwise distlib creates scripts that are not - # executable. - # See https://bitbucket.org/pypa/distlib/issue/32/ - maker.set_mode = True - - # Generate the console and GUI entry points specified in the wheel - scripts_to_generate = get_console_script_specs(console) - - gui_scripts_to_generate = list(starmap('{} = {}'.format, gui.items())) - - generated_console_scripts = maker.make_multiple(scripts_to_generate) - generated.extend(generated_console_scripts) - - generated.extend( - maker.make_multiple(gui_scripts_to_generate, {'gui': True}) - ) - - if warn_script_location: - msg = message_about_scripts_not_on_PATH(generated_console_scripts) - if msg is not None: - logger.warning(msg) - - generated_file_mode = 0o666 & ~current_umask() - - @contextlib.contextmanager - def _generate_file(path, **kwargs): - # type: (str, **Any) -> Iterator[BinaryIO] - with adjacent_tmp_file(path, **kwargs) as f: - yield f - os.chmod(f.name, generated_file_mode) - replace(f.name, path) - - dest_info_dir = os.path.join(lib_dir, info_dir) - - # Record pip as the installer - installer_path = os.path.join(dest_info_dir, 'INSTALLER') - with _generate_file(installer_path) as installer_file: - installer_file.write(b'pip\n') - generated.append(installer_path) - - # Record the PEP 610 direct URL reference - if direct_url is not None: - direct_url_path = os.path.join(dest_info_dir, DIRECT_URL_METADATA_NAME) - with _generate_file(direct_url_path) as direct_url_file: - direct_url_file.write(direct_url.to_json().encode("utf-8")) - generated.append(direct_url_path) - - # Record the REQUESTED file - if requested: - requested_path = os.path.join(dest_info_dir, 'REQUESTED') - with open(requested_path, "wb"): - pass - generated.append(requested_path) - - record_text = distribution.get_metadata('RECORD') - record_rows = list(csv.reader(record_text.splitlines())) - - rows = get_csv_rows_for_installed( - record_rows, - installed=installed, - changed=changed, - generated=generated, - lib_dir=lib_dir) - - # Record details of all files installed - record_path = os.path.join(dest_info_dir, 'RECORD') - - with _generate_file(record_path, **csv_io_kwargs('w')) as record_file: - # The type mypy infers for record_file is different for Python 3 - # (typing.IO[Any]) and Python 2 (typing.BinaryIO). We explicitly - # cast to typing.IO[str] as a workaround. - writer = csv.writer(cast('IO[str]', record_file)) - writer.writerows(_normalized_outrows(rows)) - - -@contextlib.contextmanager -def req_error_context(req_description): - # type: (str) -> Iterator[None] - try: - yield - except InstallationError as e: - message = "For req: {}. {}".format(req_description, e.args[0]) - reraise( - InstallationError, InstallationError(message), sys.exc_info()[2] - ) - - -def install_wheel( - name, # type: str - wheel_path, # type: str - scheme, # type: Scheme - req_description, # type: str - pycompile=True, # type: bool - warn_script_location=True, # type: bool - direct_url=None, # type: Optional[DirectUrl] - requested=False, # type: bool -): - # type: (...) -> None - with ZipFile(wheel_path, allowZip64=True) as z: - with req_error_context(req_description): - _install_wheel( - name=name, - wheel_zip=z, - wheel_path=wheel_path, - scheme=scheme, - pycompile=pycompile, - warn_script_location=warn_script_location, - direct_url=direct_url, - requested=requested, - ) diff --git a/venv/Lib/site-packages/pip/_internal/operations/prepare.py b/venv/Lib/site-packages/pip/_internal/operations/prepare.py deleted file mode 100644 index 3d074f9..0000000 --- a/venv/Lib/site-packages/pip/_internal/operations/prepare.py +++ /dev/null @@ -1,655 +0,0 @@ -"""Prepares a distribution for installation -""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import logging -import mimetypes -import os -import shutil -from typing import Dict, Iterable, List, Optional, Tuple - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import Distribution - -from pip._internal.distributions import make_distribution_for_install_requirement -from pip._internal.distributions.installed import InstalledDistribution -from pip._internal.exceptions import ( - DirectoryUrlHashUnsupported, - HashMismatch, - HashUnpinned, - InstallationError, - NetworkConnectionError, - PreviousBuildDirError, - VcsHashUnsupported, -) -from pip._internal.index.package_finder import PackageFinder -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.network.download import BatchDownloader, Downloader -from pip._internal.network.lazy_wheel import ( - HTTPRangeRequestUnsupported, - dist_from_wheel_url, -) -from pip._internal.network.session import PipSession -from pip._internal.req.req_install import InstallRequirement -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.filesystem import copy2_fixed -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, rmtree -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.unpacking import unpack_file -from pip._internal.vcs import vcs - -logger = logging.getLogger(__name__) - - -def _get_prepared_distribution( - req, # type: InstallRequirement - req_tracker, # type: RequirementTracker - finder, # type: PackageFinder - build_isolation, # type: bool -): - # type: (...) -> Distribution - """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) - return abstract_dist.get_pkg_resources_distribution() - - -def unpack_vcs_link(link, location): - # type: (Link, str) -> None - vcs_backend = vcs.get_backend_for_scheme(link.scheme) - assert vcs_backend is not None - vcs_backend.unpack(location, url=hide_url(link.url)) - - -class File: - - def __init__(self, path, content_type): - # type: (str, Optional[str]) -> None - self.path = path - if content_type is None: - self.content_type = mimetypes.guess_type(path)[0] - else: - self.content_type = content_type - - -def get_http_url( - link, # type: Link - download, # type: Downloader - download_dir=None, # type: Optional[str] - hashes=None, # type: Optional[Hashes] -): - # type: (...) -> File - temp_dir = TempDirectory(kind="unpack", globally_managed=True) - # If a download dir is specified, is the file already downloaded there? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir( - link, download_dir, hashes - ) - - if already_downloaded_path: - from_path = already_downloaded_path - content_type = None - else: - # let's download to a tmp dir - from_path, content_type = download(link, temp_dir.path) - if hashes: - hashes.check_against_path(from_path) - - return File(from_path, content_type) - - -def _copy2_ignoring_special_files(src, dest): - # type: (str, 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, target): - # type: (str, 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, names): - # type: (str, List[str]) -> List[str] - skipped = [] # type: 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, # type: Link - download_dir=None, # type: Optional[str] - hashes=None # type: Optional[Hashes] -): - # type: (...) -> File - """Get file and optionally check its hash. - """ - # If a download dir is specified, is the file already there and valid? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir( - link, download_dir, hashes - ) - - if already_downloaded_path: - from_path = already_downloaded_path - else: - from_path = link.file_path - - # If --require-hashes is off, `hashes` is either empty, the - # link's embedded hash, or MissingHashes; it is required to - # match. If --require-hashes is on, we are satisfied by any - # hash in `hashes` matching: a URL-based or an option-based - # one; no internet-sourced hash will be in `hashes`. - if hashes: - hashes.check_against_path(from_path) - return File(from_path, None) - - -def unpack_url( - link, # type: Link - location, # type: str - download, # type: Downloader - download_dir=None, # type: Optional[str] - hashes=None, # type: Optional[Hashes] -): - # type: (...) -> Optional[File] - """Unpack link into location, downloading if required. - - :param hashes: A Hashes object, one of whose embedded hashes must match, - or HashMismatch will be raised. If the Hashes is empty, no matches are - required, and unhashable types of requirements (like VCS ones, which - would ordinarily raise HashUnsupported) are allowed. - """ - # non-editable vcs urls - if link.is_vcs: - unpack_vcs_link(link, location) - 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. - if link.is_existing_dir(): - deprecated( - "A future pip version will change local packages to be built " - "in-place without first copying to a temporary directory. " - "We recommend you use --use-feature=in-tree-build to test " - "your packages with this new behavior before it becomes the " - "default.\n", - replacement=None, - gone_in="21.3", - issue=7555 - ) - if os.path.isdir(location): - rmtree(location) - _copy_source_tree(link.file_path, location) - return None - - # file urls - if link.is_file: - file = get_file_url(link, download_dir, hashes=hashes) - - # http urls - else: - file = get_http_url( - link, - download, - download_dir, - hashes=hashes, - ) - - # unpack the archive to the build dir location. even when only downloading - # archives, they have to be unpacked to parse dependencies, except wheels - if not link.is_wheel: - unpack_file(file.path, location, file.content_type) - - return file - - -def _check_download_dir(link, download_dir, hashes): - # type: (Link, str, Optional[Hashes]) -> Optional[str] - """ Check download_dir for previously downloaded file with correct hash - If a correct file is found return its path else None - """ - download_path = os.path.join(download_dir, link.filename) - - if not os.path.exists(download_path): - return None - - # If already downloaded, does its hash match? - logger.info('File was already downloaded %s', download_path) - if hashes: - try: - hashes.check_against_path(download_path) - except HashMismatch: - logger.warning( - 'Previously-downloaded file %s has bad hash. ' - 'Re-downloading.', - download_path - ) - os.unlink(download_path) - return None - return download_path - - -class RequirementPreparer: - """Prepares a Requirement - """ - - def __init__( - self, - build_dir, # type: str - download_dir, # type: Optional[str] - src_dir, # type: str - build_isolation, # type: bool - req_tracker, # type: RequirementTracker - session, # type: PipSession - progress_bar, # type: str - finder, # type: PackageFinder - require_hashes, # type: bool - use_user_site, # type: bool - lazy_wheel, # type: bool - in_tree_build, # type: bool - ): - # type: (...) -> None - super().__init__() - - self.src_dir = src_dir - self.build_dir = build_dir - self.req_tracker = req_tracker - self._session = session - self._download = Downloader(session, progress_bar) - self._batch_download = BatchDownloader(session, progress_bar) - self.finder = finder - - # Where still-packed archives should be written to. If None, they are - # not saved, and are deleted immediately after unpacking. - self.download_dir = download_dir - - # Is build isolation allowed? - self.build_isolation = build_isolation - - # Should hash-checking be required? - self.require_hashes = require_hashes - - # Should install in user site-packages? - self.use_user_site = use_user_site - - # Should wheels be downloaded lazily? - self.use_lazy_wheel = lazy_wheel - - # Should in-tree builds be used for local paths? - self.in_tree_build = in_tree_build - - # Memoized downloaded files, as mapping of url: (path, mime type) - self._downloaded = {} # type: Dict[str, Tuple[str, str]] - - # Previous "header" printed for a link-based InstallRequirement - self._previous_requirement_header = ("", "") - - def _log_preparing_link(self, req): - # type: (InstallRequirement) -> None - """Provide context for the requirement being prepared.""" - if req.link.is_file and not req.original_link_is_in_wheel_cache: - message = "Processing %s" - information = str(display_path(req.link.file_path)) - else: - message = "Collecting %s" - information = str(req.req or req) - - if (message, information) != self._previous_requirement_header: - self._previous_requirement_header = (message, information) - logger.info(message, information) - - if req.original_link_is_in_wheel_cache: - with indent_log(): - logger.info("Using cached %s", req.link.filename) - - def _ensure_link_req_src_dir(self, req, parallel_builds): - # type: (InstallRequirement, bool) -> None - """Ensure source_dir of a linked InstallRequirement.""" - # Since source_dir is only set for editable requirements. - if req.link.is_wheel: - # We don't need to unpack wheels, so no need for a source - # directory. - return - assert req.source_dir is None - if req.link.is_existing_dir() and self.in_tree_build: - # build local directories in-tree - req.source_dir = req.link.file_path - return - - # We always delete unpacked sdists after pip runs. - req.ensure_has_source_dir( - self.build_dir, - autodelete=True, - parallel_builds=parallel_builds, - ) - - # If a checkout exists, it's unwise to keep going. version - # inconsistencies are logged later, but do not fail the - # installation. - # FIXME: this won't upgrade when there's an existing - # package unpacked in `req.source_dir` - if os.path.exists(os.path.join(req.source_dir, 'setup.py')): - raise PreviousBuildDirError( - "pip can't proceed with requirements '{}' due to a" - "pre-existing build directory ({}). This is likely " - "due to a previous installation that failed . pip is " - "being responsible and not assuming it can delete this. " - "Please delete it and try again.".format(req, req.source_dir) - ) - - def _get_linked_req_hashes(self, req): - # type: (InstallRequirement) -> Hashes - # By the time this is called, the requirement's link should have - # been checked so we can tell what kind of requirements req is - # and raise some more informative errors than otherwise. - # (For example, we can raise VcsHashUnsupported for a VCS URL - # rather than HashMissing.) - if not self.require_hashes: - return req.hashes(trust_internet=True) - - # We could check these first 2 conditions inside unpack_url - # and save repetition of conditions, but then we would - # report less-useful error messages for unhashable - # requirements, complaining that there's no hash provided. - if req.link.is_vcs: - raise VcsHashUnsupported() - if req.link.is_existing_dir(): - raise DirectoryUrlHashUnsupported() - - # Unpinned packages are asking for trouble when a new version - # is uploaded. This isn't a security check, but it saves users - # a surprising hash mismatch in the future. - # file:/// URLs aren't pinnable, so don't complain about them - # not being pinned. - if req.original_link is None and not req.is_pinned: - raise HashUnpinned() - - # If known-good hashes are missing for this requirement, - # shim it with a facade object that will provoke hash - # computation and then raise a HashMissing exception - # showing the user what the hash should be. - return req.hashes(trust_internet=False) or MissingHashes() - - def _fetch_metadata_using_lazy_wheel(self, link): - # type: (Link) -> Optional[Distribution] - """Fetch metadata using lazy wheel, if possible.""" - if not self.use_lazy_wheel: - return None - if self.require_hashes: - logger.debug('Lazy wheel is not used as hash checking is required') - return None - if link.is_file or not link.is_wheel: - logger.debug( - 'Lazy wheel is not used as ' - '%r does not points to a remote wheel', - link, - ) - return None - - wheel = Wheel(link.filename) - name = canonicalize_name(wheel.name) - logger.info( - 'Obtaining dependency information from %s %s', - name, wheel.version, - ) - url = link.url.split('#', 1)[0] - try: - return dist_from_wheel_url(name, url, self._session) - except HTTPRangeRequestUnsupported: - logger.debug('%s does not support range requests', url) - return None - - def _complete_partial_requirements( - self, - partially_downloaded_reqs, # type: Iterable[InstallRequirement] - parallel_builds=False, # type: bool - ): - # type: (...) -> None - """Download any requirements which were only fetched by metadata.""" - # Download to a temporary directory. These will be copied over as - # needed for downstream 'download', 'wheel', and 'install' commands. - temp_dir = TempDirectory(kind="unpack", globally_managed=True).path - - # Map each link to the requirement that owns it. This allows us to set - # `req.local_file_path` on the appropriate requirement after passing - # all the links at once into BatchDownloader. - links_to_fully_download = {} # type: Dict[Link, InstallRequirement] - for req in partially_downloaded_reqs: - assert req.link - links_to_fully_download[req.link] = req - - batch_download = self._batch_download( - links_to_fully_download.keys(), - temp_dir, - ) - for link, (filepath, _) in batch_download: - logger.debug("Downloading link %s to %s", link, filepath) - req = links_to_fully_download[link] - req.local_file_path = filepath - - # This step is necessary to ensure all lazy wheels are processed - # successfully by the 'download', 'wheel', and 'install' commands. - for req in partially_downloaded_reqs: - self._prepare_linked_requirement(req, parallel_builds) - - def prepare_linked_requirement(self, req, parallel_builds=False): - # type: (InstallRequirement, bool) -> Distribution - """Prepare a requirement to be obtained from req.link.""" - assert req.link - link = req.link - self._log_preparing_link(req) - with indent_log(): - # Check if the relevant file is already available - # in the download directory - file_path = None - if self.download_dir is not None and link.is_wheel: - hashes = self._get_linked_req_hashes(req) - file_path = _check_download_dir(req.link, self.download_dir, hashes) - - if file_path is not None: - # The file is already available, so mark it as downloaded - self._downloaded[req.link.url] = file_path, None - else: - # The file is not available, attempt to fetch only metadata - wheel_dist = self._fetch_metadata_using_lazy_wheel(link) - if wheel_dist is not None: - req.needs_more_preparation = True - return wheel_dist - - # None of the optimizations worked, fully prepare the requirement - return self._prepare_linked_requirement(req, parallel_builds) - - def prepare_linked_requirements_more(self, reqs, parallel_builds=False): - # type: (Iterable[InstallRequirement], bool) -> None - """Prepare linked requirements more, if needed.""" - reqs = [req for req in reqs if req.needs_more_preparation] - for req in reqs: - # Determine if any of these requirements were already downloaded. - if self.download_dir is not None and req.link.is_wheel: - hashes = self._get_linked_req_hashes(req) - file_path = _check_download_dir(req.link, self.download_dir, hashes) - if file_path is not None: - self._downloaded[req.link.url] = file_path, None - req.needs_more_preparation = False - - # Prepare requirements we found were already downloaded for some - # reason. The other downloads will be completed separately. - partially_downloaded_reqs = [] # type: List[InstallRequirement] - for req in reqs: - if req.needs_more_preparation: - partially_downloaded_reqs.append(req) - else: - self._prepare_linked_requirement(req, parallel_builds) - - # TODO: separate this part out from RequirementPreparer when the v1 - # resolver can be removed! - self._complete_partial_requirements( - partially_downloaded_reqs, parallel_builds=parallel_builds, - ) - - def _prepare_linked_requirement(self, req, parallel_builds): - # type: (InstallRequirement, bool) -> Distribution - assert req.link - link = req.link - - 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: - local_file = None - elif link.url not in self._downloaded: - try: - local_file = unpack_url( - link, req.source_dir, self._download, - self.download_dir, hashes - ) - except NetworkConnectionError as exc: - raise InstallationError( - 'Could not install requirement {} because of HTTP ' - 'error {} for URL {}'.format(req, exc, link) - ) - else: - file_path, content_type = self._downloaded[link.url] - if hashes: - hashes.check_against_path(file_path) - local_file = File(file_path, content_type) - - # For use in later processing, - # preserve the file path on the requirement. - if local_file: - req.local_file_path = local_file.path - - dist = _get_prepared_distribution( - req, self.req_tracker, self.finder, self.build_isolation, - ) - return dist - - def save_linked_requirement(self, req): - # type: (InstallRequirement) -> None - assert self.download_dir is not None - assert req.link is not None - link = req.link - if link.is_vcs or (link.is_existing_dir() and req.editable): - # Make a .zip of the source_dir we already created. - req.archive(self.download_dir) - return - - if link.is_existing_dir(): - logger.debug( - 'Not copying link to destination directory ' - 'since it is a directory: %s', link, - ) - return - if req.local_file_path is None: - # No distribution was downloaded for this requirement. - return - - download_location = os.path.join(self.download_dir, link.filename) - if not os.path.exists(download_location): - shutil.copy(req.local_file_path, download_location) - download_path = display_path(download_location) - logger.info('Saved %s', download_path) - - def prepare_editable_requirement( - self, - req, # type: InstallRequirement - ): - # type: (...) -> Distribution - """Prepare an editable requirement - """ - assert req.editable, "cannot prepare a non-editable req as editable" - - logger.info('Obtaining %s', req) - - with indent_log(): - if self.require_hashes: - raise InstallationError( - 'The editable requirement {} cannot be installed when ' - 'requiring hashes, because there is no single file to ' - 'hash.'.format(req) - ) - req.ensure_has_source_dir(self.src_dir) - req.update_editable() - - dist = _get_prepared_distribution( - req, self.req_tracker, self.finder, self.build_isolation, - ) - - req.check_if_exists(self.use_user_site) - - return dist - - def prepare_installed_requirement( - self, - req, # type: InstallRequirement - skip_reason # type: str - ): - # type: (...) -> Distribution - """Prepare an already-installed requirement - """ - assert req.satisfied_by, "req should have been satisfied but isn't" - assert skip_reason is not None, ( - "did not get skip reason skipped but req.satisfied_by " - "is set to {}".format(req.satisfied_by) - ) - logger.info( - 'Requirement %s: %s (%s)', - skip_reason, req, req.satisfied_by.version - ) - with indent_log(): - if self.require_hashes: - logger.debug( - 'Since it is already installed, we are trusting this ' - 'package without checking its hash. To ensure a ' - 'completely repeatable environment, install into an ' - 'empty virtualenv.' - ) - return InstalledDistribution(req).get_pkg_resources_distribution() diff --git a/venv/Lib/site-packages/pip/_internal/pyproject.py b/venv/Lib/site-packages/pip/_internal/pyproject.py deleted file mode 100644 index 9016d35..0000000 --- a/venv/Lib/site-packages/pip/_internal/pyproject.py +++ /dev/null @@ -1,183 +0,0 @@ -import os -from collections import namedtuple -from typing import Any, List, Optional - -from pip._vendor import toml -from pip._vendor.packaging.requirements import InvalidRequirement, Requirement - -from pip._internal.exceptions import InstallationError - - -def _is_list_of_str(obj): - # type: (Any) -> bool - return ( - isinstance(obj, list) and - all(isinstance(item, str) for item in obj) - ) - - -def make_pyproject_path(unpacked_source_directory): - # type: (str) -> str - return os.path.join(unpacked_source_directory, 'pyproject.toml') - - -BuildSystemDetails = namedtuple('BuildSystemDetails', [ - 'requires', 'backend', 'check', 'backend_path' -]) - - -def load_pyproject_toml( - use_pep517, # type: Optional[bool] - pyproject_toml, # type: str - setup_py, # type: str - req_name # type: str -): - # type: (...) -> Optional[BuildSystemDetails] - """Load the pyproject.toml file. - - Parameters: - use_pep517 - Has the user requested PEP 517 processing? None - means the user hasn't explicitly specified. - pyproject_toml - Location of the project's pyproject.toml file - setup_py - Location of the project's setup.py file - req_name - The name of the requirement we're processing (for - error reporting) - - Returns: - None if we should use the legacy code path, otherwise a tuple - ( - requirements from pyproject.toml, - name of PEP 517 backend, - requirements we should check are installed after setting - up the build environment - directory paths to import the backend from (backend-path), - relative to the project root. - ) - """ - has_pyproject = os.path.isfile(pyproject_toml) - has_setup = os.path.isfile(setup_py) - - if has_pyproject: - with open(pyproject_toml, encoding="utf-8") as f: - pp_toml = toml.load(f) - build_system = pp_toml.get("build-system") - else: - build_system = None - - # The following cases must use PEP 517 - # We check for use_pep517 being non-None and falsey because that means - # the user explicitly requested --no-use-pep517. The value 0 as - # opposed to False can occur when the value is provided via an - # environment variable or config file option (due to the quirk of - # strtobool() returning an integer in pip's configuration code). - if has_pyproject and not has_setup: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project does not have a setup.py" - ) - use_pep517 = True - elif build_system and "build-backend" in build_system: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project specifies a build backend of {} " - "in pyproject.toml".format( - build_system["build-backend"] - ) - ) - use_pep517 = True - - # 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. - elif use_pep517 is None: - use_pep517 = has_pyproject - - # At this point, we know whether we're going to use PEP 517. - assert use_pep517 is not None - - # If we're using the legacy code path, there is nothing further - # for us to do here. - if not use_pep517: - return None - - if build_system is None: - # Either the user has a pyproject.toml with no build-system - # section, or the user has no pyproject.toml, but has opted in - # explicitly via --use-pep517. - # In the absence of any explicit backend specification, we - # assume the setuptools backend that most closely emulates the - # traditional direct setup.py execution, and require wheel and - # a version of setuptools that supports that backend. - - build_system = { - "requires": ["setuptools>=40.8.0", "wheel"], - "build-backend": "setuptools.build_meta:__legacy__", - } - - # If we're using PEP 517, we have build system information (either - # from pyproject.toml, or defaulted by the code above). - # Note that at this point, we do not know if the user has actually - # specified a backend, though. - assert build_system is not None - - # Ensure that the build-system section in pyproject.toml conforms - # to PEP 518. - error_template = ( - "{package} has a pyproject.toml file that does not comply " - "with PEP 518: {reason}" - ) - - # Specifying the build-system table but not the requires key is invalid - if "requires" not in build_system: - raise InstallationError( - error_template.format(package=req_name, reason=( - "it has a 'build-system' table but not " - "'build-system.requires' which is mandatory in the table" - )) - ) - - # Error out if requires is not a list of strings - requires = build_system["requires"] - if not _is_list_of_str(requires): - raise InstallationError(error_template.format( - package=req_name, - reason="'build-system.requires' is not a list of strings.", - )) - - # Each requirement must be valid as per PEP 508 - for requirement in requires: - try: - Requirement(requirement) - except InvalidRequirement: - raise InstallationError( - error_template.format( - package=req_name, - reason=( - "'build-system.requires' contains an invalid " - "requirement: {!r}".format(requirement) - ), - ) - ) - - backend = build_system.get("build-backend") - backend_path = build_system.get("backend-path", []) - check = [] # type: List[str] - if backend is None: - # If the user didn't specify a backend, we assume they want to use - # the setuptools backend. But we can't be sure they have included - # a version of setuptools which supplies the backend, or wheel - # (which is needed by the backend) in their requirements. So we - # make a note to check that those requirements are present once - # we have set up the environment. - # This is quite a lot of work to check for a very specific case. But - # the problem is, that case is potentially quite common - projects that - # adopted PEP 518 early for the ability to specify requirements to - # execute setup.py, but never considered needing to mention the build - # tools themselves. The original PEP 518 code had a similar check (but - # implemented in a different way). - backend = "setuptools.build_meta:__legacy__" - check = ["setuptools>=40.8.0", "wheel"] - - return BuildSystemDetails(requires, backend, check, backend_path) diff --git a/venv/Lib/site-packages/pip/_internal/req/__init__.py b/venv/Lib/site-packages/pip/_internal/req/__init__.py deleted file mode 100644 index 06f0a08..0000000 --- a/venv/Lib/site-packages/pip/_internal/req/__init__.py +++ /dev/null @@ -1,98 +0,0 @@ -import collections -import logging -from typing import Iterator, List, Optional, Sequence, Tuple - -from pip._internal.utils.logging import indent_log - -from .req_file import parse_requirements -from .req_install import InstallRequirement -from .req_set import RequirementSet - -__all__ = [ - "RequirementSet", "InstallRequirement", - "parse_requirements", "install_given_reqs", -] - -logger = logging.getLogger(__name__) - - -class InstallationResult: - def __init__(self, name): - # type: (str) -> None - self.name = name - - def __repr__(self): - # type: () -> str - return f"InstallationResult(name={self.name!r})" - - -def _validate_requirements( - requirements, # type: List[InstallRequirement] -): - # type: (...) -> Iterator[Tuple[str, InstallRequirement]] - for req in requirements: - assert req.name, f"invalid to-be-installed requirement: {req}" - yield req.name, req - - -def install_given_reqs( - requirements, # type: List[InstallRequirement] - install_options, # type: List[str] - global_options, # type: Sequence[str] - root, # type: Optional[str] - home, # type: Optional[str] - prefix, # type: Optional[str] - warn_script_location, # type: bool - use_user_site, # type: bool - pycompile, # type: bool -): - # type: (...) -> List[InstallationResult] - """ - Install everything in the given list. - - (to be called after having downloaded and unpacked the packages) - """ - to_install = collections.OrderedDict(_validate_requirements(requirements)) - - if to_install: - logger.info( - 'Installing collected packages: %s', - ', '.join(to_install.keys()), - ) - - installed = [] - - with indent_log(): - for req_name, requirement in to_install.items(): - if requirement.should_reinstall: - logger.info('Attempting uninstall: %s', req_name) - with indent_log(): - uninstalled_pathset = requirement.uninstall( - auto_confirm=True - ) - else: - uninstalled_pathset = None - - try: - requirement.install( - install_options, - global_options, - root=root, - home=home, - prefix=prefix, - warn_script_location=warn_script_location, - use_user_site=use_user_site, - pycompile=pycompile, - ) - except Exception: - # if install did not succeed, rollback previous uninstall - if uninstalled_pathset and not requirement.install_succeeded: - uninstalled_pathset.rollback() - raise - else: - if uninstalled_pathset and requirement.install_succeeded: - uninstalled_pathset.commit() - - installed.append(InstallationResult(req_name)) - - return installed diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 643827f094258fa318ad80c0a05eaf773e408788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2342 zcmaJCU5^tt&~`S-X0yqCa8Oz(EEOOkl@q)oT2U2RQK3Tu1nMf)YH#h!?Xh3j&cQ`{ zec*ViM9Vuu%JrqDC2cxXGbm!vr=)ho|>#xvuY@ys~vbQ}VsNKS{p zv(^1)jQ3V^g+gi?t>0&gru3cCuaH#4QfB)Ri18K~Vk^sdl7OG4y`#6Zdx z0J9t)hy{aqTV$wIML<6^7+}|6s*?Z&!C?A~Q_jG-8n1B+{tz~BvN1CwM3?ReHB5Ab z^3#E9oL|CJXhum(62KLJG+ld5jg^I|=rLm{k!;8X;CM~s68zqUH?H)#*cM4%^b45} zWSFLLHs}{SdNa?!0o@;fY@muT5`FMyyPw4CeHCkQ5l9cifl&P-F8V>7!3{vb``~Ur z05sM?uv+XGdy1@}d6nI4bYc?OIhR(ad=cKsbl@73u=1@73l6?*k(Z3KS2ggjwl+Hc zUtJf_;m_XDoi;I(t6x@UBnWp#^?;t$PxN}rx zYJj~TtYbl?F4TvMtRgIe>A?8AFsu9f2yRo8G1aUjdvu@fw#t^g zplf3bGk;t!TjRz)*{Ayq8^W%mn|tJ^-zWjPy^kUIwa<3jyKd=jwd4<#T&-*)cg1-U zINdD=+s$*j+j&5E!-6>O)gUlGUMA}MOAsRbzJ-}tys_IEodStA)C((XrB&9;M%gTF z-h6IT@_=OLEu!5WumHcZBi{gbN4+UK}((P4BMrS4`qF9uJsz?Lll_^_7&4AcA`8jV(8V&raiF-I-fG_+mZ_@`1Lr_RjQc= z^zeazt{-O`xv{qLI5XBmv7=-YlFrmYU#k2?wV4kS4&^>E+O%f&o92vm<4Gi{XTx8b z&;m7#A|W7#zAYgz>kvY}0oJ9lHjS_-M8>P~?RDjcc;LcRFs~FT(;X!FdYA+gTw=SI zST*t#g3|~*1ZMyk2SPYAXR;97*ievF+cE9ALiLZ#oDe)HLcOVkey?sN*4}xT>MHTDC3Y}bM}Q5&oPcLyb@oiG4t1QU)roX$^&@}k2{M1+iaC1mAP|anRQ}gUp;8xpW`E=P!yb` SCz;D!2#U+>x>M^qcIzKB@@E17 diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-39.pyc deleted file mode 100644 index 758ad6138f1bc6ca664372e38f27416845c041a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11002 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 mPER{0;KB{Q|LvY}=A3!wqhSfveCXv0cHSF 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 diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-39.pyc deleted file mode 100644 index b159c5134cd07101c907e1572af936c0eb4887b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21033 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 J(SOXd{s(QV-uVCk diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc deleted file mode 100644 index 2ae59550ba9ec3e019e9fdcaeb4d82b66504f886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4024 zcmZ`+Pj4H?6`$FETvC)Q%dRb{w!^k@Q>L-t7%314Zji)Q0y~D{%1(_eSS(iDk+jru zmzo{Q7DEC-WT2Q`tF>F>=_vP8>E%TOXpWl0o zrl)HRPcMBddgnZ2|E7ANbvBQ0>-&T6Zd#>ehq0S$ERu?o2Ra#%_A9I~&ZJv6r6j&INOv3G3j3xOm8e zp9$8v6jx&ZIos#KW%E^yYvybIa~4m<_2(?E?_0q_%pbAl^nV~NTWxYZ{a8kAu^zRz zAMf=<)6>q~q^-1nPYD^RTx$Qzo=Wm8O11q+DD4oLcE8FnhwaXTB-_S&?p{`?C{5SI zPCt>ND>7x6i*D~OzT4om*QPU%o(cw}*=@AqpXe0p@DW$mJ{wsH8`(p4U>~x(>`%8_ z*2o#TgV`Y;Ity%Q51rfW3Ck88rkuU|oY8M+mGfV-%(}^jF45j*JM)82WA;a^Kf%5+ zza_)Z8+t>l&*Zm6`FpmrrQD&XynU~p#k5fB;ya^jW zVlVk>v!boM&=ryGCNj^om#=rA6742RbPMf&A@)|Jgsy8zk&qsGf}Nga0-haT%@%N@mp!K-YOvW z4NPrEkgL^8daW?Y;4a|bl46HisNhu)Y^k@W7yG?9QX<6mu$_bO8Ht@?vph$}e-|CI zJ=^0BpXC->ozL)^WpUr0>T?h8Jq*`Y{t!N1`{d3SD{F%(Xza#V zV-!={NftM`T*O@ljeA+5k|<3EB5thrlQeD^O4z9psmAr9S(nowlr!kG4G+<^v6f*g zU0r#Ws7DIM(9`f2A&*QTr-B=Stgc z^(?521vai!cJsvYGDHY*p(7YLas@JTaS%0cLI^6%sgN5r>jmuwS{*+Y>A-a#z ziZyhC5uO4|d2Bsrz*0MQ@OEN1_V9K~^b5S$;9gKEF)#4r>39a~RZ;6q#pmK#gNgO{ zJZv#1e+9;E3*FH}V+ZXHTG2pKkjrEo zSG!@UvjUd!5d=ymqL9A;YxzrbO-nn4NH^r$G(%x|LYIDs$VyZg-o||4p<|W@)eV0B zx^bT{}{ z_$gKkI+G!A2UpINbWGYdWJHRG#-x6u`Z@;40PGM^MQWBbf!L_DQxRqTUehsBXkR>Q zhl)~Cg+>5C?U||dNdcitpeA(rIXD$`5UadFk0sqHzpz1mtjD+UL3$kWjzvl3kQ2y^ zEai5*g9^OEA40oFLRWQVD=M}q8ogpGx^?RVeX%do@M!{+?W=G@Mw^r`A$Zo#W1*{C z;#r&kTU8m^4IHPPPM&0?0qpYXPKwm4J>o6m$=gmDPumMAz8_-$*dQ1A;M!RR!SS*r zK6PvII3LZJd4f{Nfy$17@}rYbi1a;Y z(s!#&-$>i@NSD?D5_g9UokME`kRH1G9I2S%t+LCD@911Qi9$bizqempGw1oLI^_EX zx?el>ZzoSBJ_og73G!11^_Y@8>r5X4%uQKT8T{^(IBrB4Pw_ye3^8}TnBXmBVh=}R^MJE*<#0&Q*dv~TiArck+bMNv?~K8;V3{NgJ#gOtpzS#`$(w!e!E z?pY4^esV0|o&mYlI(kYLlxOCBs#}Vqi@;HU0PDLTj92y(Kb`E)rN!o}! z;2PP}H}*vQHSNLjn&{@c;teL&1z{QO2FFdXB3gfV5Ras z6v8-sLgz27596?#VQ!oDUqeU9pp?EW=0aY1fo2e?At;u5phK=Fbqx z5Uw_-k+DN6ro&Lz!myji{glS_Fx=@!X}KbQ3x<;PE#Ie(0``O;qy>2uot_!jW#i&k zenBg*bY@0WLYbS#4HP8a^;prhGtWnVK?3jsCuA(2zs$9yIC%fWGI(f^bqCDmH zkYZUxzVAQNb6EhgQrYpH{9VKNk9-;bv+?pGp5WW2 zVR(jT){T<>HA|+vTO~_=?UF6OPRWtqL@9w^tDbD6N-2|l?7G`Xm(q<)DbtuLO*OKm zY-74K-N==4jhWI+W41Kg*jL&oZJqjDV}EJC-qVY`Wna1ZzpKF{foot*cooYN= zdbV-8bXwX?)z35vr9$Iu>8xq^R{!(j8A^d*f=MC?$cjTVo9oex;U&PyjcNA|&@%Gp7cFcPUZ%^Uv zOP=|LQ8@k+!hEq{M*FIj>Z)H}R;@-kXl<&hUr0yxOU>=by;7;yD@%1ha<0~@VdQ>2 z^p(8pT-Z{P^J*zj)@oMjk^P1rMu{7n?YfV#r`zi*W##K(0~BPhqPeOqZL&Gu z_kXKdYX%|bVaY2>wN$~1aw~pVUaB?AZRIc5?nc@8eKYVCx}|P@eevpRH{U=uQ)_yD zGc4CzD+M>QE5Uj+>tT{Idb4#<3;k$Xmjq~4#UiKum6dY6)?6>QE8%M7*5Zm>v!xo9 zdadK@nw0XJm4+WgN!19I?_+5PUh>u|Rm^z9Z?v!0lwSoHwxj8Z*D8@X{!1d`;JJb) zXd?-YE{;;ohUSjZvzy7#;%{iLIsHV}?wY$+&*?fVW-k#YRlS?&r@D@39x`@K(-^#2 zgEvdPH7K!lNi#QicjERq>_q2RuPDC~`uT9x&o6J*>)ZK_P3&{I=6iYWFyC6%b+x)5 z4_(@cwvO0%}?2VrOGydJ*T-rnkDMlS_d%>#03mdOl~ z$Z7?VBgf~gwQ5bZkA=xfyX`l3ryVkx1Y{cEc1-YgC4L;?~81b>yXnFuuSxu0~)WKmS zM$$E1D{1D;r0F2dA)U2yraFzfD#+vT&q9tkM!X9akc39xybp|d*H|_^)3ffmJ7&-9 z^6J}*RWum>u^XSS;t9TlBs74I)_ovp&FGqc&-|fz)p+w*&jxB*cT6?kwfbh)7G$)4 z(J+mTdCz#m_{dzu?XUw}f4ky&1t)SUY9)xQ^{vPWe7_kvfJ);dGqRSO0$ueiCX12) z#KxxoWzH^)!A_cUrfX)*&LIK`b;ZkaZG#tz`W^G6mp7ZZc&&O6CAL(h9TY5e5ksiw znDFe>1tu~@YA_Br7w|S3mTTrx>Wj!tKrw{^))PL#50MaxU88S#<}UsbegH+-vj%t7 zSW9*-&pKk@#sWM9M%V7AJOD?{OBt$WEqf2W)DlDMbC-ecvd z@p6FJ!O6K5uqQ*V&v$Bm-OGb+${iablTgvTV6$9M-h%v6CBQXrHS^bBx$@fetLL|B zz~0U9JTULO)z+Jtu>p0@ur(Z+w>HSv;=aZFHC%fi93zk3`c4lk&*gFOG8oAW>Z|!m z(_^N^5m*?I*5K}Gs#(-ie=EKUuj3Yie-tsynL<9Stdka1)Q~!r%NSF*Rhgr5@tWR5 zNxe12JMpQFy2YRT^x?yYpE_KHq%Cr_YH$an+^=}Pisr~u8h%*uDq)4(zz@_@=&p`4 zc^XON67R^DA{SI8Al#xv(5~0QLQ0)r3sXh5YHdlM$nu(kgpostYb+F06fB&dJS1T- zf$)Tb7|EEL1=7#sqG!xmGm9(0YoM;8W&%Zd!4r7+8+-#vXsnrQ)_Z1X20` zXTEO%QO~|-gvob}cg@UtA65n@2>Mq8i_AAS8%w?-VHcc{V{iIZKL{#nd%P2IRHIdl132OQ*O&7b zDi>IOfk-0VaV6-AqNWY_&B8d$}PrL-)HyZp$~I06FM9;1Hg%PW4|KOBvCRT06ayk01a+#tFy>qkqH5RX-XEO z@lIYg>s~onuMO7oDhCowO%0}obZ!K5NQ{&VbeuJFw)Imt;Q&3=b(Bs(H_c{v1Tp_R zGQxELW1<`o6EG&?g{EhF&OJih+LgM{_7d-d0t(x4yrh@9XS@dn0|fr?Ju7tHwZOq# zFAel{H2SKyHeQz22}zS-qMy8P?UFXXe9L~%=%spYH`z}S_0ik*GSWN6-mwfdtecWL zH?G?VyNRxK*a%(*n{&GfY47yY_pLComeDd5XAh^k=32IE?N~cz*LfKXu#oNi!&vUA z$jupC8wd4PBSVlDZ3En#{CQg~yv7D(SlWg7@zt#5iGdRYTG+**aO zMM~OIwUrtK3bY1`Y*vLx$`o=N27SFeq!-*r5x&3yzz^0n$(%SmUJX)}H}Ht~0M2i` zImcsL!$CnL1?&6U)&`i6AaB7QVPND^Xs&|d0mpv<14QNkqfX&PV^rp{2L*y?^}-z# z{x3X6=QQ7;90X;Ek`TNoq>W+wu*Z{EdJMy?a;5X*EA@;c#*bvJ1ydNp_-Yl!9Cd?< zEN`^N^kq;xS>j#R-bB)Q_Gd3K?x0>l<0_uvANdf4DvlCRa@BwoVr_SgAA;5ZlxI*; za7Lh1guk#JC^ly0krfiqWlFnmb66glVf`g*9CmpGid>$M!aOp7;o%sDsI?{7aTQq;ZcdH-Q0Uxs+}-a^5%Z zQ%p5?v=|Dbz+j;oN8@#QAK6g~G6(TXmC#$=Vlq5=S>$~b4Hxgy1d+mKcKXrEVGUiNWes(x7)38hzL1(DsT zw40+D!DqZ)Dzy9QZc4b$ zjazol?WKE}ZU%K%dsE%1!OVZK@uA4{nXcQNf}Ed~x2bLxtI{_XwEVTCG7!A26L3 zDSx{TrUI@*vxt_wZ_pfolMToDRSkN+6%|{JIb60t$d=1eky_qNupSa44oV zTM*Yg54??XKe<%cYM-xDfgTC{TpOzfo%5@e07IQVds=tZgF);>6A0b;^IUOITY-Uq zvL2R1fwC5!hH3z@6owdd$J|8a^6$lRFc<)x+qWtx}F$f_j>#B-F;z2U2Qf z33dQk%yO#^eId|nQ&Cav;C|u$gyk~Si%&B}YFX!N&E?hv#>Vm{iMlXVVO3*H6%wa4 zWK=(oRuhbh8c0lAlX?yM!i@;mx6$OEb99-?>=Y+1AXL2eCJbX(9IpBpXN}obA*(6R z3m8IEkdatfW|_}KcoM}uwZudeBbZVMNsum*mS_s3qdqX52ps{*05nUf0qE2kds43| z&6ZIXwbYagFPi{<{n!1EUW^cLyij3Z-Se1AREt%cmm4FzClwo%+MxG&{VAq zn4smZ!UQc6Y$+)+t5Hfp`kX?&J22{|{fsv2!k9bd&EhWaiw?aJR)SUE+p7q7ZoVYw ziyK3L3}nT8s|_M0$fnIJ7M2HN1}ZRdxI=Rgu|6esYMvI-IC3U@~X z8->5JvBDI)jG4a`Wy%3=3r%M*h?Z$53!rDgxKm%=dpK@((dG+u+d`N zyvl{de+0RUM;7)nGM#L!M%*--#~dRxx6ha`x|mSesBXLu1>-wL)4FJMt*)_Vht3*Q z14=TNQL>f*urjh7no}QU*@l=5mS=IP$y zQEWa+z4nIK$JH^sDaz4%Bu9{sZI<$)MQ(gndyi(Gq5%(4Z@nxV{5R+lWRVyt3)dkF zWpB>voO|MNJ!XiBqoX1_Ji1TtGEyW4Vx|a~o@s%1_iWFE#oOxI>$dVbb2vJ@!A|Df zG&b(xsONChiS0#w)cSyBJQyUwJ1srN#xsL595>{FB=02<0+w_=-etXp6nQ8(F{A_a zaTgjS%qK49{aAXZyUv;k82~(%IUtPF`ThuDcnb%b8V?ypjAkoOkyp5wuo0Mv@6^Bo zaqvw)Pr^v<8C%q2qxlg0LxdTy9rETed>EkTqN2pFx=0F{J*TdOR1+N{_ZR%_5sF0c zUetxCCaaqYGiuEuIff+8Dr{jT7Ywekp~RGL)WFG6g9Os_xAHL=(1HT-<7;RJvK?$U=xhQ#f!72e6tZ2p)2ewO3XtWu zV++BcAuOK?7i=JLaG>!+j}o;23yQ#lIjVXGz)`=wdrqL= z6du_#IUx6p{T>AEgR#~#S0Ks%u6Z4H0PH$BsQnE<1GKPnBZT_x0j+_WHdvcxV$@x3 zNIpfXr*4N1kXO*UIWOgDDG$R8tWqZWP0?XPlm-<&2@0Cs{wF4As%dmiVuoqxL7;RlvsHOYOX zW4^@}?=caEYWa8fUKCfg>UC}pUVkGXTQ=;BIS;~T!B=-!7%4nW_?IepE| zTB_t|KTw-U{tS=UoLw@Nv^(P-a}T<%J8zj%Uq$`IA8E^rc!IZ({6ER%2fZmTd(VVq zKJDcop{KnWZx+89Z=W}Z-zh)q?f2&ILH90Adk28|hoad>MD%aIG$Eo7^=&Zyfl3-{ zltbdBopjWoh5N%Bya{Qn0g1gh!2@|(e1wdgL54;S3gv@eO9&+dDU>;3Lh6zufjy3Cs#js)lbPp}z7eF+KF_mRT?RhCk@SBIHU>yMKD zT^J7n)n^IuNLvYhi*>H}LH)a-;@OT%8H$^Y9C!@tdtfTvUnMZbt7OeO3sx4gMaIlo zS!dqt%s&ELn3Jl!;_)Bzd<3emA~Vnk>81x$1&l89KCCfP;cSSz0rw2vy3_#W_Xs6L z%{B?Ygq9mMbhMQ_sUgtE;Oe)Lj0GvZ9#`^g>SgAN2ax95H`SjNiS9=-V^Ys}6YFx|7TJMR)0}#?EWD5TK4j!(#km`K*x?23Zr`SXp(up)_HAfXAO$e&!ED*kg!By9I=o0j zB5?b5WfPG+gEr^_!aN ziL&65Yf$=hSW*hUy8w0`#p@F7FT?WL+VVZdDWP2zPDJ%P>`G&~_z%P_tAz7DU>VU@ zRgf_1fs`JuW0LqNI}W0V^DMOjzXZ<$BIks$52lV1!XQeSk&jNqAwBeniwl$ZM;LmI z=*>4H!Js9}On&A#jy(qhTNVh9P$p3%c;$1@5j%$-L43W^30j)KaHOY#_7v!}a~Zmy z861n{B2ZPk=QL;Gz85(O=+3}8+;)h%TDK$e!<jpJhW#>q6=p+w(|qv;SmCpJb>#``QbVw!WYA(w<& zM;^&N!zMmBhb6(BMRF!LF-MOF2%ZqKjc0MQ0H3j&^^J*}h4D0LOQ;dP5vN8-gD?TR z5v*vWd>lJ;p)-mH;e!$Vav-Bo>4%d4rALnOG1xk?LC1r2rf-UaL7(}h&gbM`ly~5x`PNiVau;gRvDt==C+*&-#Ie@Q1AWme7uDg%mrT=dKUb8J1W0~|yH zfmB0H+&=>Xds-7%DjlNtfzo{?zXiJoPjrj|E_RM_aFR~yPopZH9H?VP6E;y51Z97O zO=`LIA225rlX}I7#Kp3l(7ZjTz?L8J6y}jJZ0Hs-VFK=w13yNNjTNT}!1EA>B6$uk z0!&ylz`tlMv^rnCuK5=&x-G?6C>mnP7%st5sMSSn7KG`r-U3J!kvp~*!+c@sy^HGf z7`0Axsz2stxDdmB3ADf6Jf?EMF32g zTubf3RM4e+9UB9E6gNi*eDR!JQ-0w#UA3-4On^IeReD2aWpA1-hCO8j(Bce7>N#Gj zKNV*C(`cF7g}eqsthqMR`ps~5ZC`(md6Xr?{m9M3g#uv#;zaU+31cnl`Ukx9t~q+6 zyY_(@d<}DX@kIkaz z^JWHN+FXCyo1J*ur{5l!8%qz&=Cy7LEBN#9m^asF@DZT5V}2j2YM#TJ3CQf1^*%Fz zg~P{g8}(Jz^UvdFYt%lWKx{t=!h zAD~eF97zeoh%Cf5h8`m8qYR9Nq0V(>n!3v1hX`+R=ONC_+ z@v#XXG`wAUm`W9XCj=}(Qt%Kv0(%WTViK03<>w`QSOEzDsum7QS7?zM7JJdaB*2$( zCMv8U)Nv?46#4bY%8J_Ms%QO5u#Iz+6&0Z}cdX(CRcF;#Ucm{|=9_=Jmlu;Yw+Fou zkujq!#Eu)v9%y$4cjN6|p;I7!1)IX`XJ5E2u!)c$SLL#7^Odo!LpVrVKf85 zpC8P`-^vusD6yhio9%1S6uv--i*FPzYE#4Cz*^M-CL{6u8eZ`^#Wq~+gO8xncoB_a zC35M1rADmC*CT|7P#IRVDnwJz4hdf3j-s%H;B|cNMC16Fx#xFTk-{*QFjP^R`Xt?! zO1*#zF>XXzMCJ?wLN7Z+@l;3$eIJaGQg$Z@>(ODMSy+ zhcbnO2>h=HB0a*$i=i~=PGZi|?BMgBGGRnaDIM8cB2@%mX(k3_SsTVmbHf`kYLpuy zmK=l7mePoJl<`SiNl+F?A}GtQdrE-B_)KQCl;w)bZA5(H`hW-umZ{Hi;d3z-jlNn^ z|5(5*2meo*H3wwlkMW`dannO83tx~C{3$Bvvd{uCg<|I~oTLj!pZhRl%e!g))JeEv z@P(o7p<}_l0aG1v4&wyS=3$nfC_QxSoRnlOv;#59I9jyMnFmpik!|Ov2(NM3ieWew z#+tL{F~+P#b?A!_!=X-ohVlfzfnfcttN|8;+w}51IU3CcnW%+!lT2#H1(qN<)UC>L$Jmk+`F&YP}K!K*`mXr~V!5 zMoNa{gwy>dD!xq6ioi`Dh6^voyo-1{_h~ohCg8_ln<}1(KeE{u@dW3PjQkk*a?3!B zk;Kd+#t6|xcu&wcf#0N;rg1|39=c4J6*w55D|qBfGVu|>WG6lX%L5lG+apf_zSSbd z(4P^cc$Z+|gl~YFi>E)0iM6ZW$B1Jampv1LFJn64Ll{61pSY``uD6R2E;r4`z#n8vFw!fU*k@xN*Pu*L-ZY2z(#we;Tm`_{7WFm zZzN=!bjHzsBdWUg!s@R-VWNhgw}?8#uV8ahC-$He-#i$sJ~&SCq3`ZW=mQQiJt0)n zuKL!vNF8PdQKX`(?U?EvFNrV-C}N0ZwV+m6o(rQmyv6-2l`G6YD2q#AK}H)fpie{4 zyxeo(LFVc++G~us)f}R1U}=s=5TElW@Hx+H|IgUMyYUG;$)ALJA5+-Jg6v~f+ps3~ zK*hiePLA(F4mZ0vW^x6MM1ZKEYV0?@)F}=mn1S(VqP_|55&an`)b?61Zc8mqoDwgM zjVIv4D-3Zh*E4ZppyZB!|0BxxbY@X71SlgR@D5qpUYuFPD9adEe^D?d_l|HyuXarC zjXw(NSksxv%=`qOvOVl1HpAufU+&C_fq`N?cegF_hqbi?gR%$@V)uT$P+gMFK~ha}FhayGwbO@eXY+g6b9lVA!-%drld2SMr?hDHxMO~&J- zeJ|7=IX+%Zxn#@8&^+TAn}#|jjtFs)P`jmt3nh-&#k4y_?7<$a!yg8+5!3JC zn!+%JR|=ct@MBX7#S~)sd#HGc^YTRCFiyI&?s4H&g`ZQG*z0*DQHtRk#LK5x^v{_5 z3CnXe8qgqPE)}VBh?_A=hTCnnd)rTglWBnnJFVp24^=M(TiD*p{o((a5 zAICWQxCSvOcv5>8p@(SHAOupK)UvQB4Wv`z&eqz*5xy>Pgkz7JgN8}Qe@RfO#F9p7 zh|sS}5RE=-LABEy=8H@yy=%|XI&&ct#%hQlBM17p^N-xiI%4DnvccfXNEkH`|I3=^ mD7@j}=dM}vOlH=~*ogI*Mj+uKNKB{QFXURe?-}1Srv5J##CIV8 diff --git a/venv/Lib/site-packages/pip/_internal/req/constructors.py b/venv/Lib/site-packages/pip/_internal/req/constructors.py deleted file mode 100644 index 3f9e7dd..0000000 --- a/venv/Lib/site-packages/pip/_internal/req/constructors.py +++ /dev/null @@ -1,486 +0,0 @@ -"""Backing implementation for InstallRequirement's various constructors - -The idea here is that these formed a major chunk of InstallRequirement's size -so, moving them and support code dedicated to them outside of that class -helps creates for better understandability for the rest of the code. - -These are meant to be used elsewhere within pip to create instances of -InstallRequirement. -""" - -import logging -import os -import re -from typing import Any, Dict, Optional, Set, Tuple, Union - -from pip._vendor.packaging.markers import Marker -from pip._vendor.packaging.requirements import InvalidRequirement, Requirement -from pip._vendor.packaging.specifiers import Specifier -from pip._vendor.pkg_resources import RequirementParseError, parse_requirements - -from pip._internal.exceptions import InstallationError -from pip._internal.models.index import PyPI, TestPyPI -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.pyproject import make_pyproject_path -from pip._internal.req.req_file import ParsedRequirement -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.filetypes import is_archive_file -from pip._internal.utils.misc import is_installable_dir -from pip._internal.utils.urls import path_to_url -from pip._internal.vcs import is_url, vcs - -__all__ = [ - "install_req_from_editable", "install_req_from_line", - "parse_editable" -] - -logger = logging.getLogger(__name__) -operators = Specifier._operators.keys() - - -def _strip_extras(path): - # type: (str) -> Tuple[str, Optional[str]] - m = re.match(r'^(.+)(\[[^\]]+\])$', path) - extras = None - if m: - path_no_extras = m.group(1) - extras = m.group(2) - else: - path_no_extras = path - - return path_no_extras, extras - - -def convert_extras(extras): - # type: (Optional[str]) -> Set[str] - if not extras: - return set() - return Requirement("placeholder" + extras.lower()).extras - - -def parse_editable(editable_req): - # type: (str) -> Tuple[Optional[str], str, Set[str]] - """Parses an editable requirement into: - - a requirement name - - an URL - - extras - - editable options - Accepted requirements: - svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir - .[some_extra] - """ - - url = editable_req - - # If a file path is specified with extras, strip off the extras. - url_no_extras, extras = _strip_extras(url) - - if os.path.isdir(url_no_extras): - setup_py = os.path.join(url_no_extras, 'setup.py') - setup_cfg = os.path.join(url_no_extras, 'setup.cfg') - if not os.path.exists(setup_py) and not os.path.exists(setup_cfg): - msg = ( - 'File "setup.py" or "setup.cfg" not found. Directory cannot be ' - 'installed in editable mode: {}' - .format(os.path.abspath(url_no_extras)) - ) - pyproject_path = make_pyproject_path(url_no_extras) - if os.path.isfile(pyproject_path): - msg += ( - '\n(A "pyproject.toml" file was found, but editable ' - 'mode currently requires a setuptools-based build.)' - ) - raise InstallationError(msg) - - # Treating it as code that has already been checked out - url_no_extras = path_to_url(url_no_extras) - - if url_no_extras.lower().startswith('file:'): - package_name = Link(url_no_extras).egg_fragment - if extras: - return ( - package_name, - url_no_extras, - Requirement("placeholder" + extras.lower()).extras, - ) - else: - return package_name, url_no_extras, set() - - for version_control in vcs: - if url.lower().startswith(f'{version_control}:'): - url = f'{version_control}+{url}' - break - - link = Link(url) - - if not link.is_vcs: - backends = ", ".join(vcs.all_schemes) - raise InstallationError( - f'{editable_req} is not a valid editable requirement. ' - f'It should either be a path to a local project or a VCS URL ' - f'(beginning with {backends}).' - ) - - package_name = link.egg_fragment - if not package_name: - raise InstallationError( - "Could not detect requirement name for '{}', please specify one " - "with #egg=your_package_name".format(editable_req) - ) - return package_name, url, set() - - -def deduce_helpful_msg(req): - # type: (str) -> str - """Returns helpful msg in case requirements file does not exist, - or cannot be parsed. - - :params req: Requirements file path - """ - msg = "" - if os.path.exists(req): - msg = " The path does exist. " - # Try to parse and check if it is a requirements file. - try: - with open(req) as fp: - # parse first line only - next(parse_requirements(fp.read())) - msg += ( - "The argument you provided " - "({}) appears to be a" - " requirements file. If that is the" - " case, use the '-r' flag to install" - " the packages specified within it." - ).format(req) - except RequirementParseError: - logger.debug( - "Cannot parse '%s' as requirements file", req, exc_info=True - ) - else: - msg += f" File '{req}' does not exist." - return msg - - -class RequirementParts: - def __init__( - self, - requirement, # type: Optional[Requirement] - link, # type: Optional[Link] - markers, # type: Optional[Marker] - extras, # type: Set[str] - ): - self.requirement = requirement - self.link = link - self.markers = markers - self.extras = extras - - -def parse_req_from_editable(editable_req): - # type: (str) -> RequirementParts - name, url, extras_override = parse_editable(editable_req) - - if name is not None: - try: - req = Requirement(name) # type: Optional[Requirement] - except InvalidRequirement: - raise InstallationError(f"Invalid requirement: '{name}'") - else: - req = None - - link = Link(url) - - return RequirementParts(req, link, None, extras_override) - - -# ---- The actual constructors follow ---- - - -def install_req_from_editable( - editable_req, # type: str - comes_from=None, # type: Optional[Union[InstallRequirement, str]] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - constraint=False, # type: bool - user_supplied=False, # type: bool -): - # type: (...) -> InstallRequirement - - parts = parse_req_from_editable(editable_req) - - return InstallRequirement( - parts.requirement, - comes_from=comes_from, - user_supplied=user_supplied, - editable=True, - link=parts.link, - constraint=constraint, - use_pep517=use_pep517, - isolated=isolated, - 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 {}, - extras=parts.extras, - ) - - -def _looks_like_path(name): - # type: (str) -> bool - """Checks whether the string "looks like" a path on the filesystem. - - This does not check whether the target actually exists, only judge from the - appearance. - - Returns true if any of the following conditions is true: - * a path separator is found (either os.path.sep or os.path.altsep); - * a dot is found (which represents the current directory). - """ - if os.path.sep in name: - return True - if os.path.altsep is not None and os.path.altsep in name: - return True - if name.startswith("."): - return True - return False - - -def _get_url_from_path(path, name): - # type: (str, str) -> Optional[str] - """ - First, it checks whether a provided path is an installable directory - (e.g. it has a setup.py). If it is, returns the path. - - If false, check if the path is an archive file (such as a .whl). - The function checks if the path is a file. If false, if the path has - an @, it will treat it as a PEP 440 URL requirement and return the path. - """ - if _looks_like_path(name) and os.path.isdir(path): - if is_installable_dir(path): - return path_to_url(path) - raise InstallationError( - f"Directory {name!r} is not installable. Neither 'setup.py' " - "nor 'pyproject.toml' found." - ) - if not is_archive_file(path): - return None - if os.path.isfile(path): - return path_to_url(path) - urlreq_parts = name.split('@', 1) - if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]): - # If the path contains '@' and the part before it does not look - # like a path, try to treat it as a PEP 440 URL req instead. - return None - logger.warning( - 'Requirement %r looks like a filename, but the ' - 'file does not exist', - name - ) - return path_to_url(path) - - -def parse_req_from_line(name, line_source): - # type: (str, Optional[str]) -> RequirementParts - if is_url(name): - marker_sep = '; ' - else: - marker_sep = ';' - if marker_sep in name: - name, markers_as_string = name.split(marker_sep, 1) - markers_as_string = markers_as_string.strip() - if not markers_as_string: - markers = None - else: - markers = Marker(markers_as_string) - else: - markers = None - name = name.strip() - req_as_string = None - path = os.path.normpath(os.path.abspath(name)) - link = None - extras_as_string = None - - if is_url(name): - link = Link(name) - else: - p, extras_as_string = _strip_extras(path) - url = _get_url_from_path(p, name) - if url is not None: - link = Link(url) - - # it's a local file, dir, or url - if link: - # Handle relative file URLs - if link.scheme == 'file' and re.search(r'\.\./', link.url): - link = Link( - path_to_url(os.path.normpath(os.path.abspath(link.path)))) - # wheel file - if link.is_wheel: - wheel = Wheel(link.filename) # can raise InvalidWheelFilename - req_as_string = f"{wheel.name}=={wheel.version}" - else: - # set the req to the egg fragment. when it's not there, this - # will become an 'unnamed' requirement - req_as_string = link.egg_fragment - - # a requirement specifier - else: - req_as_string = name - - extras = convert_extras(extras_as_string) - - def with_source(text): - # type: (str) -> str - if not line_source: - return text - return f'{text} (from {line_source})' - - def _parse_req_string(req_as_string: str) -> Requirement: - try: - req = Requirement(req_as_string) - except InvalidRequirement: - if os.path.sep in req_as_string: - add_msg = "It looks like a path." - add_msg += deduce_helpful_msg(req_as_string) - elif ('=' in req_as_string and - not any(op in req_as_string for op in operators)): - add_msg = "= is not a valid operator. Did you mean == ?" - else: - add_msg = '' - msg = with_source( - f'Invalid requirement: {req_as_string!r}' - ) - if add_msg: - msg += f'\nHint: {add_msg}' - raise InstallationError(msg) - else: - # Deprecate extras after specifiers: "name>=1.0[extras]" - # This currently works by accident because _strip_extras() parses - # any extras in the end of the string and those are saved in - # RequirementParts - for spec in req.specifier: - spec_str = str(spec) - if spec_str.endswith(']'): - msg = f"Extras after version '{spec_str}'." - raise InstallationError(msg) - return req - - if req_as_string is not None: - req = _parse_req_string(req_as_string) # type: Optional[Requirement] - else: - req = None - - return RequirementParts(req, link, markers, extras) - - -def install_req_from_line( - name, # type: str - comes_from=None, # type: Optional[Union[str, InstallRequirement]] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - constraint=False, # type: bool - line_source=None, # type: Optional[str] - user_supplied=False, # type: bool -): - # type: (...) -> InstallRequirement - """Creates an InstallRequirement from a name, which might be a - requirement, directory containing 'setup.py', filename, or URL. - - :param line_source: An optional string describing where the line is from, - for logging purposes in case of an error. - """ - parts = parse_req_from_line(name, line_source) - - return InstallRequirement( - parts.requirement, comes_from, link=parts.link, markers=parts.markers, - use_pep517=use_pep517, isolated=isolated, - 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 {}, - constraint=constraint, - extras=parts.extras, - user_supplied=user_supplied, - ) - - -def install_req_from_req_string( - req_string, # type: str - comes_from=None, # type: Optional[InstallRequirement] - isolated=False, # type: bool - use_pep517=None, # type: Optional[bool] - user_supplied=False, # type: bool -): - # type: (...) -> InstallRequirement - try: - req = Requirement(req_string) - except InvalidRequirement: - raise InstallationError(f"Invalid requirement: '{req_string}'") - - domains_not_allowed = [ - PyPI.file_storage_domain, - TestPyPI.file_storage_domain, - ] - if (req.url and comes_from and comes_from.link and - comes_from.link.netloc in domains_not_allowed): - # Explicitly disallow pypi packages that depend on external urls - raise InstallationError( - "Packages installed from PyPI cannot depend on packages " - "which are not also hosted on PyPI.\n" - "{} depends on {} ".format(comes_from.name, req) - ) - - return InstallRequirement( - req, - comes_from, - isolated=isolated, - use_pep517=use_pep517, - user_supplied=user_supplied, - ) - - -def install_req_from_parsed_requirement( - parsed_req, # type: ParsedRequirement - isolated=False, # type: bool - use_pep517=None, # type: Optional[bool] - user_supplied=False, # type: bool -): - # type: (...) -> InstallRequirement - if parsed_req.is_editable: - req = install_req_from_editable( - parsed_req.requirement, - comes_from=parsed_req.comes_from, - use_pep517=use_pep517, - constraint=parsed_req.constraint, - isolated=isolated, - user_supplied=user_supplied, - ) - - else: - req = install_req_from_line( - parsed_req.requirement, - comes_from=parsed_req.comes_from, - use_pep517=use_pep517, - isolated=isolated, - options=parsed_req.options, - constraint=parsed_req.constraint, - line_source=parsed_req.line_source, - user_supplied=user_supplied, - ) - return req - - -def install_req_from_link_and_ireq(link, ireq): - # type: (Link, InstallRequirement) -> InstallRequirement - return InstallRequirement( - req=ireq.req, - comes_from=ireq.comes_from, - editable=ireq.editable, - link=link, - markers=ireq.markers, - use_pep517=ireq.use_pep517, - isolated=ireq.isolated, - install_options=ireq.install_options, - global_options=ireq.global_options, - hash_options=ireq.hash_options, - ) diff --git a/venv/Lib/site-packages/pip/_internal/req/req_file.py b/venv/Lib/site-packages/pip/_internal/req/req_file.py deleted file mode 100644 index 080c128..0000000 --- a/venv/Lib/site-packages/pip/_internal/req/req_file.py +++ /dev/null @@ -1,551 +0,0 @@ -""" -Requirements file parsing -""" - -import optparse -import os -import re -import shlex -import urllib.parse -from optparse import Values -from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Tuple - -from pip._internal.cli import cmdoptions -from pip._internal.exceptions import InstallationError, RequirementsFileParseError -from pip._internal.models.search_scope import SearchScope -from pip._internal.network.session import PipSession -from pip._internal.network.utils import raise_for_status -from pip._internal.utils.encoding import auto_decode -from pip._internal.utils.urls import get_url_scheme, url_to_path - -if TYPE_CHECKING: - # NoReturn introduced in 3.6.2; imported only for type checking to maintain - # pip compatibility with older patch versions of Python 3.6 - from typing import NoReturn - - from pip._internal.index.package_finder import PackageFinder - -__all__ = ['parse_requirements'] - -ReqFileLines = Iterator[Tuple[int, str]] - -LineParser = Callable[[str], Tuple[str, Values]] - -SCHEME_RE = re.compile(r'^(http|https|file):', re.I) -COMMENT_RE = re.compile(r'(^|\s+)#.*$') - -# Matches environment variable-style values in '${MY_VARIABLE_1}' with the -# variable name consisting of only uppercase letters, digits or the '_' -# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, -# 2013 Edition. -ENV_VAR_RE = re.compile(r'(?P\$\{(?P[A-Z0-9_]+)\})') - -SUPPORTED_OPTIONS = [ - cmdoptions.index_url, - cmdoptions.extra_index_url, - cmdoptions.no_index, - cmdoptions.constraints, - cmdoptions.requirements, - cmdoptions.editable, - cmdoptions.find_links, - cmdoptions.no_binary, - cmdoptions.only_binary, - cmdoptions.prefer_binary, - cmdoptions.require_hashes, - cmdoptions.pre, - cmdoptions.trusted_host, - cmdoptions.use_new_feature, -] # type: List[Callable[..., optparse.Option]] - -# options to be passed to requirements -SUPPORTED_OPTIONS_REQ = [ - cmdoptions.install_options, - cmdoptions.global_options, - cmdoptions.hash, -] # type: List[Callable[..., optparse.Option]] - -# the 'dest' string values -SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] - - -class ParsedRequirement: - def __init__( - self, - requirement, # type:str - is_editable, # type: bool - comes_from, # type: str - constraint, # type: bool - options=None, # type: Optional[Dict[str, Any]] - line_source=None, # type: Optional[str] - ): - # type: (...) -> None - self.requirement = requirement - self.is_editable = is_editable - self.comes_from = comes_from - self.options = options - self.constraint = constraint - self.line_source = line_source - - -class ParsedLine: - def __init__( - self, - filename, # type: str - lineno, # type: int - args, # type: str - opts, # type: Values - constraint, # type: bool - ): - # type: (...) -> None - self.filename = filename - self.lineno = lineno - self.opts = opts - self.constraint = constraint - - if args: - self.is_requirement = True - self.is_editable = False - self.requirement = args - elif opts.editables: - self.is_requirement = True - self.is_editable = True - # We don't support multiple -e on one line - self.requirement = opts.editables[0] - else: - self.is_requirement = False - - -def parse_requirements( - filename, # type: str - session, # type: PipSession - finder=None, # type: Optional[PackageFinder] - options=None, # type: Optional[optparse.Values] - constraint=False, # type: bool -): - # type: (...) -> Iterator[ParsedRequirement] - """Parse a requirements file and yield ParsedRequirement instances. - - :param filename: Path or url of requirements file. - :param session: PipSession instance. - :param finder: Instance of pip.index.PackageFinder. - :param options: cli options. - :param constraint: If true, parsing a constraint file rather than - requirements file. - """ - line_parser = get_line_parser(finder) - parser = RequirementsFileParser(session, line_parser) - - for parsed_line in parser.parse(filename, constraint): - parsed_req = handle_line( - parsed_line, - options=options, - finder=finder, - session=session - ) - if parsed_req is not None: - yield parsed_req - - -def preprocess(content): - # type: (str) -> ReqFileLines - """Split, filter, and join lines, and return a line iterator - - :param content: the content of the requirements file - """ - lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines - lines_enum = join_lines(lines_enum) - lines_enum = ignore_comments(lines_enum) - lines_enum = expand_env_variables(lines_enum) - return lines_enum - - -def handle_requirement_line( - line, # type: ParsedLine - options=None, # type: Optional[optparse.Values] -): - # type: (...) -> ParsedRequirement - - # preserve for the nested code path - line_comes_from = '{} {} (line {})'.format( - '-c' if line.constraint else '-r', line.filename, line.lineno, - ) - - assert line.is_requirement - - if line.is_editable: - # For editable requirements, we don't support per-requirement - # options, so just return the parsed requirement. - return ParsedRequirement( - requirement=line.requirement, - is_editable=line.is_editable, - comes_from=line_comes_from, - constraint=line.constraint, - ) - else: - if options: - # Disable wheels if the user has specified build options - cmdoptions.check_install_build_global(options, line.opts) - - # get the options that apply to requirements - req_options = {} - for dest in SUPPORTED_OPTIONS_REQ_DEST: - if dest in line.opts.__dict__ and line.opts.__dict__[dest]: - req_options[dest] = line.opts.__dict__[dest] - - line_source = f'line {line.lineno} of {line.filename}' - return ParsedRequirement( - requirement=line.requirement, - is_editable=line.is_editable, - comes_from=line_comes_from, - constraint=line.constraint, - options=req_options, - line_source=line_source, - ) - - -def handle_option_line( - opts, # type: Values - filename, # type: str - lineno, # type: int - finder=None, # type: Optional[PackageFinder] - options=None, # type: Optional[optparse.Values] - session=None, # type: Optional[PipSession] -): - # type: (...) -> None - - if options: - # percolate options upward - if opts.require_hashes: - options.require_hashes = opts.require_hashes - if opts.features_enabled: - options.features_enabled.extend( - f for f in opts.features_enabled - if f not in options.features_enabled - ) - - # set finder options - if finder: - find_links = finder.find_links - index_urls = finder.index_urls - if opts.index_url: - index_urls = [opts.index_url] - if opts.no_index is True: - index_urls = [] - if opts.extra_index_urls: - index_urls.extend(opts.extra_index_urls) - if opts.find_links: - # FIXME: it would be nice to keep track of the source - # of the find_links: support a find-links local path - # relative to a requirements file. - value = opts.find_links[0] - req_dir = os.path.dirname(os.path.abspath(filename)) - relative_to_reqs_file = os.path.join(req_dir, value) - if os.path.exists(relative_to_reqs_file): - value = relative_to_reqs_file - find_links.append(value) - - if session: - # We need to update the auth urls in session - session.update_index_urls(index_urls) - - search_scope = SearchScope( - find_links=find_links, - index_urls=index_urls, - ) - finder.search_scope = search_scope - - if opts.pre: - finder.set_allow_all_prereleases() - - if opts.prefer_binary: - finder.set_prefer_binary() - - if session: - for host in opts.trusted_hosts or []: - source = f'line {lineno} of {filename}' - session.add_trusted_host(host, source=source) - - -def handle_line( - line, # type: ParsedLine - options=None, # type: Optional[optparse.Values] - finder=None, # type: Optional[PackageFinder] - session=None, # type: Optional[PipSession] -): - # type: (...) -> Optional[ParsedRequirement] - """Handle a single parsed requirements line; This can result in - creating/yielding requirements, or updating the finder. - - :param line: The parsed line to be processed. - :param options: CLI options. - :param finder: The finder - updated by non-requirement lines. - :param session: The session - updated by non-requirement lines. - - Returns a ParsedRequirement object if the line is a requirement line, - otherwise returns None. - - For lines that contain requirements, the only options that have an effect - are from SUPPORTED_OPTIONS_REQ, and they are scoped to the - requirement. Other options from SUPPORTED_OPTIONS may be present, but are - ignored. - - For lines that do not contain requirements, the only options that have an - effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may - be present, but are ignored. These lines may contain multiple options - (although our docs imply only one is supported), and all our parsed and - affect the finder. - """ - - if line.is_requirement: - parsed_req = handle_requirement_line(line, options) - return parsed_req - else: - handle_option_line( - line.opts, - line.filename, - line.lineno, - finder, - options, - session, - ) - return None - - -class RequirementsFileParser: - def __init__( - self, - session, # type: PipSession - line_parser, # type: LineParser - ): - # type: (...) -> None - self._session = session - self._line_parser = line_parser - - def parse(self, filename, constraint): - # type: (str, bool) -> Iterator[ParsedLine] - """Parse a given file, yielding parsed lines. - """ - yield from self._parse_and_recurse(filename, constraint) - - def _parse_and_recurse(self, filename, constraint): - # type: (str, bool) -> Iterator[ParsedLine] - for line in self._parse_file(filename, constraint): - if ( - not line.is_requirement and - (line.opts.requirements or line.opts.constraints) - ): - # parse a nested requirements file - if line.opts.requirements: - req_path = line.opts.requirements[0] - nested_constraint = False - else: - req_path = line.opts.constraints[0] - nested_constraint = True - - # original file is over http - if SCHEME_RE.search(filename): - # do a url join so relative paths work - req_path = urllib.parse.urljoin(filename, req_path) - # original file and nested file are paths - elif not SCHEME_RE.search(req_path): - # do a join so relative paths work - req_path = os.path.join( - os.path.dirname(filename), req_path, - ) - - yield from self._parse_and_recurse(req_path, nested_constraint) - else: - yield line - - def _parse_file(self, filename, constraint): - # type: (str, bool) -> Iterator[ParsedLine] - _, content = get_file_content(filename, self._session) - - lines_enum = preprocess(content) - - for line_number, line in lines_enum: - try: - args_str, opts = self._line_parser(line) - except OptionParsingError as e: - # add offending line - msg = f'Invalid requirement: {line}\n{e.msg}' - raise RequirementsFileParseError(msg) - - yield ParsedLine( - filename, - line_number, - args_str, - opts, - constraint, - ) - - -def get_line_parser(finder): - # type: (Optional[PackageFinder]) -> LineParser - def parse_line(line): - # type: (str) -> Tuple[str, Values] - # Build new parser for each line since it accumulates appendable - # options. - parser = build_parser() - defaults = parser.get_default_values() - defaults.index_url = None - if finder: - defaults.format_control = finder.format_control - - args_str, options_str = break_args_options(line) - - opts, _ = parser.parse_args(shlex.split(options_str), defaults) - - return args_str, opts - - return parse_line - - -def break_args_options(line): - # type: (str) -> Tuple[str, str] - """Break up the line into an args and options string. We only want to shlex - (and then optparse) the options, not the args. args can contain markers - which are corrupted by shlex. - """ - tokens = line.split(' ') - args = [] - options = tokens[:] - for token in tokens: - if token.startswith('-') or token.startswith('--'): - break - else: - args.append(token) - options.pop(0) - return ' '.join(args), ' '.join(options) - - -class OptionParsingError(Exception): - def __init__(self, msg): - # type: (str) -> None - self.msg = msg - - -def build_parser(): - # type: () -> optparse.OptionParser - """ - Return a parser for parsing requirement lines - """ - parser = optparse.OptionParser(add_help_option=False) - - option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ - for option_factory in option_factories: - option = option_factory() - parser.add_option(option) - - # By default optparse sys.exits on parsing errors. We want to wrap - # that in our own exception. - def parser_exit(self, msg): - # type: (Any, str) -> NoReturn - raise OptionParsingError(msg) - # NOTE: mypy disallows assigning to a method - # https://github.com/python/mypy/issues/2427 - parser.exit = parser_exit # type: ignore - - return parser - - -def join_lines(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """Joins a line ending in '\' with the previous line (except when following - comments). The joined line takes on the index of the first line. - """ - primary_line_number = None - new_line = [] # type: List[str] - for line_number, line in lines_enum: - if not line.endswith('\\') or COMMENT_RE.match(line): - if COMMENT_RE.match(line): - # this ensures comments are always matched later - line = ' ' + line - if new_line: - new_line.append(line) - assert primary_line_number is not None - yield primary_line_number, ''.join(new_line) - new_line = [] - else: - yield line_number, line - else: - if not new_line: - primary_line_number = line_number - new_line.append(line.strip('\\')) - - # last line contains \ - if new_line: - assert primary_line_number is not None - yield primary_line_number, ''.join(new_line) - - # TODO: handle space after '\'. - - -def ignore_comments(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """ - Strips comments and filter empty lines. - """ - for line_number, line in lines_enum: - line = COMMENT_RE.sub('', line) - line = line.strip() - if line: - yield line_number, line - - -def expand_env_variables(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """Replace all environment variables that can be retrieved via `os.getenv`. - - The only allowed format for environment variables defined in the - requirement file is `${MY_VARIABLE_1}` to ensure two things: - - 1. Strings that contain a `$` aren't accidentally (partially) expanded. - 2. Ensure consistency across platforms for requirement files. - - These points are the result of a discussion on the `github pull - request #3514 `_. - - Valid characters in variable names follow the `POSIX standard - `_ and are limited - to uppercase letter, digits and the `_` (underscore). - """ - for line_number, line in lines_enum: - for env_var, var_name in ENV_VAR_RE.findall(line): - value = os.getenv(var_name) - if not value: - continue - - line = line.replace(env_var, value) - - yield line_number, line - - -def get_file_content(url, session): - # type: (str, PipSession) -> Tuple[str, str] - """Gets the content of a file; it may be a filename, file: URL, or - http: URL. Returns (location, content). Content is unicode. - Respects # -*- coding: declarations on the retrieved files. - - :param url: File path or url. - :param session: PipSession instance. - """ - scheme = get_url_scheme(url) - - if scheme in ['http', 'https']: - # FIXME: catch some errors - resp = session.get(url) - raise_for_status(resp) - return resp.url, resp.text - - elif scheme == 'file': - url = url_to_path(url) - - try: - with open(url, 'rb') as f: - content = auto_decode(f.read()) - except OSError as exc: - raise InstallationError( - f'Could not open requirements file: {exc}' - ) - return url, content diff --git a/venv/Lib/site-packages/pip/_internal/req/req_install.py b/venv/Lib/site-packages/pip/_internal/req/req_install.py deleted file mode 100644 index c2eea37..0000000 --- a/venv/Lib/site-packages/pip/_internal/req/req_install.py +++ /dev/null @@ -1,892 +0,0 @@ -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import logging -import os -import shutil -import sys -import uuid -import zipfile -from typing import Any, Dict, Iterable, List, Optional, Sequence, Union - -from pip._vendor import pkg_resources, six -from pip._vendor.packaging.markers import Marker -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import Version -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.pep517.wrappers import Pep517HookCaller -from pip._vendor.pkg_resources import Distribution - -from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment -from pip._internal.exceptions import InstallationError -from pip._internal.locations import get_scheme -from pip._internal.models.link import Link -from pip._internal.operations.build.metadata import generate_metadata -from pip._internal.operations.build.metadata_legacy import ( - generate_metadata as generate_metadata_legacy, -) -from pip._internal.operations.install.editable_legacy import ( - install_editable as install_editable_legacy, -) -from pip._internal.operations.install.legacy import LegacyInstallFailure -from pip._internal.operations.install.legacy import install as install_legacy -from pip._internal.operations.install.wheel import install_wheel -from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path -from pip._internal.req.req_uninstall import UninstallPathSet -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.direct_url_helpers import direct_url_from_link -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - ask_path_exists, - backup_dir, - display_path, - dist_in_site_packages, - dist_in_usersite, - get_distribution, - hide_url, - redact_auth_from_url, -) -from pip._internal.utils.packaging import get_metadata -from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds -from pip._internal.utils.virtualenv import running_under_virtualenv -from pip._internal.vcs import vcs - -logger = logging.getLogger(__name__) - - -def _get_dist(metadata_directory): - # type: (str) -> Distribution - """Return a pkg_resources.Distribution for the provided - metadata directory. - """ - dist_dir = metadata_directory.rstrip(os.sep) - - # Build a PathMetadata object, from path to metadata. :wink: - base_dir, dist_dir_name = os.path.split(dist_dir) - metadata = pkg_resources.PathMetadata(base_dir, dist_dir) - - # Determine the correct Distribution object type. - if dist_dir.endswith(".egg-info"): - dist_cls = pkg_resources.Distribution - dist_name = os.path.splitext(dist_dir_name)[0] - else: - assert dist_dir.endswith(".dist-info") - dist_cls = pkg_resources.DistInfoDistribution - dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0] - - return dist_cls( - base_dir, - project_name=dist_name, - metadata=metadata, - ) - - -class InstallRequirement: - """ - Represents something that may be installed later on, may have information - about where to fetch the relevant requirement and also contains logic for - installing the said requirement. - """ - - def __init__( - self, - req, # type: Optional[Requirement] - comes_from, # type: Optional[Union[str, InstallRequirement]] - editable=False, # type: bool - link=None, # type: Optional[Link] - markers=None, # type: Optional[Marker] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - install_options=None, # type: Optional[List[str]] - global_options=None, # type: Optional[List[str]] - hash_options=None, # type: Optional[Dict[str, List[str]]] - constraint=False, # type: bool - extras=(), # type: Iterable[str] - user_supplied=False, # type: bool - ): - # type: (...) -> None - assert req is None or isinstance(req, Requirement), req - self.req = req - self.comes_from = comes_from - self.constraint = constraint - self.editable = editable - self.legacy_install_reason = None # type: Optional[int] - - # source_dir is the local directory where the linked requirement is - # located, or unpacked. In case unpacking is needed, creating and - # populating source_dir is done by the RequirementPreparer. Note this - # is not necessarily the directory where pyproject.toml or setup.py is - # located - that one is obtained via unpacked_source_directory. - self.source_dir = None # type: Optional[str] - if self.editable: - assert link - if link.is_file: - self.source_dir = os.path.normpath( - os.path.abspath(link.file_path) - ) - - if link is None and req and req.url: - # PEP 508 URL requirement - link = Link(req.url) - self.link = self.original_link = link - self.original_link_is_in_wheel_cache = False - - # Path to any downloaded or already-existing package. - self.local_file_path = None # type: Optional[str] - if self.link and self.link.is_file: - self.local_file_path = self.link.file_path - - if extras: - self.extras = extras - elif req: - self.extras = { - pkg_resources.safe_extra(extra) for extra in req.extras - } - else: - self.extras = set() - if markers is None and req: - markers = req.marker - self.markers = markers - - # This holds the pkg_resources.Distribution object if this requirement - # is already available: - self.satisfied_by = None # type: Optional[Distribution] - # Whether the installation process should try to uninstall an existing - # distribution before installing this requirement. - self.should_reinstall = False - # Temporary build location - self._temp_build_dir = None # type: Optional[TempDirectory] - # Set to True after successful installation - self.install_succeeded = None # type: Optional[bool] - # Supplied options - 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 {} - # Set to True after successful preparation of this requirement - self.prepared = False - # User supplied requirement are explicitly requested for installation - # by the user via CLI arguments or requirements files, as opposed to, - # e.g. dependencies, extras or constraints. - self.user_supplied = user_supplied - - self.isolated = isolated - self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment - - # For PEP 517, the directory where we request the project metadata - # gets stored. We need this to pass to build_wheel, so the backend - # can ensure that the wheel matches the metadata (see the PEP for - # details). - self.metadata_directory = None # type: Optional[str] - - # The static build requirements (from pyproject.toml) - self.pyproject_requires = None # type: Optional[List[str]] - - # Build requirements that we will check are available - self.requirements_to_check = [] # type: List[str] - - # The PEP 517 backend we should use to build the project - self.pep517_backend = None # type: Optional[Pep517HookCaller] - - # Are we using PEP 517 for this requirement? - # After pyproject.toml has been loaded, the only valid values are True - # and False. Before loading, None is valid (meaning "use the default"). - # Setting an explicit value before loading pyproject.toml is supported, - # but after loading this flag should be treated as read only. - self.use_pep517 = use_pep517 - - # This requirement needs more preparation before it can be built - self.needs_more_preparation = False - - def __str__(self): - # type: () -> str - if self.req: - s = str(self.req) - if self.link: - s += ' from {}'.format(redact_auth_from_url(self.link.url)) - elif self.link: - s = redact_auth_from_url(self.link.url) - else: - s = '' - if self.satisfied_by is not None: - s += ' in {}'.format(display_path(self.satisfied_by.location)) - if self.comes_from: - if isinstance(self.comes_from, str): - comes_from = self.comes_from # type: Optional[str] - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += f' (from {comes_from})' - return s - - def __repr__(self): - # type: () -> str - return '<{} object: {} editable={!r}>'.format( - self.__class__.__name__, str(self), self.editable) - - def format_debug(self): - # type: () -> str - """An un-tested helper for getting state, for debugging. - """ - attributes = vars(self) - names = sorted(attributes) - - state = ( - "{}={!r}".format(attr, attributes[attr]) for attr in sorted(names) - ) - return '<{name} object: {{{state}}}>'.format( - name=self.__class__.__name__, - state=", ".join(state), - ) - - # Things that are valid for all kinds of requirements? - @property - def name(self): - # type: () -> Optional[str] - if self.req is None: - return None - return pkg_resources.safe_name(self.req.name) - - @property - def specifier(self): - # type: () -> SpecifierSet - return self.req.specifier - - @property - def is_pinned(self): - # type: () -> bool - """Return whether I am pinned to an exact version. - - For example, some-package==1.2 is pinned; some-package>1.2 is not. - """ - specifiers = self.specifier - return (len(specifiers) == 1 and - next(iter(specifiers)).operator in {'==', '==='}) - - def match_markers(self, extras_requested=None): - # type: (Optional[Iterable[str]]) -> bool - if not extras_requested: - # Provide an extra to safely evaluate the markers - # without matching any extra - extras_requested = ('',) - if self.markers is not None: - return any( - self.markers.evaluate({'extra': extra}) - for extra in extras_requested) - else: - return True - - @property - def has_hash_options(self): - # type: () -> bool - """Return whether any known-good hashes are specified as options. - - These activate --require-hashes mode; hashes specified as part of a - URL do not. - - """ - return bool(self.hash_options) - - def hashes(self, trust_internet=True): - # type: (bool) -> Hashes - """Return a hash-comparer that considers my option- and URL-based - hashes to be known-good. - - Hashes in URLs--ones embedded in the requirements file, not ones - downloaded from an index server--are almost peers with ones from - flags. They satisfy --require-hashes (whether it was implicitly or - explicitly activated) but do not activate it. md5 and sha224 are not - allowed in flags, which should nudge people toward good algos. We - always OR all hashes together, even ones from URLs. - - :param trust_internet: Whether to trust URL-based (#md5=...) hashes - downloaded from the internet, as by populate_link() - - """ - good_hashes = self.hash_options.copy() - link = self.link if trust_internet else self.original_link - if link and link.hash: - good_hashes.setdefault(link.hash_name, []).append(link.hash) - return Hashes(good_hashes) - - def from_path(self): - # type: () -> Optional[str] - """Format a nice indicator to show where this "comes from" - """ - if self.req is None: - return None - s = str(self.req) - if self.comes_from: - if isinstance(self.comes_from, str): - comes_from = self.comes_from - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += '->' + comes_from - return s - - def ensure_build_location(self, build_dir, autodelete, parallel_builds): - # type: (str, bool, bool) -> str - assert build_dir is not None - if self._temp_build_dir is not None: - assert self._temp_build_dir.path - return self._temp_build_dir.path - if self.req is None: - # Some systems have /tmp as a symlink which confuses custom - # builds (such as numpy). Thus, we ensure that the real path - # is returned. - self._temp_build_dir = TempDirectory( - kind=tempdir_kinds.REQ_BUILD, globally_managed=True - ) - - return self._temp_build_dir.path - - # This is the only remaining place where we manually determine the path - # for the temporary directory. It is only needed for editables where - # it is the value of the --src option. - - # When parallel builds are enabled, add a UUID to the build directory - # name so multiple builds do not interfere with each other. - dir_name = canonicalize_name(self.name) # type: str - if parallel_builds: - dir_name = f"{dir_name}_{uuid.uuid4().hex}" - - # FIXME: Is there a better place to create the build_dir? (hg and bzr - # need this) - if not os.path.exists(build_dir): - logger.debug('Creating directory %s', build_dir) - os.makedirs(build_dir) - actual_build_dir = os.path.join(build_dir, dir_name) - # `None` indicates that we respect the globally-configured deletion - # settings, which is what we actually want when auto-deleting. - delete_arg = None if autodelete else False - return TempDirectory( - path=actual_build_dir, - delete=delete_arg, - kind=tempdir_kinds.REQ_BUILD, - globally_managed=True, - ).path - - def _set_requirement(self): - # type: () -> None - """Set requirement after generating metadata. - """ - assert self.req is None - assert self.metadata is not None - assert self.source_dir is not None - - # Construct a Requirement object from the generated metadata - if isinstance(parse_version(self.metadata["Version"]), Version): - op = "==" - else: - op = "===" - - self.req = Requirement( - "".join([ - self.metadata["Name"], - op, - self.metadata["Version"], - ]) - ) - - def warn_on_mismatching_name(self): - # type: () -> None - metadata_name = canonicalize_name(self.metadata["Name"]) - if canonicalize_name(self.req.name) == metadata_name: - # Everything is fine. - return - - # If we're here, there's a mismatch. Log a warning about it. - logger.warning( - 'Generating metadata for package %s ' - 'produced metadata for project name %s. Fix your ' - '#egg=%s fragments.', - self.name, metadata_name, self.name - ) - self.req = Requirement(metadata_name) - - def check_if_exists(self, use_user_site): - # type: (bool) -> None - """Find an installed distribution that satisfies or conflicts - with this requirement, and set self.satisfied_by or - self.should_reinstall appropriately. - """ - if self.req is None: - return - existing_dist = get_distribution(self.req.name) - if not existing_dist: - return - - # pkg_resouces may contain a different copy of packaging.version from - # pip in if the downstream distributor does a poor job debundling pip. - # We avoid existing_dist.parsed_version and let SpecifierSet.contains - # parses the version instead. - existing_version = existing_dist.version - version_compatible = ( - existing_version is not None and - self.req.specifier.contains(existing_version, prereleases=True) - ) - if not version_compatible: - self.satisfied_by = None - if use_user_site: - if dist_in_usersite(existing_dist): - self.should_reinstall = True - elif (running_under_virtualenv() and - dist_in_site_packages(existing_dist)): - raise InstallationError( - "Will not install to the user site because it will " - "lack sys.path precedence to {} in {}".format( - existing_dist.project_name, existing_dist.location) - ) - else: - self.should_reinstall = True - else: - if self.editable: - self.should_reinstall = True - # when installing editables, nothing pre-existing should ever - # satisfy - self.satisfied_by = None - else: - self.satisfied_by = existing_dist - - # Things valid for wheels - @property - def is_wheel(self): - # type: () -> bool - if not self.link: - return False - return self.link.is_wheel - - # Things valid for sdists - @property - def unpacked_source_directory(self): - # type: () -> str - return os.path.join( - self.source_dir, - self.link and self.link.subdirectory_fragment or '') - - @property - def setup_py_path(self): - # type: () -> str - assert self.source_dir, f"No source dir for {self}" - setup_py = os.path.join(self.unpacked_source_directory, 'setup.py') - - return setup_py - - @property - def pyproject_toml_path(self): - # type: () -> str - assert self.source_dir, f"No source dir for {self}" - return make_pyproject_path(self.unpacked_source_directory) - - def load_pyproject_toml(self): - # type: () -> None - """Load the pyproject.toml file. - - After calling this routine, all of the attributes related to PEP 517 - processing for this requirement have been set. In particular, the - use_pep517 attribute can be used to determine whether we should - follow the PEP 517 or legacy (setup.py) code path. - """ - pyproject_toml_data = load_pyproject_toml( - self.use_pep517, - self.pyproject_toml_path, - self.setup_py_path, - str(self) - ) - - if pyproject_toml_data is None: - self.use_pep517 = False - return - - self.use_pep517 = True - requires, backend, check, backend_path = pyproject_toml_data - self.requirements_to_check = check - self.pyproject_requires = requires - self.pep517_backend = Pep517HookCaller( - self.unpacked_source_directory, backend, backend_path=backend_path, - ) - - def _check_setup_py_or_cfg_exists(self) -> bool: - """Check if the requirement actually has a setuptools build file. - - If setup.py does not exist, we also check setup.cfg in the same - directory and allow the directory if that exists. - """ - if os.path.exists(self.setup_py_path): - return True - stem, ext = os.path.splitext(self.setup_py_path) - if ext == ".py" and os.path.exists(f"{stem}.cfg"): - return True - return False - - def _generate_metadata(self): - # type: () -> str - """Invokes metadata generator functions, with the required arguments. - """ - if not self.use_pep517: - assert self.unpacked_source_directory - - if not self._check_setup_py_or_cfg_exists(): - raise InstallationError( - f'File "setup.py" or "setup.cfg" not found for legacy ' - f'project {self}.' - ) - - return generate_metadata_legacy( - build_env=self.build_env, - setup_py_path=self.setup_py_path, - source_dir=self.unpacked_source_directory, - isolated=self.isolated, - details=self.name or f"from {self.link}" - ) - - assert self.pep517_backend is not None - - return generate_metadata( - build_env=self.build_env, - backend=self.pep517_backend, - ) - - def prepare_metadata(self): - # type: () -> None - """Ensure that project metadata is available. - - Under PEP 517, call the backend hook to prepare the metadata. - Under legacy processing, call setup.py egg-info. - """ - assert self.source_dir - - with indent_log(): - self.metadata_directory = self._generate_metadata() - - # Act on the newly generated metadata, based on the name and version. - if not self.name: - self._set_requirement() - else: - self.warn_on_mismatching_name() - - self.assert_source_matches_version() - - @property - def metadata(self): - # type: () -> Any - if not hasattr(self, '_metadata'): - self._metadata = get_metadata(self.get_dist()) - - return self._metadata - - def get_dist(self): - # type: () -> Distribution - return _get_dist(self.metadata_directory) - - def assert_source_matches_version(self): - # type: () -> None - assert self.source_dir - version = self.metadata['version'] - if self.req.specifier and version not in self.req.specifier: - logger.warning( - 'Requested %s, but installing version %s', - self, - version, - ) - else: - logger.debug( - 'Source in %s has version %s, which satisfies requirement %s', - display_path(self.source_dir), - version, - self, - ) - - # For both source distributions and editables - def ensure_has_source_dir( - self, - parent_dir, - autodelete=False, - parallel_builds=False, - ): - # type: (str, bool, bool) -> None - """Ensure that a source_dir is set. - - This will create a temporary build dir if the name of the requirement - isn't known yet. - - :param parent_dir: The ideal pip parent_dir for the source_dir. - Generally src_dir for editables and build_dir for sdists. - :return: self.source_dir - """ - if self.source_dir is None: - self.source_dir = self.ensure_build_location( - parent_dir, - autodelete=autodelete, - parallel_builds=parallel_builds, - ) - - # For editable installations - def update_editable(self): - # type: () -> None - if not self.link: - logger.debug( - "Cannot update repository at %s; repository location is " - "unknown", - self.source_dir, - ) - return - assert self.editable - assert self.source_dir - if self.link.scheme == 'file': - # Static paths don't get updated - return - vcs_backend = vcs.get_backend_for_scheme(self.link.scheme) - # Editable requirements are validated in Requirement constructors. - # So here, if it's neither a path nor a valid VCS URL, it's a bug. - assert vcs_backend, f"Unsupported VCS URL {self.link.url}" - hidden_url = hide_url(self.link.url) - vcs_backend.obtain(self.source_dir, url=hidden_url) - - # Top-level Actions - def uninstall(self, auto_confirm=False, verbose=False): - # type: (bool, bool) -> Optional[UninstallPathSet] - """ - Uninstall the distribution currently satisfying this requirement. - - Prompts before removing or modifying files unless - ``auto_confirm`` is True. - - Refuses to delete or modify files outside of ``sys.prefix`` - - thus uninstallation within a virtual environment can only - modify that virtual environment, even if the virtualenv is - linked to global site-packages. - - """ - assert self.req - dist = get_distribution(self.req.name) - if not dist: - logger.warning("Skipping %s as it is not installed.", self.name) - return None - logger.info('Found existing installation: %s', dist) - - uninstalled_pathset = UninstallPathSet.from_dist(dist) - uninstalled_pathset.remove(auto_confirm, verbose) - return uninstalled_pathset - - def _get_archive_name(self, path, parentdir, rootdir): - # type: (str, str, str) -> str - - def _clean_zip_name(name, prefix): - # type: (str, str) -> str - assert name.startswith(prefix + os.path.sep), ( - f"name {name!r} doesn't start with prefix {prefix!r}" - ) - name = name[len(prefix) + 1:] - name = name.replace(os.path.sep, '/') - return name - - path = os.path.join(parentdir, path) - name = _clean_zip_name(path, rootdir) - return self.name + '/' + name - - def archive(self, build_dir): - # type: (Optional[str]) -> None - """Saves archive to provided build_dir. - - Used for saving downloaded VCS requirements as part of `pip download`. - """ - assert self.source_dir - if build_dir is None: - return - - create_archive = True - archive_name = '{}-{}.zip'.format(self.name, self.metadata["version"]) - archive_path = os.path.join(build_dir, archive_name) - - if os.path.exists(archive_path): - response = ask_path_exists( - 'The file {} exists. (i)gnore, (w)ipe, ' - '(b)ackup, (a)bort '.format( - display_path(archive_path)), - ('i', 'w', 'b', 'a')) - if response == 'i': - create_archive = False - elif response == 'w': - logger.warning('Deleting %s', display_path(archive_path)) - os.remove(archive_path) - elif response == 'b': - dest_file = backup_dir(archive_path) - logger.warning( - 'Backing up %s to %s', - display_path(archive_path), - display_path(dest_file), - ) - shutil.move(archive_path, dest_file) - elif response == 'a': - sys.exit(-1) - - if not create_archive: - return - - zip_output = zipfile.ZipFile( - archive_path, 'w', zipfile.ZIP_DEFLATED, allowZip64=True, - ) - with zip_output: - dir = os.path.normcase( - os.path.abspath(self.unpacked_source_directory) - ) - for dirpath, dirnames, filenames in os.walk(dir): - for dirname in dirnames: - dir_arcname = self._get_archive_name( - dirname, parentdir=dirpath, rootdir=dir, - ) - zipdir = zipfile.ZipInfo(dir_arcname + '/') - zipdir.external_attr = 0x1ED << 16 # 0o755 - zip_output.writestr(zipdir, '') - for filename in filenames: - file_arcname = self._get_archive_name( - filename, parentdir=dirpath, rootdir=dir, - ) - filename = os.path.join(dirpath, filename) - zip_output.write(filename, file_arcname) - - logger.info('Saved %s', display_path(archive_path)) - - def install( - self, - install_options, # type: List[str] - global_options=None, # type: Optional[Sequence[str]] - root=None, # type: Optional[str] - home=None, # type: Optional[str] - prefix=None, # type: Optional[str] - warn_script_location=True, # type: bool - use_user_site=False, # type: bool - pycompile=True # type: bool - ): - # type: (...) -> None - scheme = get_scheme( - self.name, - user=use_user_site, - home=home, - root=root, - isolated=self.isolated, - prefix=prefix, - ) - - global_options = global_options if global_options is not None else [] - if self.editable: - install_editable_legacy( - install_options, - global_options, - prefix=prefix, - home=home, - use_user_site=use_user_site, - name=self.name, - setup_py_path=self.setup_py_path, - isolated=self.isolated, - build_env=self.build_env, - unpacked_source_directory=self.unpacked_source_directory, - ) - self.install_succeeded = True - return - - if self.is_wheel: - assert self.local_file_path - direct_url = None - if self.original_link: - direct_url = direct_url_from_link( - self.original_link, - self.source_dir, - self.original_link_is_in_wheel_cache, - ) - install_wheel( - self.name, - self.local_file_path, - scheme=scheme, - req_description=str(self.req), - pycompile=pycompile, - warn_script_location=warn_script_location, - direct_url=direct_url, - requested=self.user_supplied, - ) - self.install_succeeded = True - return - - # TODO: Why don't we do this for editable installs? - - # Extend the list of global and install options passed on to - # the setup.py call with the ones from the requirements file. - # Options specified in requirements file override those - # specified on the command line, since the last option given - # to setup.py is the one that is used. - global_options = list(global_options) + self.global_options - install_options = list(install_options) + self.install_options - - try: - success = install_legacy( - install_options=install_options, - global_options=global_options, - root=root, - home=home, - prefix=prefix, - use_user_site=use_user_site, - pycompile=pycompile, - scheme=scheme, - setup_py_path=self.setup_py_path, - isolated=self.isolated, - req_name=self.name, - build_env=self.build_env, - unpacked_source_directory=self.unpacked_source_directory, - req_description=str(self.req), - ) - except LegacyInstallFailure as exc: - self.install_succeeded = False - six.reraise(*exc.parent) - except Exception: - self.install_succeeded = True - raise - - self.install_succeeded = success - - if success and self.legacy_install_reason == 8368: - deprecated( - reason=( - "{} was installed using the legacy 'setup.py install' " - "method, because a wheel could not be built for it.". - format(self.name) - ), - replacement="to fix the wheel build issue reported above", - gone_in=None, - issue=8368, - ) - - -def check_invalid_constraint_type(req): - # type: (InstallRequirement) -> str - - # Check for unsupported forms - problem = "" - if not req.name: - problem = "Unnamed requirements are not allowed as constraints" - elif req.editable: - problem = "Editable requirements are not allowed as constraints" - elif req.extras: - problem = "Constraints cannot have extras" - - if problem: - deprecated( - reason=( - "Constraints are only allowed to take the form of a package " - "name and a version specifier. Other forms were originally " - "permitted as an accident of the implementation, but were " - "undocumented. The new implementation of the resolver no " - "longer supports these forms." - ), - replacement=( - "replacing the constraint with a requirement." - ), - # No plan yet for when the new resolver becomes default - gone_in=None, - issue=8210 - ) - - return problem diff --git a/venv/Lib/site-packages/pip/_internal/req/req_set.py b/venv/Lib/site-packages/pip/_internal/req/req_set.py deleted file mode 100644 index 59c5843..0000000 --- a/venv/Lib/site-packages/pip/_internal/req/req_set.py +++ /dev/null @@ -1,199 +0,0 @@ -import logging -from collections import OrderedDict -from typing import Dict, Iterable, List, Optional, Tuple - -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__) - - -class RequirementSet: - - def __init__(self, check_supported_wheels=True): - # type: (bool) -> None - """Create a RequirementSet. - """ - - self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] - self.check_supported_wheels = check_supported_wheels - - self.unnamed_requirements = [] # type: List[InstallRequirement] - - def __str__(self): - # type: () -> str - requirements = sorted( - (req for req in self.requirements.values() if not req.comes_from), - key=lambda req: canonicalize_name(req.name or ""), - ) - return ' '.join(str(req.req) for req in requirements) - - def __repr__(self): - # type: () -> str - requirements = sorted( - self.requirements.values(), - key=lambda req: canonicalize_name(req.name or ""), - ) - - format_string = '<{classname} object; {count} requirement(s): {reqs}>' - return format_string.format( - classname=self.__class__.__name__, - count=len(requirements), - reqs=', '.join(str(req.req) for req in requirements), - ) - - def add_unnamed_requirement(self, install_req): - # type: (InstallRequirement) -> None - assert not install_req.name - self.unnamed_requirements.append(install_req) - - def add_named_requirement(self, install_req): - # type: (InstallRequirement) -> None - assert install_req.name - - project_name = canonicalize_name(install_req.name) - self.requirements[project_name] = install_req - - def add_requirement( - self, - install_req, # type: InstallRequirement - parent_req_name=None, # type: Optional[str] - extras_requested=None # type: Optional[Iterable[str]] - ): - # type: (...) -> 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 = self.get_requirement( - install_req.name) # type: Optional[InstallRequirement] - 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): - # type: (str) -> bool - project_name = canonicalize_name(name) - - return ( - project_name in self.requirements and - not self.requirements[project_name].constraint - ) - - def get_requirement(self, name): - # type: (str) -> InstallRequirement - project_name = canonicalize_name(name) - - if project_name in self.requirements: - return self.requirements[project_name] - - raise KeyError(f"No project with the name {name!r}") - - @property - def all_requirements(self): - # type: () -> List[InstallRequirement] - return self.unnamed_requirements + list(self.requirements.values()) diff --git a/venv/Lib/site-packages/pip/_internal/req/req_tracker.py b/venv/Lib/site-packages/pip/_internal/req/req_tracker.py deleted file mode 100644 index 542e0d9..0000000 --- a/venv/Lib/site-packages/pip/_internal/req/req_tracker.py +++ /dev/null @@ -1,140 +0,0 @@ -import contextlib -import hashlib -import logging -import os -from types import TracebackType -from typing import Dict, Iterator, Optional, Set, Type, Union - -from pip._internal.models.link import Link -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -@contextlib.contextmanager -def update_env_context_manager(**changes): - # type: (str) -> Iterator[None] - target = os.environ - - # Save values from the target and change them. - non_existent_marker = object() - saved_values = {} # type: Dict[str, Union[object, str]] - for name, new_value in changes.items(): - try: - saved_values[name] = target[name] - except KeyError: - saved_values[name] = non_existent_marker - target[name] = new_value - - try: - yield - finally: - # Restore original values in the target. - for name, original_value in saved_values.items(): - if original_value is non_existent_marker: - del target[name] - else: - assert isinstance(original_value, str) # for mypy - target[name] = original_value - - -@contextlib.contextmanager -def get_requirement_tracker(): - # type: () -> Iterator[RequirementTracker] - root = os.environ.get('PIP_REQ_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)) - logger.debug("Initialized build tracking at %s", root) - - with RequirementTracker(root) as tracker: - yield tracker - - -class RequirementTracker: - - def __init__(self, root): - # type: (str) -> None - self._root = root - self._entries = set() # type: Set[InstallRequirement] - logger.debug("Created build tracker: %s", self._root) - - def __enter__(self): - # type: () -> RequirementTracker - logger.debug("Entered build tracker: %s", self._root) - return self - - def __exit__( - self, - exc_type, # type: Optional[Type[BaseException]] - exc_val, # type: Optional[BaseException] - exc_tb # type: Optional[TracebackType] - ): - # type: (...) -> None - self.cleanup() - - def _entry_path(self, link): - # type: (Link) -> str - hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() - return os.path.join(self._root, hashed) - - def add(self, req): - # type: (InstallRequirement) -> None - """Add an InstallRequirement to build tracking. - """ - - assert req.link - # Get the file to write information about this requirement. - entry_path = self._entry_path(req.link) - - # Try reading from the file. If it exists and can be read from, a build - # is already in progress, so a LookupError is raised. - try: - with open(entry_path) as fp: - contents = fp.read() - except FileNotFoundError: - pass - else: - message = '{} is already being built: {}'.format( - req.link, contents) - raise LookupError(message) - - # If we're here, req should really not be building already. - assert req not in self._entries - - # Start tracking this requirement. - with open(entry_path, 'w', encoding="utf-8") as fp: - fp.write(str(req)) - self._entries.add(req) - - logger.debug('Added %s to build tracker %r', req, self._root) - - def remove(self, req): - # type: (InstallRequirement) -> None - """Remove an InstallRequirement from build tracking. - """ - - assert req.link - # Delete the created file and the corresponding entries. - os.unlink(self._entry_path(req.link)) - self._entries.remove(req) - - logger.debug('Removed %s from build tracker %r', req, self._root) - - def cleanup(self): - # type: () -> None - for req in set(self._entries): - self.remove(req) - - logger.debug("Removed build tracker: %r", self._root) - - @contextlib.contextmanager - def track(self, req): - # type: (InstallRequirement) -> Iterator[None] - self.add(req) - yield - self.remove(req) diff --git a/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py b/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py deleted file mode 100644 index b722341..0000000 --- a/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +++ /dev/null @@ -1,640 +0,0 @@ -import csv -import functools -import logging -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 pip._vendor import pkg_resources -from pip._vendor.pkg_resources import Distribution - -from pip._internal.exceptions import UninstallationError -from pip._internal.locations import get_bin_prefix, get_bin_user -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - ask, - dist_in_usersite, - dist_is_local, - egg_link_path, - is_local, - normalize_path, - renames, - rmtree, -) -from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory - -logger = logging.getLogger(__name__) - - -def _script_names(dist, script_name, is_gui): - # type: (Distribution, str, bool) -> List[str] - """Create the fully qualified name of the files created by - {console,gui}_scripts for the given ``dist``. - Returns the list of file names - """ - if dist_in_usersite(dist): - bin_dir = get_bin_user() - else: - bin_dir = get_bin_prefix() - exe_name = os.path.join(bin_dir, script_name) - paths_to_remove = [exe_name] - if WINDOWS: - paths_to_remove.append(exe_name + '.exe') - paths_to_remove.append(exe_name + '.exe.manifest') - if is_gui: - paths_to_remove.append(exe_name + '-script.pyw') - else: - paths_to_remove.append(exe_name + '-script.py') - return paths_to_remove - - -def _unique(fn): - # type: (Callable[..., Iterator[Any]]) -> Callable[..., Iterator[Any]] - @functools.wraps(fn) - def unique(*args, **kw): - # type: (Any, Any) -> Iterator[Any] - seen = set() # type: Set[Any] - for item in fn(*args, **kw): - if item not in seen: - seen.add(item) - yield item - return unique - - -@_unique -def uninstallation_paths(dist): - # type: (Distribution) -> Iterator[str] - """ - Yield all the uninstallation paths for dist based on RECORD-without-.py[co] - - Yield paths to all the files in RECORD. For each .py file in RECORD, add - the .pyc and .pyo in the same directory. - - UninstallPathSet.add() takes care of the __pycache__ .py[co]. - """ - r = csv.reader(dist.get_metadata_lines('RECORD')) - for row in r: - path = os.path.join(dist.location, row[0]) - yield path - if path.endswith('.py'): - dn, fn = os.path.split(path) - base = fn[:-3] - path = os.path.join(dn, base + '.pyc') - yield path - path = os.path.join(dn, base + '.pyo') - yield path - - -def compact(paths): - # type: (Iterable[str]) -> Set[str] - """Compact a path set to contain the minimal number of paths - necessary to contain all paths in the set. If /a/path/ and - /a/path/to/a/file.txt are both in the set, leave only the - shorter path.""" - - sep = os.path.sep - short_paths = set() # type: Set[str] - for path in sorted(paths, key=len): - should_skip = any( - path.startswith(shortpath.rstrip("*")) and - path[len(shortpath.rstrip("*").rstrip(sep))] == sep - for shortpath in short_paths - ) - if not should_skip: - short_paths.add(path) - return short_paths - - -def compress_for_rename(paths): - # type: (Iterable[str]) -> Set[str] - """Returns a set containing the paths that need to be renamed. - - This set may include directories when the original sequence of paths - included every file on disk. - """ - case_map = {os.path.normcase(p): p for p in paths} - remaining = set(case_map) - unchecked = sorted({os.path.split(p)[0] for p in case_map.values()}, key=len) - wildcards = set() # type: Set[str] - - def norm_join(*a): - # type: (str) -> str - return os.path.normcase(os.path.join(*a)) - - for root in unchecked: - if any(os.path.normcase(root).startswith(w) - for w in wildcards): - # This directory has already been handled. - continue - - all_files = set() # type: Set[str] - all_subdirs = set() # type: Set[str] - for dirname, subdirs, files in os.walk(root): - all_subdirs.update(norm_join(root, dirname, d) - for d in subdirs) - all_files.update(norm_join(root, dirname, f) - for f in files) - # If all the files we found are in our remaining set of files to - # remove, then remove them from the latter set and add a wildcard - # for the directory. - if not (all_files - remaining): - remaining.difference_update(all_files) - wildcards.add(root + os.sep) - - return set(map(case_map.__getitem__, remaining)) | wildcards - - -def compress_for_output_listing(paths): - # type: (Iterable[str]) -> Tuple[Set[str], Set[str]] - """Returns a tuple of 2 sets of which paths to display to user - - The first set contains paths that would be deleted. Files of a package - are not added and the top-level directory of the package has a '*' added - at the end - to signify that all it's contents are removed. - - The second set contains files that would have been skipped in the above - folders. - """ - - will_remove = set(paths) - will_skip = set() - - # Determine folders and files - folders = set() - files = set() - for path in will_remove: - if path.endswith(".pyc"): - continue - if path.endswith("__init__.py") or ".dist-info" in path: - folders.add(os.path.dirname(path)) - files.add(path) - - # probably this one https://github.com/python/mypy/issues/390 - _normcased_files = set(map(os.path.normcase, files)) # type: ignore - - folders = compact(folders) - - # This walks the tree using os.walk to not miss extra folders - # that might get added. - for folder in folders: - for dirpath, _, dirfiles in os.walk(folder): - for fname in dirfiles: - if fname.endswith(".pyc"): - continue - - file_ = os.path.join(dirpath, fname) - if (os.path.isfile(file_) and - os.path.normcase(file_) not in _normcased_files): - # We are skipping this file. Add it to the set. - will_skip.add(file_) - - will_remove = files | { - os.path.join(folder, "*") for folder in folders - } - - return will_remove, will_skip - - -class StashedUninstallPathSet: - """A set of file rename operations to stash files while - tentatively uninstalling them.""" - def __init__(self): - # type: () -> None - # Mapping from source file root to [Adjacent]TempDirectory - # for files under that directory. - self._save_dirs = {} # type: Dict[str, TempDirectory] - # (old path, new path) tuples for each move that may need - # to be undone. - self._moves = [] # type: List[Tuple[str, str]] - - def _get_directory_stash(self, path): - # type: (str) -> str - """Stashes a directory. - - Directories are stashed adjacent to their original location if - possible, or else moved/copied into the user's temp dir.""" - - try: - save_dir = AdjacentTempDirectory(path) # type: TempDirectory - except OSError: - save_dir = TempDirectory(kind="uninstall") - self._save_dirs[os.path.normcase(path)] = save_dir - - return save_dir.path - - def _get_file_stash(self, path): - # type: (str) -> str - """Stashes a file. - - If no root has been provided, one will be created for the directory - in the user's temp directory.""" - path = os.path.normcase(path) - head, old_head = os.path.dirname(path), None - save_dir = None - - while head != old_head: - try: - save_dir = self._save_dirs[head] - break - except KeyError: - pass - head, old_head = os.path.dirname(head), head - else: - # Did not find any suitable root - head = os.path.dirname(path) - save_dir = TempDirectory(kind='uninstall') - self._save_dirs[head] = save_dir - - relpath = os.path.relpath(path, head) - if relpath and relpath != os.path.curdir: - return os.path.join(save_dir.path, relpath) - return save_dir.path - - def stash(self, path): - # type: (str) -> str - """Stashes the directory or file and returns its new location. - Handle symlinks as files to avoid modifying the symlink targets. - """ - path_is_dir = os.path.isdir(path) and not os.path.islink(path) - if path_is_dir: - new_path = self._get_directory_stash(path) - else: - new_path = self._get_file_stash(path) - - self._moves.append((path, new_path)) - if (path_is_dir and os.path.isdir(new_path)): - # If we're moving a directory, we need to - # remove the destination first or else it will be - # moved to inside the existing directory. - # We just created new_path ourselves, so it will - # be removable. - os.rmdir(new_path) - renames(path, new_path) - return new_path - - def commit(self): - # type: () -> None - """Commits the uninstall by removing stashed files.""" - for _, save_dir in self._save_dirs.items(): - save_dir.cleanup() - self._moves = [] - self._save_dirs = {} - - def rollback(self): - # type: () -> None - """Undoes the uninstall by moving stashed files back.""" - for p in self._moves: - logger.info("Moving to %s\n from %s", *p) - - for new_path, path in self._moves: - try: - logger.debug('Replacing %s from %s', new_path, path) - if os.path.isfile(new_path) or os.path.islink(new_path): - os.unlink(new_path) - elif os.path.isdir(new_path): - rmtree(new_path) - renames(path, new_path) - except OSError as ex: - logger.error("Failed to restore %s", new_path) - logger.debug("Exception: %s", ex) - - self.commit() - - @property - def can_rollback(self): - # type: () -> bool - return bool(self._moves) - - -class UninstallPathSet: - """A set of file paths to be removed in the uninstallation of a - requirement.""" - def __init__(self, dist): - # type: (Distribution) -> None - self.paths = set() # type: Set[str] - self._refuse = set() # type: Set[str] - self.pth = {} # type: Dict[str, UninstallPthEntries] - self.dist = dist - self._moved_paths = StashedUninstallPathSet() - - def _permitted(self, path): - # type: (str) -> bool - """ - Return True if the given path is one we are permitted to - remove/modify, False otherwise. - - """ - return is_local(path) - - def add(self, path): - # type: (str) -> None - head, tail = os.path.split(path) - - # we normalize the head to resolve parent directory symlinks, but not - # the tail, since we only want to uninstall symlinks, not their targets - path = os.path.join(normalize_path(head), os.path.normcase(tail)) - - if not os.path.exists(path): - return - if self._permitted(path): - self.paths.add(path) - else: - self._refuse.add(path) - - # __pycache__ files can show up after 'installed-files.txt' is created, - # due to imports - if os.path.splitext(path)[1] == '.py': - self.add(cache_from_source(path)) - - def add_pth(self, pth_file, entry): - # type: (str, str) -> None - pth_file = normalize_path(pth_file) - if self._permitted(pth_file): - if pth_file not in self.pth: - self.pth[pth_file] = UninstallPthEntries(pth_file) - self.pth[pth_file].add(entry) - else: - self._refuse.add(pth_file) - - def remove(self, auto_confirm=False, verbose=False): - # type: (bool, bool) -> None - """Remove paths in ``self.paths`` with confirmation (unless - ``auto_confirm`` is True).""" - - if not self.paths: - logger.info( - "Can't uninstall '%s'. No files were found to uninstall.", - self.dist.project_name, - ) - return - - dist_name_version = ( - self.dist.project_name + "-" + self.dist.version - ) - logger.info('Uninstalling %s:', dist_name_version) - - with indent_log(): - if auto_confirm or self._allowed_to_proceed(verbose): - moved = self._moved_paths - - for_rename = compress_for_rename(self.paths) - - for path in sorted(compact(for_rename)): - moved.stash(path) - logger.debug('Removing file or directory %s', path) - - for pth in self.pth.values(): - pth.remove() - - logger.info('Successfully uninstalled %s', dist_name_version) - - def _allowed_to_proceed(self, verbose): - # type: (bool) -> bool - """Display which files would be deleted and prompt for confirmation - """ - - def _display(msg, paths): - # type: (str, Iterable[str]) -> None - if not paths: - return - - logger.info(msg) - with indent_log(): - for path in sorted(compact(paths)): - logger.info(path) - - if not verbose: - will_remove, will_skip = compress_for_output_listing(self.paths) - else: - # In verbose mode, display all the files that are going to be - # deleted. - will_remove = set(self.paths) - will_skip = set() - - _display('Would remove:', will_remove) - _display('Would not remove (might be manually added):', will_skip) - _display('Would not remove (outside of prefix):', self._refuse) - if verbose: - _display('Will actually move:', compress_for_rename(self.paths)) - - return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' - - def rollback(self): - # type: () -> None - """Rollback the changes previously made by remove().""" - if not self._moved_paths.can_rollback: - logger.error( - "Can't roll back %s; was not uninstalled", - self.dist.project_name, - ) - return - logger.info('Rolling back uninstall of %s', self.dist.project_name) - self._moved_paths.rollback() - for pth in self.pth.values(): - pth.rollback() - - def commit(self): - # type: () -> None - """Remove temporary save dir: rollback will no longer be possible.""" - self._moved_paths.commit() - - @classmethod - def from_dist(cls, dist): - # type: (Distribution) -> UninstallPathSet - dist_path = normalize_path(dist.location) - if not dist_is_local(dist): - logger.info( - "Not uninstalling %s at %s, outside environment %s", - dist.key, - dist_path, - sys.prefix, - ) - return cls(dist) - - if dist_path in {p for p in {sysconfig.get_path("stdlib"), - sysconfig.get_path("platstdlib")} - if p}: - logger.info( - "Not uninstalling %s at %s, as it is in the standard library.", - dist.key, - dist_path, - ) - return cls(dist) - - paths_to_remove = cls(dist) - develop_egg_link = egg_link_path(dist) - develop_egg_link_egg_info = '{}.egg-info'.format( - pkg_resources.to_filename(dist.project_name)) - egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) - # Special case for distutils installed package - distutils_egg_info = getattr(dist._provider, 'path', None) - - # Uninstall cases order do matter as in the case of 2 installs of the - # same package, pip needs to uninstall the currently detected version - if (egg_info_exists and dist.egg_info.endswith('.egg-info') and - not dist.egg_info.endswith(develop_egg_link_egg_info)): - # if dist.egg_info.endswith(develop_egg_link_egg_info), we - # are in fact in the develop_egg_link case - paths_to_remove.add(dist.egg_info) - if dist.has_metadata('installed-files.txt'): - for installed_file in dist.get_metadata( - 'installed-files.txt').splitlines(): - path = os.path.normpath( - os.path.join(dist.egg_info, installed_file) - ) - paths_to_remove.add(path) - # FIXME: need a test for this elif block - # occurs with --single-version-externally-managed/--record outside - # of pip - elif dist.has_metadata('top_level.txt'): - if dist.has_metadata('namespace_packages.txt'): - namespaces = dist.get_metadata('namespace_packages.txt') - else: - namespaces = [] - for top_level_pkg in [ - p for p - in dist.get_metadata('top_level.txt').splitlines() - if p and p not in namespaces]: - path = os.path.join(dist.location, top_level_pkg) - paths_to_remove.add(path) - paths_to_remove.add(path + '.py') - paths_to_remove.add(path + '.pyc') - paths_to_remove.add(path + '.pyo') - - elif distutils_egg_info: - raise UninstallationError( - "Cannot uninstall {!r}. It is a distutils installed project " - "and thus we cannot accurately determine which files belong " - "to it which would lead to only a partial uninstall.".format( - dist.project_name, - ) - ) - - elif dist.location.endswith('.egg'): - # package installed by easy_install - # We cannot match on dist.egg_name because it can slightly vary - # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg - paths_to_remove.add(dist.location) - easy_install_egg = os.path.split(dist.location)[1] - easy_install_pth = os.path.join(os.path.dirname(dist.location), - 'easy-install.pth') - paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) - - elif egg_info_exists and dist.egg_info.endswith('.dist-info'): - for path in uninstallation_paths(dist): - paths_to_remove.add(path) - - elif develop_egg_link: - # develop egg - with open(develop_egg_link) as fh: - link_pointer = os.path.normcase(fh.readline().strip()) - assert (link_pointer == dist.location), ( - 'Egg-link {} does not match installed location of {} ' - '(at {})'.format( - link_pointer, dist.project_name, dist.location) - ) - paths_to_remove.add(develop_egg_link) - easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), - 'easy-install.pth') - paths_to_remove.add_pth(easy_install_pth, dist.location) - - else: - logger.debug( - 'Not sure how to uninstall: %s - Check: %s', - dist, dist.location, - ) - - # find distutils scripts= scripts - if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): - for script in dist.metadata_listdir('scripts'): - if dist_in_usersite(dist): - bin_dir = get_bin_user() - else: - bin_dir = get_bin_prefix() - paths_to_remove.add(os.path.join(bin_dir, script)) - if WINDOWS: - paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') - - # find console_scripts - _scripts_to_remove = [] - console_scripts = dist.get_entry_map(group='console_scripts') - for name in console_scripts.keys(): - _scripts_to_remove.extend(_script_names(dist, name, False)) - # find gui_scripts - gui_scripts = dist.get_entry_map(group='gui_scripts') - for name in gui_scripts.keys(): - _scripts_to_remove.extend(_script_names(dist, name, True)) - - for s in _scripts_to_remove: - paths_to_remove.add(s) - - return paths_to_remove - - -class UninstallPthEntries: - def __init__(self, pth_file): - # type: (str) -> None - self.file = pth_file - self.entries = set() # type: Set[str] - self._saved_lines = None # type: Optional[List[bytes]] - - def add(self, entry): - # type: (str) -> None - entry = os.path.normcase(entry) - # On Windows, os.path.normcase converts the entry to use - # backslashes. This is correct for entries that describe absolute - # paths outside of site-packages, but all the others use forward - # slashes. - # os.path.splitdrive is used instead of os.path.isabs because isabs - # treats non-absolute paths with drive letter markings like c:foo\bar - # as absolute paths. It also does not recognize UNC paths if they don't - # have more than "\\sever\share". Valid examples: "\\server\share\" or - # "\\server\share\folder". - if WINDOWS and not os.path.splitdrive(entry)[0]: - entry = entry.replace('\\', '/') - self.entries.add(entry) - - def remove(self): - # type: () -> None - logger.debug('Removing pth entries from %s:', self.file) - - # If the file doesn't exist, log a warning and return - if not os.path.isfile(self.file): - logger.warning( - "Cannot remove entries from nonexistent file %s", self.file - ) - return - with open(self.file, 'rb') as fh: - # windows uses '\r\n' with py3k, but uses '\n' with py2.x - lines = fh.readlines() - self._saved_lines = lines - if any(b'\r\n' in line for line in lines): - endline = '\r\n' - else: - endline = '\n' - # handle missing trailing newline - if lines and not lines[-1].endswith(endline.encode("utf-8")): - lines[-1] = lines[-1] + endline.encode("utf-8") - for entry in self.entries: - try: - logger.debug('Removing entry: %s', entry) - lines.remove((entry + endline).encode("utf-8")) - except ValueError: - pass - with open(self.file, 'wb') as fh: - fh.writelines(lines) - - def rollback(self): - # type: () -> bool - if self._saved_lines is None: - logger.error( - 'Cannot roll back changes to %s, none were made', self.file - ) - return False - logger.debug('Rolling %s back to previous state', self.file) - with open(self.file, 'wb') as fh: - fh.writelines(self._saved_lines) - return True diff --git a/venv/Lib/site-packages/pip/_internal/resolution/__init__.py b/venv/Lib/site-packages/pip/_internal/resolution/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index d9be7ff2dfede6933a95935daed6757939ea7c30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmYk0JqiLb5QVc~A;O-)+CmQ?A~v?$*bao~4%xx{3`urjkK~nXJ%XK;lS&`F?=fFB zrfpYB!ftKqzAFCH$Z?Y9g`ig#wQ0JCN>%^x8P0p?aY7dvI7OR`_Y^GfT!t95r2^J? z)S1lmAR}<-x~(ba<>Eyrt?3 D)VwzA diff --git a/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc deleted file mode 100644 index c7910c7bbbf99622732e71455a0200b5fa95e8df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 938 zcmZ`%!D8$|h}Eq(h$AQ9CZiQhvp1@++AhghN^})vR6vCYUzG(!04fH7`APQ+jp^P-@Mihxj zOiI55g03FN>HEsV33z8$fODpJXPis&Lvqi`1aU3C(XLZ*D`&SdKAO33-1c^W1?C9R zVV=a)gFP>{(7B)y7C!FHFJOMD{j%>J1~B@|1%UOp0;ja~r#X6E8d!mKec7X{v1;3< ztIPf>T)0lxO(^TC1?~H44&@5ERcV{E(l-HKQt7g)!Iyp0m%8Z!U{~1^na?sbt}D-o z-a&sACqr!oOvJN5LVbO_$^GE>zw7f> z!Zti)#h|o91NeY?cSv6Rh2;MESw4!H)*Wl15j}9`SIg3QuW}EswB{Y{f-LqhGPHz8J1zhI}#tT jc=GRO{2AS RequirementSet - raise NotImplementedError() - - def get_installation_order(self, req_set): - # type: (RequirementSet) -> List[InstallRequirement] - raise NotImplementedError() diff --git a/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py b/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py b/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py deleted file mode 100644 index 17de7f0..0000000 --- a/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +++ /dev/null @@ -1,462 +0,0 @@ -"""Dependency Resolution - -The dependency resolution in pip is performed as follows: - -for top-level requirements: - a. only one spec allowed per project, regardless of conflicts or not. - otherwise a "double requirement" exception is raised - b. they override sub-dependency requirements. -for sub-dependencies - a. "first found, wins" (where the order is breadth first) -""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import logging -import sys -from collections import defaultdict -from itertools import chain -from typing import DefaultDict, Iterable, List, Optional, Set, Tuple - -from pip._vendor.packaging import specifiers -from pip._vendor.pkg_resources import Distribution - -from pip._internal.cache import WheelCache -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, - DistributionNotFound, - HashError, - HashErrors, - UnsupportedPythonVersion, -) -from pip._internal.index.package_finder import PackageFinder -from pip._internal.models.link import Link -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.req_install import ( - InstallRequirement, - check_invalid_constraint_type, -) -from pip._internal.req.req_set import RequirementSet -from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider -from pip._internal.utils.compatibility_tags import get_supported -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import dist_in_usersite, normalize_version_info -from pip._internal.utils.packaging import check_requires_python, get_requires_python - -logger = logging.getLogger(__name__) - -DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]] - - -def _check_dist_requires_python( - dist, # type: Distribution - version_info, # type: Tuple[int, int, int] - ignore_requires_python=False, # type: bool -): - # type: (...) -> None - """ - Check whether the given Python version is compatible with a distribution's - "Requires-Python" value. - - :param version_info: A 3-tuple of ints representing the Python - major-minor-micro version to check. - :param ignore_requires_python: Whether to ignore the "Requires-Python" - value if the given Python version isn't compatible. - - :raises UnsupportedPythonVersion: When the given Python version isn't - compatible. - """ - requires_python = get_requires_python(dist) - try: - is_compatible = check_requires_python( - requires_python, version_info=version_info - ) - except specifiers.InvalidSpecifier as exc: - logger.warning( - "Package %r has an invalid Requires-Python: %s", dist.project_name, exc - ) - return - - if is_compatible: - return - - version = ".".join(map(str, version_info)) - if ignore_requires_python: - logger.debug( - "Ignoring failed Requires-Python check for package %r: " "%s not in %r", - dist.project_name, - version, - requires_python, - ) - return - - raise UnsupportedPythonVersion( - "Package {!r} requires a different Python: {} not in {!r}".format( - dist.project_name, version, requires_python - ) - ) - - -class Resolver(BaseResolver): - """Resolves which packages need to be installed/uninstalled to perform \ - the requested operation without breaking the requirements of any package. - """ - - _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} - - def __init__( - self, - preparer, # type: RequirementPreparer - finder, # type: PackageFinder - wheel_cache, # type: Optional[WheelCache] - make_install_req, # type: InstallRequirementProvider - use_user_site, # type: bool - ignore_dependencies, # type: bool - ignore_installed, # type: bool - ignore_requires_python, # type: bool - force_reinstall, # type: bool - upgrade_strategy, # type: str - py_version_info=None, # type: Optional[Tuple[int, ...]] - ): - # type: (...) -> None - super().__init__() - assert upgrade_strategy in self._allowed_strategies - - if py_version_info is None: - py_version_info = sys.version_info[:3] - else: - py_version_info = normalize_version_info(py_version_info) - - self._py_version_info = py_version_info - - self.preparer = preparer - self.finder = finder - self.wheel_cache = wheel_cache - - self.upgrade_strategy = upgrade_strategy - self.force_reinstall = force_reinstall - self.ignore_dependencies = ignore_dependencies - self.ignore_installed = ignore_installed - self.ignore_requires_python = ignore_requires_python - self.use_user_site = use_user_site - self._make_install_req = make_install_req - - self._discovered_dependencies = defaultdict( - list - ) # type: DiscoveredDependencies - - def resolve(self, root_reqs, check_supported_wheels): - # type: (List[InstallRequirement], bool) -> RequirementSet - """Resolve what operations need to be done - - As a side-effect of this method, the packages (and their dependencies) - are downloaded, unpacked and prepared for installation. This - preparation is done by ``pip.operations.prepare``. - - Once PyPI has static dependency metadata available, it would be - possible to move the preparation to become a step separated from - dependency resolution. - """ - requirement_set = RequirementSet(check_supported_wheels=check_supported_wheels) - for req in root_reqs: - if req.constraint: - check_invalid_constraint_type(req) - requirement_set.add_requirement(req) - - # Actually prepare the files, and collect any exceptions. Most hash - # exceptions cannot be checked ahead of time, because - # _populate_link() needs to be called before we can make decisions - # based on link type. - discovered_reqs = [] # type: List[InstallRequirement] - hash_errors = HashErrors() - for req in chain(requirement_set.all_requirements, discovered_reqs): - try: - discovered_reqs.extend(self._resolve_one(requirement_set, req)) - except HashError as exc: - exc.req = req - hash_errors.append(exc) - - if hash_errors: - raise hash_errors - - return requirement_set - - def _is_upgrade_allowed(self, req): - # type: (InstallRequirement) -> bool - if self.upgrade_strategy == "to-satisfy-only": - return False - elif self.upgrade_strategy == "eager": - return True - else: - assert self.upgrade_strategy == "only-if-needed" - return req.user_supplied or req.constraint - - def _set_req_to_reinstall(self, req): - # type: (InstallRequirement) -> None - """ - Set a requirement to be installed. - """ - # Don't uninstall the conflict if doing a user install and the - # conflict is not a user install. - if not self.use_user_site or dist_in_usersite(req.satisfied_by): - req.should_reinstall = True - req.satisfied_by = None - - def _check_skip_installed(self, req_to_install): - # type: (InstallRequirement) -> Optional[str] - """Check if req_to_install should be skipped. - - This will check if the req is installed, and whether we should upgrade - or reinstall it, taking into account all the relevant user options. - - After calling this req_to_install will only have satisfied_by set to - None if the req_to_install is to be upgraded/reinstalled etc. Any - other value will be a dist recording the current thing installed that - satisfies the requirement. - - Note that for vcs urls and the like we can't assess skipping in this - routine - we simply identify that we need to pull the thing down, - then later on it is pulled down and introspected to assess upgrade/ - reinstalls etc. - - :return: A text reason for why it was skipped, or None. - """ - if self.ignore_installed: - return None - - req_to_install.check_if_exists(self.use_user_site) - if not req_to_install.satisfied_by: - return None - - if self.force_reinstall: - self._set_req_to_reinstall(req_to_install) - return None - - if not self._is_upgrade_allowed(req_to_install): - if self.upgrade_strategy == "only-if-needed": - return "already satisfied, skipping upgrade" - return "already satisfied" - - # Check for the possibility of an upgrade. For link-based - # requirements we have to pull the tree down and inspect to assess - # the version #, so it's handled way down. - if not req_to_install.link: - try: - self.finder.find_requirement(req_to_install, upgrade=True) - except BestVersionAlreadyInstalled: - # Then the best version is installed. - return "already up-to-date" - except DistributionNotFound: - # No distribution found, so we squash the error. It will - # be raised later when we re-try later to do the install. - # Why don't we just raise here? - pass - - self._set_req_to_reinstall(req_to_install) - return None - - def _find_requirement_link(self, req): - # type: (InstallRequirement) -> Optional[Link] - upgrade = self._is_upgrade_allowed(req) - best_candidate = self.finder.find_requirement(req, upgrade) - if not best_candidate: - return None - - # Log a warning per PEP 592 if necessary before returning. - link = best_candidate.link - if link.is_yanked: - reason = link.yanked_reason or "" - msg = ( - # Mark this as a unicode string to prevent - # "UnicodeEncodeError: 'ascii' codec can't encode character" - # in Python 2 when the reason contains non-ascii characters. - "The candidate selected for download or install is a " - "yanked version: {candidate}\n" - "Reason for being yanked: {reason}" - ).format(candidate=best_candidate, reason=reason) - logger.warning(msg) - - return link - - def _populate_link(self, req): - # type: (InstallRequirement) -> None - """Ensure that if a link can be found for this, that it is found. - - Note that req.link may still be None - if the requirement is already - installed and not needed to be upgraded based on the return value of - _is_upgrade_allowed(). - - If preparer.require_hashes is True, don't use the wheel cache, because - cached wheels, always built locally, have different hashes than the - files downloaded from the index server and thus throw false hash - mismatches. Furthermore, cached wheels at present have undeterministic - contents due to file modification times. - """ - if req.link is None: - req.link = self._find_requirement_link(req) - - if self.wheel_cache is None or self.preparer.require_hashes: - return - cache_entry = self.wheel_cache.get_cache_entry( - link=req.link, - package_name=req.name, - supported_tags=get_supported(), - ) - if cache_entry is not None: - 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 - req.link = cache_entry.link - - def _get_dist_for(self, req): - # type: (InstallRequirement) -> Distribution - """Takes a InstallRequirement and returns a single AbstractDist \ - representing a prepared variant of the same. - """ - if req.editable: - return self.preparer.prepare_editable_requirement(req) - - # satisfied_by is only evaluated by calling _check_skip_installed, - # so it must be None here. - assert req.satisfied_by is None - skip_reason = self._check_skip_installed(req) - - if req.satisfied_by: - return self.preparer.prepare_installed_requirement(req, skip_reason) - - # We eagerly populate the link, since that's our "legacy" behavior. - self._populate_link(req) - dist = self.preparer.prepare_linked_requirement(req) - - # NOTE - # The following portion is for determining if a certain package is - # going to be re-installed/upgraded or not and reporting to the user. - # This should probably get cleaned up in a future refactor. - - # req.req is only avail after unpack for URL - # pkgs repeat check_if_exists to uninstall-on-upgrade - # (#14) - if not self.ignore_installed: - req.check_if_exists(self.use_user_site) - - if req.satisfied_by: - should_modify = ( - self.upgrade_strategy != "to-satisfy-only" - or self.force_reinstall - or self.ignore_installed - or req.link.scheme == "file" - ) - if should_modify: - self._set_req_to_reinstall(req) - else: - logger.info( - "Requirement already satisfied (use --upgrade to upgrade):" " %s", - req, - ) - return dist - - def _resolve_one( - self, - requirement_set, # type: RequirementSet - req_to_install, # type: InstallRequirement - ): - # type: (...) -> List[InstallRequirement] - """Prepare a single requirements file. - - :return: A list of additional InstallRequirements to also install. - """ - # Tell user what we are doing for this requirement: - # obtain (editable), skipping, processing (local url), collecting - # (remote url or package name) - if req_to_install.constraint or req_to_install.prepared: - return [] - - req_to_install.prepared = True - - # Parse and return dependencies - dist = self._get_dist_for(req_to_install) - # This will raise UnsupportedPythonVersion if the given Python - # version isn't compatible with the distribution's Requires-Python. - _check_dist_requires_python( - dist, - version_info=self._py_version_info, - ignore_requires_python=self.ignore_requires_python, - ) - - more_reqs = [] # type: List[InstallRequirement] - - def add_req(subreq, extras_requested): - # type: (Distribution, Iterable[str]) -> None - 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( - sub_install_req, - parent_req_name=parent_req_name, - extras_requested=extras_requested, - ) - if parent_req_name and add_to_parent: - self._discovered_dependencies[parent_req_name].append(add_to_parent) - more_reqs.extend(to_scan_again) - - with indent_log(): - # We add req_to_install before its dependencies, so that we - # can refer to it when adding dependencies. - if not requirement_set.has_requirement(req_to_install.name): - # 'unnamed' requirements will get added here - # '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) - - if not self.ignore_dependencies: - if req_to_install.extras: - logger.debug( - "Installing extra requirements: %r", - ",".join(req_to_install.extras), - ) - missing_requested = sorted( - set(req_to_install.extras) - set(dist.extras) - ) - for missing in missing_requested: - logger.warning("%s does not provide the extra '%s'", dist, missing) - - available_requested = sorted( - set(dist.extras) & set(req_to_install.extras) - ) - for subreq in dist.requires(available_requested): - add_req(subreq, extras_requested=available_requested) - - return more_reqs - - def get_installation_order(self, req_set): - # type: (RequirementSet) -> List[InstallRequirement] - """Create the installation order. - - The installation order is topological - requirements are installed - before the requiring thing. We break cycles at an arbitrary point, - and make no other guarantees. - """ - # The current implementation, which we may change at any point - # installs the user specified things in the order given, except when - # dependencies must come earlier to achieve topological order. - order = [] - ordered_reqs = set() # type: Set[InstallRequirement] - - def schedule(req): - # type: (InstallRequirement) -> None - if req.satisfied_by or req in ordered_reqs: - return - if req.constraint: - return - ordered_reqs.add(req) - for dep in self._discovered_dependencies[req.name]: - schedule(dep) - order.append(req) - - for install_req in req_set.requirements.values(): - schedule(install_req) - return order diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 66fed1eb240e015d6e3262ee6c31eeb36b59d8ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmYjLI|>3p44nlF5%vt$7J2{?v9aC8HZY8C7=!Z(GqVeOB(G%a5$vqYV4)A*OY(RL zF>Sk00(MJN>$A!~8W|44JQL~FNv)dhu2Qvs^3KOC^f;o644k4(#(N4Dcq-Qzw50;p zc+{EA1!2T6f}=BJD!3NwW-Ml4V$c){reGW-%+U>nV)(XlTsE`>sA#?6=`r8=*bff( J^_iDYeE@gtJBk1R diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc deleted file mode 100644 index 92b966714a3b798fb5320aaff5b2c827de4faa09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6308 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 TE+iWI5^ETiHG6&bidFd!(jvJ5 diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc deleted file mode 100644 index 4a13bfa41e137baf5d672a571870696dca4d97fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17888 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 diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc deleted file mode 100644 index 802a4fda7191ab0ced75f1fa460412630ac00108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4654 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

!I9%6b;s%Agakq2;0({9y?^$l;y65P zIgVtYEnh*C6tKyYwDXj6)KD6b?@%*O4J|M4P(ucmA5x>$HfhLPX_CZ|chT7M4o;l( o;omz%on$>t2}$*Os`i_d^b`TWD^|l=H5*nDg;E3kC9AmhF98+;CIA2c diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc deleted file mode 100644 index 90398ac53d2ad3aa9e0d9a651248d99165b41f24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3138 zcmb7G%Wf1$6z#`6+B0Kgz)2uLC?F1uFk?lEl*B?2#Lfc=If!JF(MYX!S9zwPUsToD z8ON+(8z~=<1uXfP{6KHBVxLu3Ik$RV*bWih>f2Raw{D&Ls8by*E;cM&d3-te6Rp3f zGk;akxr0aL5ZvN+Y$bNrwyEvJPU3c5({|%ZQteigTDNBUmAIaGT@URluf+>VquWTD z-KK2`SG1nl-No-LUgzF(i+jR*=609RU*HY&8>WAXH-EI+t=Cx9YTHGVi``%tYaWFf z-G#o;_p^Rq$hK3schgbP+$t5eN`=4 z5vdMojrq$#=MElq5kgp9n_FFn+uV6>bzScA3f>i71-@F*d=TZ6bwXNaa#5Rtw~5CX z(w4TL*@u=-reKV_f4Jzm+=8LX_QCIYl(R^&ILjVKX`cm}CGa@PW5M=>R8f{HmhG}% z^B{a2^o5@WiFnF%#<+l!Nt6n`2nhoN9{nCd7I9d>V*jj+OgkZKwZ zc92q71|+DgnXwRHa#&YvQ_Gm$WSb@`8B-a&%UF~UBEbgPKBFM#LhfcVQEN<#IEEi^ z7||XCIk3V7gh*_#f!4X&SYOACPCm+mPL!>yq1+QAwZ4NC0CPw&X}hwH9KZHREJCy^ zk}9Zh;ZpJ5R8{#qBY&K`;(b2>USv`Ef%d05uk50tM7;aTl4oGzAN9>fkBdDKXL%1k z^ktAB&;4FL(t|AZ`;qSTQ3bw&UD4YU>0U36c6ut(;?{U6)q?{)A6SG;gScn1Fx04~ zvI*muA;((*iGe#T!BG(i3C-_oFD{}GD2%AinM2Y=ggP?X0h*~He)d`7^ufE7&r`X z@H4ODUE>~Kz`M>HyotBRTYM4k1-`^j;oacNi2Uh-Dqu_O4EucqU_yNdU*5&eE$Non zK{K8S#jr6c+Mta-L%!AynrWYr4Q|iia|&truX+m*&91^3L|b*~yw6 zr30w};zs+GBR_z$JV#=g#4K00~9UBpj`u6ehiaE)eIa(-kP6(8+wxnUpW!?y!N|Cd6xgu&e7<~PXOR3!dj_& zXAawiw_rOK%PJ?XyuAqK&AvOll_|VD zN>k#1Np$7faY#jdtaX15*2NQJH&)zkH|0lU=rRcgQPh2(XQA)QYxIejUtTA1gTze| zhOuu^YZejHGPHdK1E1niL?0eb3a>J|C5>*kmy2eY#jyzKd{*UeM4iqpcqnO47d1Ts z#J;4>EvYKI^h?w6L8&~Go$)^wj&w9jI#!ZS)*-h5 diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc deleted file mode 100644 index 6d6f244317840c63238635d0a85e64d7a9869361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7043 zcmcIp&2!Yq71!5%kL|$_zyX8Uh2YtODJt2dvKvAmz$R>^Ce)gwQd3S;^0Y7-YcxZ* z>;hJ?trmt*t=ikaFdgOD;L&kiSCLoH*yk0rGpTkw!Dt*iKR_yQOZa)$gO< zd%yQI_S{@m!7=pC+kZTzDF32C_AoHGi6)-o#1y7_N?+}$D)lu_>+2o8Z*&Yf*1bZ% z*eRlKu!2|WmpkQtrBmrwJJo)zQ&W|nD6Ggz&lOg3s=Iopj&Ye)Fs{h)9L7~v!?-5L z^BC9J9L95UyujvHmFB`LaH2HTsJ=RMy6!{Q;j2#2)S~(JfcI_B4IS3D`%ZMMYx@J= z?aEu0k6U=HBCL&xAIns|VdqjXfJbTpS~~u9Mq?F8%@v#@2ES9g*{tU z_SE*C8dad1Sk^r)GKAwjDsFAs8;)2Ty2CZg^#h0dwztL|G4Qqmci_ie zERHw$cpF4(_%te8c*6}WiZd~Bcnqaazekyr|brxfziz=2CKeR|$WYv}>=kRZU-n2BB!kr<+ zA=yM3Cq*;VqH4UErPX-)KB-8vQYu;lvOue;P9^!M4nyfV-PkSinBiyf>JnP4RwFd? z)S6x8f8fF(jpR~a2Icb^>ZkLl)7$%~PFNJl{z82TPa0WNEPZ1X6L7H{&Ide~hjXBR zDdj;6FXr(uz0%?QFy$faO7g?!uzViv=){H-SgD~|o(ycw3^OZv%;ddvc&ON6ggQ0r!C=R7u=-Nm`B+ox8XIMDrkZ{x~!HB{FOAdTA)TF zIirh*6Niq`O|-8Q2~MOKcqAxT0XsVgNle*N#Nx*YPrK@GRS6Dipy7$WOF&@|P&Bo6 zc>cj7SD5&>P0#f=ubBQIKwl)l+bl!|J%|bx!1QrcdB_K$;|nKA+|t7LegclX-nP)!Ef`WC9K| zX~U%rd7s)(g?az(ee=85zTY(DX2i@BX2$NACkElh9TJ14DSAT)LJ-r_ZXKVF67t&_O3o2#Jkd z^@Ymxm+Bq#o=GQ!p%|MQUtxt+g`5)OBF5KuaDNGo$x1JD^pQLNPFqr5s;qJfPR+_o z$|-W&YI_1Oh&1VK6-@@P4G{fx{TaOeh4NDQLVIigIw;s7J1)So-60YXt#vI@#gv;y z)$5)sg6^O{yzxuC@NYCF{2*5a(;(Km?hTNMiyP=9YrIykaLOwpg_GZh+7&&<2^xvKq;M8>#BiP*1}6i;&eiL z`w~hfT_ASBkgN#iNQyKqD%52Yz6?KEPqy z;Q}QAoKNQB1Eht0>fPSq6Bl+s8zcq1{A8@VY9d_ruDyz#<8OdJC6 zgv8STpN03S>MphX47f{1n}u9ZpD6?3`3}i2F67E@4p!$3P(QGo`!PtwIG7jK2#t4% z38_du{MKwm9tg;Xv#?BjJTmb;HO{N@s8as(c}i6a z-0H0A&mcf)Ztnc6g!< zAQ^dT8bD&P;0SWFr8HyVq+B_rqeO#0kX&(0IcbE=*-}kIz}{S(K$GhEyExG|A2#UX zQ^|3=A`Qvjk6bF=!sH>Ephe26p_QpXq+-#ahJKOLoG#kLp<{Ft?dyh-)4%XX zHMhO)IU}XfSJ3eCtqBwf9@&A3Z6fqvcg(aiz1l%P9C zUefxXNOm$WBuW=%@pwddfca5Eq<%Gmhk0{l%eS{}*CUym{2r*}x(jXEpV1OV%mWzt zKOy4eWCciJDvJ)}4KvVz%8y*`2_61I+)tpxLCQP~94IR%WhUR2W-5++LBf#&lRWrfB-&2xE>t~WY6a`WUq%g+f0-E0?!qPcr zMf87Us9&8){Yb$)kAsh5>a*hRKQq)TLHy8NS5tSRsRDIUC_HPeupd|yjKrom}W zyV;0L{HD;d@OuLr@K*do1CrcUnqUb|1{j^mpN3x_Ji#f_a#DD-ET<*EP_(%7m>Pb7 zkiQV|0?jejQO@uZy+dxr={sQjp@6;$%920^bje~S^-ZH&RK6a6oV-E0mR}$0YD24Q Mr}aj&aiekVKg_xDvH$=8 diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc deleted file mode 100644 index c2eb5b31250f29647d7635316b2965eadcb2fe69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8050 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 DwaID0 diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py deleted file mode 100644 index 26821a1..0000000 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +++ /dev/null @@ -1,165 +0,0 @@ -from typing import FrozenSet, Iterable, Optional, Tuple, Union - -from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import LegacyVersion, Version - -from pip._internal.models.link import Link, links_equivalent -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.hashes import Hashes - -CandidateLookup = Tuple[Optional["Candidate"], Optional[InstallRequirement]] -CandidateVersion = Union[LegacyVersion, Version] - - -def format_name(project, extras): - # type: (str, FrozenSet[str]) -> str - if not extras: - return project - canonical_extras = sorted(canonicalize_name(e) for e in extras) - return "{}[{}]".format(project, ",".join(canonical_extras)) - - -class Constraint: - def __init__(self, specifier, hashes, links): - # type: (SpecifierSet, Hashes, FrozenSet[Link]) -> None - self.specifier = specifier - self.hashes = hashes - self.links = links - - @classmethod - def empty(cls): - # type: () -> Constraint - return Constraint(SpecifierSet(), Hashes(), frozenset()) - - @classmethod - def from_ireq(cls, ireq): - # type: (InstallRequirement) -> Constraint - links = frozenset([ireq.link]) if ireq.link else frozenset() - return Constraint(ireq.specifier, ireq.hashes(trust_internet=False), links) - - def __nonzero__(self): - # type: () -> bool - return bool(self.specifier) or bool(self.hashes) or bool(self.links) - - def __bool__(self): - # type: () -> bool - return self.__nonzero__() - - def __and__(self, other): - # type: (InstallRequirement) -> Constraint - if not isinstance(other, InstallRequirement): - return NotImplemented - specifier = self.specifier & other.specifier - hashes = self.hashes & other.hashes(trust_internet=False) - links = self.links - if other.link: - links = links.union([other.link]) - return Constraint(specifier, hashes, links) - - def is_satisfied_by(self, candidate): - # type: (Candidate) -> bool - # Reject if there are any mismatched URL constraints on this package. - if self.links and not all(_match_link(link, candidate) for link in self.links): - return False - # We can safely always allow prereleases here since PackageFinder - # already implements the prerelease logic, and would have filtered out - # prerelease candidates if the user does not expect them. - return self.specifier.contains(candidate.version, prereleases=True) - - -class Requirement: - @property - def project_name(self): - # type: () -> NormalizedName - """The "project name" of a requirement. - - This is different from ``name`` if this requirement contains extras, - in which case ``name`` would contain the ``[...]`` part, while this - refers to the name of the project. - """ - raise NotImplementedError("Subclass should override") - - @property - def name(self): - # type: () -> str - """The name identifying this requirement in the resolver. - - This is different from ``project_name`` if this requirement contains - extras, where ``project_name`` would not contain the ``[...]`` part. - """ - raise NotImplementedError("Subclass should override") - - def is_satisfied_by(self, candidate): - # type: (Candidate) -> bool - return False - - def get_candidate_lookup(self): - # type: () -> CandidateLookup - raise NotImplementedError("Subclass should override") - - def format_for_error(self): - # type: () -> str - raise NotImplementedError("Subclass should override") - - -def _match_link(link, candidate): - # type: (Link, Candidate) -> bool - if candidate.source_link: - return links_equivalent(link, candidate.source_link) - return False - - -class Candidate: - @property - def project_name(self): - # type: () -> NormalizedName - """The "project name" of the candidate. - - This is different from ``name`` if this candidate contains extras, - in which case ``name`` would contain the ``[...]`` part, while this - refers to the name of the project. - """ - raise NotImplementedError("Override in subclass") - - @property - def name(self): - # type: () -> str - """The name identifying this candidate in the resolver. - - This is different from ``project_name`` if this candidate contains - extras, where ``project_name`` would not contain the ``[...]`` part. - """ - raise NotImplementedError("Override in subclass") - - @property - def version(self): - # type: () -> CandidateVersion - raise NotImplementedError("Override in subclass") - - @property - def is_installed(self): - # type: () -> bool - raise NotImplementedError("Override in subclass") - - @property - def is_editable(self): - # type: () -> bool - raise NotImplementedError("Override in subclass") - - @property - def source_link(self): - # type: () -> Optional[Link] - raise NotImplementedError("Override in subclass") - - def iter_dependencies(self, with_requires): - # type: (bool) -> Iterable[Optional[Requirement]] - raise NotImplementedError("Override in subclass") - - def get_install_requirement(self): - # type: () -> Optional[InstallRequirement] - raise NotImplementedError("Override in subclass") - - def format_for_error(self): - # type: () -> str - raise NotImplementedError("Subclass should override") diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py deleted file mode 100644 index da516ad..0000000 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +++ /dev/null @@ -1,604 +0,0 @@ -import logging -import sys -from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast - -from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import Version -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.pkg_resources import Distribution - -from pip._internal.exceptions import HashError, MetadataInconsistent -from pip._internal.models.link import Link, links_equivalent -from pip._internal.models.wheel import Wheel -from pip._internal.req.constructors import ( - install_req_from_editable, - install_req_from_line, -) -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.misc import dist_is_editable, normalize_version_info -from pip._internal.utils.packaging import get_requires_python - -from .base import Candidate, CandidateVersion, Requirement, format_name - -if TYPE_CHECKING: - from .factory import Factory - -logger = logging.getLogger(__name__) - -BaseCandidate = Union[ - "AlreadyInstalledCandidate", - "EditableCandidate", - "LinkCandidate", -] - - -def as_base_candidate(candidate: Candidate) -> Optional[BaseCandidate]: - """The runtime version of BaseCandidate.""" - base_candidate_classes = ( - AlreadyInstalledCandidate, - EditableCandidate, - LinkCandidate, - ) - if isinstance(candidate, base_candidate_classes): - return candidate - return None - - -def make_install_req_from_link(link, template): - # type: (Link, InstallRequirement) -> InstallRequirement - assert not template.editable, "template is editable" - if template.req: - line = str(template.req) - else: - line = link.url - ireq = install_req_from_line( - line, - user_supplied=template.user_supplied, - comes_from=template.comes_from, - use_pep517=template.use_pep517, - isolated=template.isolated, - constraint=template.constraint, - options=dict( - install_options=template.install_options, - global_options=template.global_options, - hashes=template.hash_options, - ), - ) - ireq.original_link = template.original_link - ireq.link = link - return ireq - - -def make_install_req_from_editable(link, template): - # type: (Link, InstallRequirement) -> InstallRequirement - assert template.editable, "template not editable" - return install_req_from_editable( - link.url, - user_supplied=template.user_supplied, - comes_from=template.comes_from, - use_pep517=template.use_pep517, - isolated=template.isolated, - constraint=template.constraint, - options=dict( - install_options=template.install_options, - global_options=template.global_options, - hashes=template.hash_options, - ), - ) - - -def make_install_req_from_dist(dist, template): - # type: (Distribution, InstallRequirement) -> InstallRequirement - project_name = canonicalize_name(dist.project_name) - if template.req: - line = str(template.req) - elif template.link: - line = f"{project_name} @ {template.link.url}" - else: - line = f"{project_name}=={dist.parsed_version}" - ireq = install_req_from_line( - line, - user_supplied=template.user_supplied, - comes_from=template.comes_from, - use_pep517=template.use_pep517, - isolated=template.isolated, - constraint=template.constraint, - options=dict( - install_options=template.install_options, - global_options=template.global_options, - hashes=template.hash_options, - ), - ) - ireq.satisfied_by = dist - return ireq - - -class _InstallRequirementBackedCandidate(Candidate): - """A candidate backed by an ``InstallRequirement``. - - This represents a package request with the target not being already - in the environment, and needs to be fetched and installed. The backing - ``InstallRequirement`` is responsible for most of the leg work; this - class exposes appropriate information to the resolver. - - :param link: The link passed to the ``InstallRequirement``. The backing - ``InstallRequirement`` will use this link to fetch the distribution. - :param source_link: The link this candidate "originates" from. This is - different from ``link`` when the link is found in the wheel cache. - ``link`` would point to the wheel cache, while this points to the - found remote link (e.g. from pypi.org). - """ - - is_installed = False - - def __init__( - self, - link, # type: Link - source_link, # type: Link - ireq, # type: InstallRequirement - factory, # type: Factory - name=None, # type: Optional[NormalizedName] - version=None, # type: Optional[CandidateVersion] - ): - # type: (...) -> None - self._link = link - self._source_link = source_link - self._factory = factory - self._ireq = ireq - self._name = name - self._version = version - self.dist = self._prepare() - - def __str__(self): - # type: () -> str - return f"{self.name} {self.version}" - - def __repr__(self): - # type: () -> str - return "{class_name}({link!r})".format( - class_name=self.__class__.__name__, - link=str(self._link), - ) - - def __hash__(self): - # type: () -> int - return hash((self.__class__, self._link)) - - def __eq__(self, other): - # type: (Any) -> bool - if isinstance(other, self.__class__): - return links_equivalent(self._link, other._link) - return False - - @property - def source_link(self): - # type: () -> Optional[Link] - return self._source_link - - @property - def project_name(self): - # type: () -> NormalizedName - """The normalised name of the project the candidate refers to""" - if self._name is None: - self._name = canonicalize_name(self.dist.project_name) - return self._name - - @property - def name(self): - # type: () -> str - return self.project_name - - @property - def version(self): - # type: () -> CandidateVersion - if self._version is None: - self._version = parse_version(self.dist.version) - return self._version - - def format_for_error(self): - # type: () -> str - return "{} {} (from {})".format( - self.name, - self.version, - self._link.file_path if self._link.is_file else self._link, - ) - - def _prepare_distribution(self): - # type: () -> Distribution - raise NotImplementedError("Override in subclass") - - def _check_metadata_consistency(self, dist): - # type: (Distribution) -> None - """Check for consistency of project name and version of dist.""" - canonical_name = canonicalize_name(dist.project_name) - if self._name is not None and self._name != canonical_name: - raise MetadataInconsistent( - self._ireq, - "name", - self._name, - dist.project_name, - ) - parsed_version = parse_version(dist.version) - if self._version is not None and self._version != parsed_version: - raise MetadataInconsistent( - self._ireq, - "version", - str(self._version), - dist.version, - ) - - def _prepare(self): - # type: () -> Distribution - try: - dist = self._prepare_distribution() - except HashError as e: - # Provide HashError the underlying ireq that caused it. This - # provides context for the resulting error message to show the - # offending line to the user. - e.req = self._ireq - raise - self._check_metadata_consistency(dist) - return dist - - def _get_requires_python_dependency(self): - # type: () -> Optional[Requirement] - requires_python = get_requires_python(self.dist) - if requires_python is None: - return None - try: - spec = SpecifierSet(requires_python) - except InvalidSpecifier as e: - message = "Package %r has an invalid Requires-Python: %s" - logger.warning(message, self.name, e) - return None - return self._factory.make_requires_python_requirement(spec) - - def iter_dependencies(self, with_requires): - # type: (bool) -> Iterable[Optional[Requirement]] - requires = self.dist.requires() if with_requires else () - for r in requires: - yield self._factory.make_requirement_from_spec(str(r), self._ireq) - yield self._get_requires_python_dependency() - - def get_install_requirement(self): - # type: () -> Optional[InstallRequirement] - return self._ireq - - -class LinkCandidate(_InstallRequirementBackedCandidate): - is_editable = False - - def __init__( - self, - link, # type: Link - template, # type: InstallRequirement - factory, # type: Factory - name=None, # type: Optional[NormalizedName] - version=None, # type: Optional[CandidateVersion] - ): - # type: (...) -> None - source_link = link - cache_entry = factory.get_wheel_cache_entry(link, name) - if cache_entry is not None: - logger.debug("Using cached wheel link: %s", cache_entry.link) - link = cache_entry.link - ireq = make_install_req_from_link(link, template) - assert ireq.link == link - if ireq.link.is_wheel and not ireq.link.is_file: - wheel = Wheel(ireq.link.filename) - wheel_name = canonicalize_name(wheel.name) - assert name == wheel_name, f"{name!r} != {wheel_name!r} for wheel" - # Version may not be present for PEP 508 direct URLs - if version is not None: - wheel_version = Version(wheel.version) - assert version == wheel_version, "{!r} != {!r} for wheel {}".format( - version, wheel_version, name - ) - - if ( - cache_entry is not None - and cache_entry.persistent - and template.link is template.original_link - ): - ireq.original_link_is_in_wheel_cache = True - - super().__init__( - link=link, - source_link=source_link, - ireq=ireq, - factory=factory, - name=name, - version=version, - ) - - def _prepare_distribution(self): - # type: () -> Distribution - return self._factory.preparer.prepare_linked_requirement( - self._ireq, parallel_builds=True - ) - - -class EditableCandidate(_InstallRequirementBackedCandidate): - is_editable = True - - def __init__( - self, - link, # type: Link - template, # type: InstallRequirement - factory, # type: Factory - name=None, # type: Optional[NormalizedName] - version=None, # type: Optional[CandidateVersion] - ): - # type: (...) -> None - super().__init__( - link=link, - source_link=link, - ireq=make_install_req_from_editable(link, template), - factory=factory, - name=name, - version=version, - ) - - def _prepare_distribution(self): - # type: () -> Distribution - return self._factory.preparer.prepare_editable_requirement(self._ireq) - - -class AlreadyInstalledCandidate(Candidate): - is_installed = True - source_link = None - - def __init__( - self, - dist, # type: Distribution - template, # type: InstallRequirement - factory, # type: Factory - ): - # type: (...) -> None - self.dist = dist - self._ireq = make_install_req_from_dist(dist, template) - self._factory = factory - - # This is just logging some messages, so we can do it eagerly. - # The returned dist would be exactly the same as self.dist because we - # set satisfied_by in make_install_req_from_dist. - # TODO: Supply reason based on force_reinstall and upgrade_strategy. - skip_reason = "already satisfied" - factory.preparer.prepare_installed_requirement(self._ireq, skip_reason) - - def __str__(self): - # type: () -> str - return str(self.dist) - - def __repr__(self): - # type: () -> str - return "{class_name}({distribution!r})".format( - class_name=self.__class__.__name__, - distribution=self.dist, - ) - - def __hash__(self): - # type: () -> int - return hash((self.__class__, self.name, self.version)) - - def __eq__(self, other): - # type: (Any) -> bool - if isinstance(other, self.__class__): - return self.name == other.name and self.version == other.version - return False - - @property - def project_name(self): - # type: () -> NormalizedName - return canonicalize_name(self.dist.project_name) - - @property - def name(self): - # type: () -> str - return self.project_name - - @property - def version(self): - # type: () -> CandidateVersion - return parse_version(self.dist.version) - - @property - def is_editable(self): - # type: () -> bool - return dist_is_editable(self.dist) - - def format_for_error(self): - # type: () -> str - return f"{self.name} {self.version} (Installed)" - - def iter_dependencies(self, with_requires): - # type: (bool) -> Iterable[Optional[Requirement]] - if not with_requires: - return - for r in self.dist.requires(): - yield self._factory.make_requirement_from_spec(str(r), self._ireq) - - def get_install_requirement(self): - # type: () -> Optional[InstallRequirement] - return None - - -class ExtrasCandidate(Candidate): - """A candidate that has 'extras', indicating additional dependencies. - - Requirements can be for a project with dependencies, something like - foo[extra]. The extras don't affect the project/version being installed - directly, but indicate that we need additional dependencies. We model that - by having an artificial ExtrasCandidate that wraps the "base" candidate. - - The ExtrasCandidate differs from the base in the following ways: - - 1. It has a unique name, of the form foo[extra]. This causes the resolver - to treat it as a separate node in the dependency graph. - 2. When we're getting the candidate's dependencies, - a) We specify that we want the extra dependencies as well. - b) We add a dependency on the base candidate. - See below for why this is needed. - 3. We return None for the underlying InstallRequirement, as the base - candidate will provide it, and we don't want to end up with duplicates. - - The dependency on the base candidate is needed so that the resolver can't - decide that it should recommend foo[extra1] version 1.0 and foo[extra2] - version 2.0. Having those candidates depend on foo=1.0 and foo=2.0 - respectively forces the resolver to recognise that this is a conflict. - """ - - def __init__( - self, - base, # type: BaseCandidate - extras, # type: FrozenSet[str] - ): - # type: (...) -> None - self.base = base - self.extras = extras - - def __str__(self): - # type: () -> str - name, rest = str(self.base).split(" ", 1) - return "{}[{}] {}".format(name, ",".join(self.extras), rest) - - def __repr__(self): - # type: () -> str - return "{class_name}(base={base!r}, extras={extras!r})".format( - class_name=self.__class__.__name__, - base=self.base, - extras=self.extras, - ) - - def __hash__(self): - # type: () -> int - return hash((self.base, self.extras)) - - def __eq__(self, other): - # type: (Any) -> bool - if isinstance(other, self.__class__): - return self.base == other.base and self.extras == other.extras - return False - - @property - def project_name(self): - # type: () -> NormalizedName - return self.base.project_name - - @property - def name(self): - # type: () -> str - """The normalised name of the project the candidate refers to""" - return format_name(self.base.project_name, self.extras) - - @property - def version(self): - # type: () -> CandidateVersion - return self.base.version - - def format_for_error(self): - # type: () -> str - return "{} [{}]".format( - self.base.format_for_error(), ", ".join(sorted(self.extras)) - ) - - @property - def is_installed(self): - # type: () -> bool - return self.base.is_installed - - @property - def is_editable(self): - # type: () -> bool - return self.base.is_editable - - @property - def source_link(self): - # type: () -> Optional[Link] - return self.base.source_link - - def iter_dependencies(self, with_requires): - # type: (bool) -> Iterable[Optional[Requirement]] - factory = self.base._factory - - # Add a dependency on the exact base - # (See note 2b in the class docstring) - yield factory.make_requirement_from_candidate(self.base) - if not with_requires: - return - - # The user may have specified extras that the candidate doesn't - # support. We ignore any unsupported extras here. - valid_extras = self.extras.intersection(self.base.dist.extras) - invalid_extras = self.extras.difference(self.base.dist.extras) - for extra in sorted(invalid_extras): - logger.warning( - "%s %s does not provide the extra '%s'", - self.base.name, - self.version, - extra, - ) - - for r in self.base.dist.requires(valid_extras): - requirement = factory.make_requirement_from_spec( - str(r), self.base._ireq, valid_extras - ) - if requirement: - yield requirement - - def get_install_requirement(self): - # type: () -> Optional[InstallRequirement] - # We don't return anything here, because we always - # depend on the base candidate, and we'll get the - # install requirement from that. - return None - - -class RequiresPythonCandidate(Candidate): - is_installed = False - source_link = None - - def __init__(self, py_version_info): - # type: (Optional[Tuple[int, ...]]) -> None - if py_version_info is not None: - version_info = normalize_version_info(py_version_info) - else: - version_info = sys.version_info[:3] - self._version = Version(".".join(str(c) for c in version_info)) - - # We don't need to implement __eq__() and __ne__() since there is always - # only one RequiresPythonCandidate in a resolution, i.e. the host Python. - # The built-in object.__eq__() and object.__ne__() do exactly what we want. - - def __str__(self): - # type: () -> str - return f"Python {self._version}" - - @property - def project_name(self): - # type: () -> NormalizedName - # Avoid conflicting with the PyPI package "Python". - return cast(NormalizedName, "") - - @property - def name(self): - # type: () -> str - return self.project_name - - @property - def version(self): - # type: () -> CandidateVersion - return self._version - - def format_for_error(self): - # type: () -> str - return f"Python {self.version}" - - def iter_dependencies(self, with_requires): - # type: (bool) -> Iterable[Optional[Requirement]] - return () - - def get_install_requirement(self): - # type: () -> Optional[InstallRequirement] - return None diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py deleted file mode 100644 index 5816a0e..0000000 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +++ /dev/null @@ -1,661 +0,0 @@ -import contextlib -import functools -import logging -from typing import ( - TYPE_CHECKING, - Dict, - FrozenSet, - Iterable, - Iterator, - List, - Mapping, - Optional, - Sequence, - Set, - Tuple, - TypeVar, - cast, -) - -from pip._vendor.packaging.requirements import InvalidRequirement -from pip._vendor.packaging.requirements import Requirement as PackagingRequirement -from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.pkg_resources import Distribution -from pip._vendor.resolvelib import ResolutionImpossible - -from pip._internal.cache import CacheEntry, WheelCache -from pip._internal.exceptions import ( - DistributionNotFound, - InstallationError, - InstallationSubprocessError, - MetadataInconsistent, - UnsupportedPythonVersion, - UnsupportedWheel, -) -from pip._internal.index.package_finder import PackageFinder -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.constructors import install_req_from_link_and_ireq -from pip._internal.req.req_install import InstallRequirement -from pip._internal.resolution.base import InstallRequirementProvider -from pip._internal.utils.compatibility_tags import get_supported -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.misc import ( - dist_in_site_packages, - dist_in_usersite, - get_installed_distributions, -) -from pip._internal.utils.virtualenv import running_under_virtualenv - -from .base import Candidate, CandidateVersion, Constraint, Requirement -from .candidates import ( - AlreadyInstalledCandidate, - BaseCandidate, - EditableCandidate, - ExtrasCandidate, - LinkCandidate, - RequiresPythonCandidate, - as_base_candidate, -) -from .found_candidates import FoundCandidates, IndexCandidateInfo -from .requirements import ( - ExplicitRequirement, - RequiresPythonRequirement, - SpecifierRequirement, - UnsatisfiableRequirement, -) - -if TYPE_CHECKING: - from typing import Protocol - - class ConflictCause(Protocol): - requirement: RequiresPythonRequirement - parent: Candidate - - -logger = logging.getLogger(__name__) - -C = TypeVar("C") -Cache = Dict[Link, C] - - -class Factory: - def __init__( - self, - finder, # type: PackageFinder - preparer, # type: RequirementPreparer - make_install_req, # type: InstallRequirementProvider - wheel_cache, # type: Optional[WheelCache] - use_user_site, # type: bool - force_reinstall, # type: bool - ignore_installed, # type: bool - ignore_requires_python, # type: bool - py_version_info=None, # type: Optional[Tuple[int, ...]] - ): - # type: (...) -> None - self._finder = finder - self.preparer = preparer - self._wheel_cache = wheel_cache - self._python_candidate = RequiresPythonCandidate(py_version_info) - self._make_install_req_from_spec = make_install_req - self._use_user_site = use_user_site - self._force_reinstall = force_reinstall - self._ignore_requires_python = ignore_requires_python - - self._build_failures = {} # type: Cache[InstallationError] - self._link_candidate_cache = {} # type: Cache[LinkCandidate] - self._editable_candidate_cache = {} # type: Cache[EditableCandidate] - self._installed_candidate_cache = ( - {} - ) # type: Dict[str, AlreadyInstalledCandidate] - self._extras_candidate_cache = ( - {} - ) # type: Dict[Tuple[int, FrozenSet[str]], ExtrasCandidate] - - if not ignore_installed: - self._installed_dists = { - canonicalize_name(dist.project_name): dist - for dist in get_installed_distributions(local_only=False) - } - else: - self._installed_dists = {} - - @property - def force_reinstall(self): - # type: () -> bool - return self._force_reinstall - - def _fail_if_link_is_unsupported_wheel(self, link: Link) -> None: - if not link.is_wheel: - return - wheel = Wheel(link.filename) - if wheel.supported(self._finder.target_python.get_tags()): - return - msg = f"{link.filename} is not a supported wheel on this platform." - raise UnsupportedWheel(msg) - - def _make_extras_candidate(self, base, extras): - # type: (BaseCandidate, FrozenSet[str]) -> ExtrasCandidate - cache_key = (id(base), extras) - try: - candidate = self._extras_candidate_cache[cache_key] - except KeyError: - candidate = ExtrasCandidate(base, extras) - self._extras_candidate_cache[cache_key] = candidate - return candidate - - def _make_candidate_from_dist( - self, - dist, # type: Distribution - extras, # type: FrozenSet[str] - template, # type: InstallRequirement - ): - # type: (...) -> Candidate - try: - base = self._installed_candidate_cache[dist.key] - except KeyError: - base = AlreadyInstalledCandidate(dist, template, factory=self) - self._installed_candidate_cache[dist.key] = base - if not extras: - return base - return self._make_extras_candidate(base, extras) - - def _make_candidate_from_link( - self, - link, # type: Link - extras, # type: FrozenSet[str] - template, # type: InstallRequirement - name, # type: Optional[NormalizedName] - version, # type: Optional[CandidateVersion] - ): - # type: (...) -> Optional[Candidate] - # TODO: Check already installed candidate, and use it if the link and - # editable flag match. - - if link in self._build_failures: - # We already tried this candidate before, and it does not build. - # Don't bother trying again. - return None - - if template.editable: - if link not in self._editable_candidate_cache: - try: - self._editable_candidate_cache[link] = EditableCandidate( - link, - template, - factory=self, - name=name, - version=version, - ) - except (InstallationSubprocessError, MetadataInconsistent) as e: - logger.warning("Discarding %s. %s", link, e) - self._build_failures[link] = e - return None - base = self._editable_candidate_cache[link] # type: BaseCandidate - else: - if link not in self._link_candidate_cache: - try: - self._link_candidate_cache[link] = LinkCandidate( - link, - template, - factory=self, - name=name, - version=version, - ) - except (InstallationSubprocessError, MetadataInconsistent) as e: - logger.warning("Discarding %s. %s", link, e) - self._build_failures[link] = e - return None - base = self._link_candidate_cache[link] - - if not extras: - return base - return self._make_extras_candidate(base, extras) - - def _iter_found_candidates( - self, - ireqs: Sequence[InstallRequirement], - specifier: SpecifierSet, - hashes: Hashes, - prefers_installed: bool, - incompatible_ids: Set[int], - ) -> Iterable[Candidate]: - if not ireqs: - return () - - # The InstallRequirement implementation requires us to give it a - # "template". Here we just choose the first requirement to represent - # all of them. - # Hopefully the Project model can correct this mismatch in the future. - template = ireqs[0] - assert template.req, "Candidates found on index must be PEP 508" - name = canonicalize_name(template.req.name) - - extras = frozenset() # type: FrozenSet[str] - for ireq in ireqs: - assert ireq.req, "Candidates found on index must be PEP 508" - specifier &= ireq.req.specifier - hashes &= ireq.hashes(trust_internet=False) - extras |= frozenset(ireq.extras) - - def _get_installed_candidate() -> Optional[Candidate]: - """Get the candidate for the currently-installed version.""" - # If --force-reinstall is set, we want the version from the index - # instead, so we "pretend" there is nothing installed. - if self._force_reinstall: - return None - try: - installed_dist = self._installed_dists[name] - except KeyError: - return None - # Don't use the installed distribution if its version does not fit - # the current dependency graph. - if not specifier.contains(installed_dist.version, prereleases=True): - return None - candidate = self._make_candidate_from_dist( - dist=installed_dist, - extras=extras, - template=template, - ) - # The candidate is a known incompatiblity. Don't use it. - if id(candidate) in incompatible_ids: - return None - return candidate - - def iter_index_candidate_infos(): - # type: () -> Iterator[IndexCandidateInfo] - result = self._finder.find_best_candidate( - project_name=name, - specifier=specifier, - hashes=hashes, - ) - icans = list(result.iter_applicable()) - - # PEP 592: Yanked releases must be ignored unless only yanked - # releases can satisfy the version range. So if this is false, - # all yanked icans need to be skipped. - all_yanked = all(ican.link.is_yanked for ican in icans) - - # PackageFinder returns earlier versions first, so we reverse. - for ican in reversed(icans): - if not all_yanked and ican.link.is_yanked: - continue - func = functools.partial( - self._make_candidate_from_link, - link=ican.link, - extras=extras, - template=template, - name=name, - version=ican.version, - ) - yield ican.version, func - - return FoundCandidates( - iter_index_candidate_infos, - _get_installed_candidate(), - prefers_installed, - incompatible_ids, - ) - - def _iter_explicit_candidates_from_base( - self, - base_requirements: Iterable[Requirement], - extras: FrozenSet[str], - ) -> Iterator[Candidate]: - """Produce explicit candidates from the base given an extra-ed package. - - :param base_requirements: Requirements known to the resolver. The - requirements are guaranteed to not have extras. - :param extras: The extras to inject into the explicit requirements' - candidates. - """ - for req in base_requirements: - lookup_cand, _ = req.get_candidate_lookup() - if lookup_cand is None: # Not explicit. - continue - # We've stripped extras from the identifier, and should always - # get a BaseCandidate here, unless there's a bug elsewhere. - base_cand = as_base_candidate(lookup_cand) - assert base_cand is not None, "no extras here" - yield self._make_extras_candidate(base_cand, extras) - - def _iter_candidates_from_constraints( - self, - identifier: str, - constraint: Constraint, - template: InstallRequirement, - ) -> Iterator[Candidate]: - """Produce explicit candidates from constraints. - - This creates "fake" InstallRequirement objects that are basically clones - of what "should" be the template, but with original_link set to link. - """ - for link in constraint.links: - self._fail_if_link_is_unsupported_wheel(link) - candidate = self._make_candidate_from_link( - link, - extras=frozenset(), - template=install_req_from_link_and_ireq(link, template), - name=canonicalize_name(identifier), - version=None, - ) - if candidate: - yield candidate - - def find_candidates( - self, - identifier: str, - requirements: Mapping[str, Iterator[Requirement]], - incompatibilities: Mapping[str, Iterator[Candidate]], - constraint: Constraint, - prefers_installed: bool, - ) -> Iterable[Candidate]: - # Collect basic lookup information from the requirements. - explicit_candidates = set() # type: Set[Candidate] - ireqs = [] # type: List[InstallRequirement] - for req in requirements[identifier]: - cand, ireq = req.get_candidate_lookup() - if cand is not None: - explicit_candidates.add(cand) - if ireq is not None: - ireqs.append(ireq) - - # If the current identifier contains extras, add explicit candidates - # from entries from extra-less identifier. - with contextlib.suppress(InvalidRequirement): - parsed_requirement = PackagingRequirement(identifier) - explicit_candidates.update( - self._iter_explicit_candidates_from_base( - requirements.get(parsed_requirement.name, ()), - frozenset(parsed_requirement.extras), - ), - ) - - # Add explicit candidates from constraints. We only do this if there are - # kown ireqs, which represent requirements not already explicit. If - # there are no ireqs, we're constraining already-explicit requirements, - # which is handled later when we return the explicit candidates. - if ireqs: - try: - explicit_candidates.update( - self._iter_candidates_from_constraints( - identifier, - constraint, - template=ireqs[0], - ), - ) - except UnsupportedWheel: - # If we're constrained to install a wheel incompatible with the - # target architecture, no candidates will ever be valid. - return () - - # Since we cache all the candidates, incompatibility identification - # can be made quicker by comparing only the id() values. - incompat_ids = {id(c) for c in incompatibilities.get(identifier, ())} - - # If none of the requirements want an explicit candidate, we can ask - # the finder for candidates. - if not explicit_candidates: - return self._iter_found_candidates( - ireqs, - constraint.specifier, - constraint.hashes, - prefers_installed, - incompat_ids, - ) - - return ( - c - for c in explicit_candidates - if id(c) not in incompat_ids - and constraint.is_satisfied_by(c) - and all(req.is_satisfied_by(c) for req in requirements[identifier]) - ) - - def make_requirement_from_install_req(self, ireq, requested_extras): - # type: (InstallRequirement, Iterable[str]) -> Optional[Requirement] - if not ireq.match_markers(requested_extras): - logger.info( - "Ignoring %s: markers '%s' don't match your environment", - ireq.name, - ireq.markers, - ) - return None - if not ireq.link: - return SpecifierRequirement(ireq) - self._fail_if_link_is_unsupported_wheel(ireq.link) - cand = self._make_candidate_from_link( - ireq.link, - extras=frozenset(ireq.extras), - template=ireq, - name=canonicalize_name(ireq.name) if ireq.name else None, - version=None, - ) - if cand is None: - # There's no way we can satisfy a URL requirement if the underlying - # candidate fails to build. An unnamed URL must be user-supplied, so - # we fail eagerly. If the URL is named, an unsatisfiable requirement - # can make the resolver do the right thing, either backtrack (and - # maybe find some other requirement that's buildable) or raise a - # ResolutionImpossible eventually. - if not ireq.name: - raise self._build_failures[ireq.link] - return UnsatisfiableRequirement(canonicalize_name(ireq.name)) - return self.make_requirement_from_candidate(cand) - - def make_requirement_from_candidate(self, candidate): - # type: (Candidate) -> ExplicitRequirement - return ExplicitRequirement(candidate) - - def make_requirement_from_spec( - self, - specifier, # type: str - comes_from, # type: InstallRequirement - requested_extras=(), # type: Iterable[str] - ): - # type: (...) -> Optional[Requirement] - ireq = self._make_install_req_from_spec(specifier, comes_from) - return self.make_requirement_from_install_req(ireq, requested_extras) - - def make_requires_python_requirement(self, specifier): - # type: (Optional[SpecifierSet]) -> Optional[Requirement] - if self._ignore_requires_python or specifier is None: - return None - return RequiresPythonRequirement(specifier, self._python_candidate) - - def get_wheel_cache_entry(self, link, name): - # type: (Link, Optional[str]) -> Optional[CacheEntry] - """Look up the link in the wheel cache. - - If ``preparer.require_hashes`` is True, don't use the wheel cache, - because cached wheels, always built locally, have different hashes - than the files downloaded from the index server and thus throw false - hash mismatches. Furthermore, cached wheels at present have - nondeterministic contents due to file modification times. - """ - if self._wheel_cache is None or self.preparer.require_hashes: - return None - return self._wheel_cache.get_cache_entry( - link=link, - package_name=name, - supported_tags=get_supported(), - ) - - def get_dist_to_uninstall(self, candidate): - # type: (Candidate) -> Optional[Distribution] - # TODO: Are there more cases this needs to return True? Editable? - dist = self._installed_dists.get(candidate.project_name) - if dist is None: # Not installed, no uninstallation required. - return None - - # We're installing into global site. The current installation must - # be uninstalled, no matter it's in global or user site, because the - # user site installation has precedence over global. - if not self._use_user_site: - return dist - - # We're installing into user site. Remove the user site installation. - if dist_in_usersite(dist): - return dist - - # We're installing into user site, but the installed incompatible - # package is in global site. We can't uninstall that, and would let - # the new user installation to "shadow" it. But shadowing won't work - # in virtual environments, so we error out. - if running_under_virtualenv() and dist_in_site_packages(dist): - raise InstallationError( - "Will not install to the user site because it will " - "lack sys.path precedence to {} in {}".format( - dist.project_name, - dist.location, - ) - ) - return None - - def _report_requires_python_error(self, causes): - # type: (Sequence[ConflictCause]) -> UnsupportedPythonVersion - assert causes, "Requires-Python error reported with no cause" - - version = self._python_candidate.version - - if len(causes) == 1: - specifier = str(causes[0].requirement.specifier) - message = ( - f"Package {causes[0].parent.name!r} requires a different " - f"Python: {version} not in {specifier!r}" - ) - return UnsupportedPythonVersion(message) - - message = f"Packages require a different Python. {version} not in:" - for cause in causes: - package = cause.parent.format_for_error() - specifier = str(cause.requirement.specifier) - message += f"\n{specifier!r} (required by {package})" - return UnsupportedPythonVersion(message) - - def _report_single_requirement_conflict(self, req, parent): - # type: (Requirement, Optional[Candidate]) -> DistributionNotFound - if parent is None: - req_disp = str(req) - else: - req_disp = f"{req} (from {parent.name})" - - cands = self._finder.find_all_candidates(req.project_name) - versions = [str(v) for v in sorted({c.version for c in cands})] - - logger.critical( - "Could not find a version that satisfies the requirement %s " - "(from versions: %s)", - req_disp, - ", ".join(versions) or "none", - ) - - return DistributionNotFound(f"No matching distribution found for {req}") - - def get_installation_error( - self, - e, # type: ResolutionImpossible[Requirement, Candidate] - constraints, # type: Dict[str, Constraint] - ): - # type: (...) -> InstallationError - - assert e.causes, "Installation error reported with no cause" - - # If one of the things we can't solve is "we need Python X.Y", - # that is what we report. - requires_python_causes = [ - cause - for cause in e.causes - if isinstance(cause.requirement, RequiresPythonRequirement) - and not cause.requirement.is_satisfied_by(self._python_candidate) - ] - if requires_python_causes: - # The comprehension above makes sure all Requirement instances are - # RequiresPythonRequirement, so let's cast for convinience. - return self._report_requires_python_error( - cast("Sequence[ConflictCause]", requires_python_causes), - ) - - # Otherwise, we have a set of causes which can't all be satisfied - # at once. - - # The simplest case is when we have *one* cause that can't be - # satisfied. We just report that case. - if len(e.causes) == 1: - req, parent = e.causes[0] - if req.name not in constraints: - return self._report_single_requirement_conflict(req, parent) - - # OK, we now have a list of requirements that can't all be - # satisfied at once. - - # A couple of formatting helpers - def text_join(parts): - # type: (List[str]) -> str - if len(parts) == 1: - return parts[0] - - return ", ".join(parts[:-1]) + " and " + parts[-1] - - def describe_trigger(parent): - # type: (Candidate) -> str - ireq = parent.get_install_requirement() - if not ireq or not ireq.comes_from: - return f"{parent.name}=={parent.version}" - if isinstance(ireq.comes_from, InstallRequirement): - return str(ireq.comes_from.name) - return str(ireq.comes_from) - - triggers = set() - for req, parent in e.causes: - if parent is None: - # This is a root requirement, so we can report it directly - trigger = req.format_for_error() - else: - trigger = describe_trigger(parent) - triggers.add(trigger) - - if triggers: - info = text_join(sorted(triggers)) - else: - info = "the requested packages" - - msg = ( - "Cannot install {} because these package versions " - "have conflicting dependencies.".format(info) - ) - logger.critical(msg) - msg = "\nThe conflict is caused by:" - - relevant_constraints = set() - for req, parent in e.causes: - if req.name in constraints: - relevant_constraints.add(req.name) - msg = msg + "\n " - if parent: - msg = msg + f"{parent.name} {parent.version} depends on " - else: - msg = msg + "The user requested " - msg = msg + req.format_for_error() - for key in relevant_constraints: - spec = constraints[key].specifier - msg += f"\n The user requested (constraint) {key}{spec}" - - msg = ( - msg - + "\n\n" - + "To fix this you could try to:\n" - + "1. loosen the range of package versions you've specified\n" - + "2. remove package versions to allow pip attempt to solve " - + "the dependency conflict\n" - ) - - logger.info(msg) - - return DistributionNotFound( - "ResolutionImpossible: for help visit " - "https://pip.pypa.io/en/latest/user_guide/" - "#fixing-conflicting-dependencies" - ) diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py deleted file mode 100644 index 21fa08e..0000000 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Utilities to lazily create and visit candidates found. - -Creating and visiting a candidate is a *very* costly operation. It involves -fetching, extracting, potentially building modules from source, and verifying -distribution metadata. It is therefore crucial for performance to keep -everything here lazy all the way down, so we only touch candidates that we -absolutely need, and not "download the world" when we only need one version of -something. -""" - -import functools -from typing import Callable, Iterator, Optional, Set, Tuple - -from pip._vendor.packaging.version import _BaseVersion -from pip._vendor.six.moves import collections_abc # type: ignore - -from .base import Candidate - -IndexCandidateInfo = Tuple[_BaseVersion, Callable[[], Optional[Candidate]]] - - -def _iter_built(infos): - # type: (Iterator[IndexCandidateInfo]) -> Iterator[Candidate] - """Iterator for ``FoundCandidates``. - - This iterator is used when the package is not already installed. Candidates - from index come later in their normal ordering. - """ - versions_found = set() # type: Set[_BaseVersion] - for version, func in infos: - if version in versions_found: - continue - candidate = func() - if candidate is None: - continue - yield candidate - versions_found.add(version) - - -def _iter_built_with_prepended(installed, infos): - # type: (Candidate, Iterator[IndexCandidateInfo]) -> Iterator[Candidate] - """Iterator for ``FoundCandidates``. - - This iterator is used when the resolver prefers the already-installed - candidate and NOT to upgrade. The installed candidate is therefore - always yielded first, and candidates from index come later in their - normal ordering, except skipped when the version is already installed. - """ - yield installed - versions_found = {installed.version} # type: Set[_BaseVersion] - for version, func in infos: - if version in versions_found: - continue - candidate = func() - if candidate is None: - continue - yield candidate - versions_found.add(version) - - -def _iter_built_with_inserted(installed, infos): - # type: (Candidate, Iterator[IndexCandidateInfo]) -> Iterator[Candidate] - """Iterator for ``FoundCandidates``. - - This iterator is used when the resolver prefers to upgrade an - already-installed package. Candidates from index are returned in their - normal ordering, except replaced when the version is already installed. - - The implementation iterates through and yields other candidates, inserting - the installed candidate exactly once before we start yielding older or - equivalent candidates, or after all other candidates if they are all newer. - """ - versions_found = set() # type: Set[_BaseVersion] - for version, func in infos: - if version in versions_found: - continue - # If the installed candidate is better, yield it first. - if installed.version >= version: - yield installed - versions_found.add(installed.version) - candidate = func() - if candidate is None: - continue - yield candidate - versions_found.add(version) - - # If the installed candidate is older than all other candidates. - if installed.version not in versions_found: - yield installed - - -class FoundCandidates(collections_abc.Sequence): - """A lazy sequence to provide candidates to the resolver. - - The intended usage is to return this from `find_matches()` so the resolver - can iterate through the sequence multiple times, but only access the index - page when remote packages are actually needed. This improve performances - when suitable candidates are already installed on disk. - """ - - def __init__( - self, - get_infos: Callable[[], Iterator[IndexCandidateInfo]], - installed: Optional[Candidate], - prefers_installed: bool, - incompatible_ids: Set[int], - ): - self._get_infos = get_infos - self._installed = installed - self._prefers_installed = prefers_installed - self._incompatible_ids = incompatible_ids - - def __getitem__(self, index): - # type: (int) -> Candidate - # Implemented to satisfy the ABC check. This is not needed by the - # resolver, and should not be used by the provider either (for - # performance reasons). - raise NotImplementedError("don't do this") - - def __iter__(self): - # type: () -> Iterator[Candidate] - infos = self._get_infos() - if not self._installed: - iterator = _iter_built(infos) - elif self._prefers_installed: - iterator = _iter_built_with_prepended(self._installed, infos) - else: - iterator = _iter_built_with_inserted(self._installed, infos) - return (c for c in iterator if id(c) not in self._incompatible_ids) - - def __len__(self): - # type: () -> int - # Implemented to satisfy the ABC check. This is not needed by the - # resolver, and should not be used by the provider either (for - # performance reasons). - raise NotImplementedError("don't do this") - - @functools.lru_cache(maxsize=1) - def __bool__(self): - # type: () -> bool - if self._prefers_installed and self._installed: - return True - return any(self) - - __nonzero__ = __bool__ # XXX: Python 2. diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py deleted file mode 100644 index 0be58fd..0000000 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +++ /dev/null @@ -1,175 +0,0 @@ -from typing import TYPE_CHECKING, Dict, Iterable, Iterator, Mapping, Sequence, Union - -from pip._vendor.resolvelib.providers import AbstractProvider - -from .base import Candidate, Constraint, Requirement -from .factory import Factory - -if TYPE_CHECKING: - from pip._vendor.resolvelib.providers import Preference - from pip._vendor.resolvelib.resolvers import RequirementInformation - - PreferenceInformation = RequirementInformation[Requirement, Candidate] - - _ProviderBase = AbstractProvider[Requirement, Candidate, str] -else: - _ProviderBase = AbstractProvider - -# Notes on the relationship between the provider, the factory, and the -# candidate and requirement classes. -# -# The provider is a direct implementation of the resolvelib class. Its role -# is to deliver the API that resolvelib expects. -# -# Rather than work with completely abstract "requirement" and "candidate" -# concepts as resolvelib does, pip has concrete classes implementing these two -# ideas. The API of Requirement and Candidate objects are defined in the base -# classes, but essentially map fairly directly to the equivalent provider -# methods. In particular, `find_matches` and `is_satisfied_by` are -# requirement methods, and `get_dependencies` is a candidate method. -# -# The factory is the interface to pip's internal mechanisms. It is stateless, -# and is created by the resolver and held as a property of the provider. It is -# responsible for creating Requirement and Candidate objects, and provides -# services to those objects (access to pip's finder and preparer). - - -class PipProvider(_ProviderBase): - """Pip's provider implementation for resolvelib. - - :params constraints: A mapping of constraints specified by the user. Keys - are canonicalized project names. - :params ignore_dependencies: Whether the user specified ``--no-deps``. - :params upgrade_strategy: The user-specified upgrade strategy. - :params user_requested: A set of canonicalized package names that the user - supplied for pip to install/upgrade. - """ - - def __init__( - self, - factory, # type: Factory - constraints, # type: Dict[str, Constraint] - ignore_dependencies, # type: bool - upgrade_strategy, # type: str - user_requested, # type: Dict[str, int] - ): - # type: (...) -> None - self._factory = factory - self._constraints = constraints - self._ignore_dependencies = ignore_dependencies - self._upgrade_strategy = upgrade_strategy - self._user_requested = user_requested - - def identify(self, requirement_or_candidate): - # type: (Union[Requirement, Candidate]) -> str - return requirement_or_candidate.name - - def get_preference( - self, - identifier: str, - resolutions: Mapping[str, Candidate], - candidates: Mapping[str, Iterator[Candidate]], - information: Mapping[str, Iterator["PreferenceInformation"]], - ) -> "Preference": - """Produce a sort key for given requirement based on preference. - - The lower the return value is, the more preferred this group of - arguments is. - - Currently pip considers the followings in order: - - * Prefer if any of the known requirements points to an explicit URL. - * If equal, prefer if any requirements contain ``===`` and ``==``. - * If equal, prefer if requirements include version constraints, e.g. - ``>=`` and ``<``. - * If equal, prefer user-specified (non-transitive) requirements, and - order user-specified requirements by the order they are specified. - * If equal, order alphabetically for consistency (helps debuggability). - """ - - def _get_restrictive_rating(requirements): - # type: (Iterable[Requirement]) -> int - """Rate how restrictive a set of requirements are. - - ``Requirement.get_candidate_lookup()`` returns a 2-tuple for - lookup. The first element is ``Optional[Candidate]`` and the - second ``Optional[InstallRequirement]``. - - * If the requirement is an explicit one, the explicitly-required - candidate is returned as the first element. - * If the requirement is based on a PEP 508 specifier, the backing - ``InstallRequirement`` is returned as the second element. - - We use the first element to check whether there is an explicit - requirement, and the second for equality operator. - """ - lookups = (r.get_candidate_lookup() for r in requirements) - cands, ireqs = zip(*lookups) - if any(cand is not None for cand in cands): - return 0 - spec_sets = (ireq.specifier for ireq in ireqs if ireq) - operators = [ - specifier.operator for spec_set in spec_sets for specifier in spec_set - ] - if any(op in ("==", "===") for op in operators): - return 1 - if operators: - return 2 - # A "bare" requirement without any version requirements. - return 3 - - rating = _get_restrictive_rating(r for r, _ in information[identifier]) - order = self._user_requested.get(identifier, float("inf")) - - # HACK: Setuptools have a very long and solid backward compatibility - # track record, and extremely few projects would request a narrow, - # non-recent version range of it since that would break a lot things. - # (Most projects specify it only to request for an installer feature, - # which does not work, but that's another topic.) Intentionally - # delaying Setuptools helps reduce branches the resolver has to check. - # This serves as a temporary fix for issues like "apache-airlfow[all]" - # while we work on "proper" branch pruning techniques. - delay_this = identifier == "setuptools" - - return (delay_this, rating, order, identifier) - - def find_matches( - self, - identifier: str, - requirements: Mapping[str, Iterator[Requirement]], - incompatibilities: Mapping[str, Iterator[Candidate]], - ) -> Iterable[Candidate]: - def _eligible_for_upgrade(name): - # type: (str) -> bool - """Are upgrades allowed for this project? - - This checks the upgrade strategy, and whether the project was one - that the user specified in the command line, in order to decide - whether we should upgrade if there's a newer version available. - - (Note that we don't need access to the `--upgrade` flag, because - an upgrade strategy of "to-satisfy-only" means that `--upgrade` - was not specified). - """ - if self._upgrade_strategy == "eager": - return True - elif self._upgrade_strategy == "only-if-needed": - return name in self._user_requested - return False - - return self._factory.find_candidates( - identifier=identifier, - requirements=requirements, - constraint=self._constraints.get(identifier, Constraint.empty()), - prefers_installed=(not _eligible_for_upgrade(identifier)), - incompatibilities=incompatibilities, - ) - - def is_satisfied_by(self, requirement, candidate): - # type: (Requirement, Candidate) -> bool - return requirement.is_satisfied_by(candidate) - - def get_dependencies(self, candidate): - # type: (Candidate) -> Sequence[Requirement] - with_requires = not self._ignore_dependencies - return [r for r in candidate.iter_dependencies(with_requires) if r is not None] diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py deleted file mode 100644 index 074583d..0000000 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +++ /dev/null @@ -1,78 +0,0 @@ -from collections import defaultdict -from logging import getLogger -from typing import Any, DefaultDict - -from pip._vendor.resolvelib.reporters import BaseReporter - -from .base import Candidate, Requirement - -logger = getLogger(__name__) - - -class PipReporter(BaseReporter): - def __init__(self): - # type: () -> None - self.backtracks_by_package = defaultdict(int) # type: DefaultDict[str, int] - - self._messages_at_backtrack = { - 1: ( - "pip is looking at multiple versions of {package_name} to " - "determine which version is compatible with other " - "requirements. This could take a while." - ), - 8: ( - "pip is looking at multiple versions of {package_name} to " - "determine which version is compatible with other " - "requirements. This could take a while." - ), - 13: ( - "This is taking longer than usual. You might need to provide " - "the dependency resolver with stricter constraints to reduce " - "runtime. If you want to abort this run, you can press " - "Ctrl + C to do so. To improve how pip performs, tell us what " - "happened here: https://pip.pypa.io/surveys/backtracking" - ), - } - - def backtracking(self, candidate): - # type: (Candidate) -> None - self.backtracks_by_package[candidate.name] += 1 - - count = self.backtracks_by_package[candidate.name] - if count not in self._messages_at_backtrack: - return - - message = self._messages_at_backtrack[count] - logger.info("INFO: %s", message.format(package_name=candidate.name)) - - -class PipDebuggingReporter(BaseReporter): - """A reporter that does an info log for every event it sees.""" - - def starting(self): - # type: () -> None - logger.info("Reporter.starting()") - - def starting_round(self, index): - # type: (int) -> None - logger.info("Reporter.starting_round(%r)", index) - - def ending_round(self, index, state): - # type: (int, Any) -> None - logger.info("Reporter.ending_round(%r, state)", index) - - def ending(self, state): - # type: (Any) -> None - logger.info("Reporter.ending(%r)", state) - - def adding_requirement(self, requirement, parent): - # type: (Requirement, Candidate) -> None - logger.info("Reporter.adding_requirement(%r, %r)", requirement, parent) - - def backtracking(self, candidate): - # type: (Candidate) -> None - logger.info("Reporter.backtracking(%r)", candidate) - - def pinning(self, candidate): - # type: (Candidate) -> None - logger.info("Reporter.pinning(%r)", candidate) diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py deleted file mode 100644 index a7fcdd1..0000000 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +++ /dev/null @@ -1,198 +0,0 @@ -from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name - -from pip._internal.req.req_install import InstallRequirement - -from .base import Candidate, CandidateLookup, Requirement, format_name - - -class ExplicitRequirement(Requirement): - def __init__(self, candidate): - # type: (Candidate) -> None - self.candidate = candidate - - def __str__(self): - # type: () -> str - return str(self.candidate) - - def __repr__(self): - # type: () -> str - return "{class_name}({candidate!r})".format( - class_name=self.__class__.__name__, - candidate=self.candidate, - ) - - @property - def project_name(self): - # type: () -> NormalizedName - # No need to canonicalise - the candidate did this - return self.candidate.project_name - - @property - def name(self): - # type: () -> str - # No need to canonicalise - the candidate did this - return self.candidate.name - - def format_for_error(self): - # type: () -> str - return self.candidate.format_for_error() - - def get_candidate_lookup(self): - # type: () -> CandidateLookup - return self.candidate, None - - def is_satisfied_by(self, candidate): - # type: (Candidate) -> bool - return candidate == self.candidate - - -class SpecifierRequirement(Requirement): - def __init__(self, ireq): - # type: (InstallRequirement) -> None - assert ireq.link is None, "This is a link, not a specifier" - self._ireq = ireq - self._extras = frozenset(ireq.extras) - - def __str__(self): - # type: () -> str - return str(self._ireq.req) - - def __repr__(self): - # type: () -> str - return "{class_name}({requirement!r})".format( - class_name=self.__class__.__name__, - requirement=str(self._ireq.req), - ) - - @property - def project_name(self): - # type: () -> NormalizedName - assert self._ireq.req, "Specifier-backed ireq is always PEP 508" - return canonicalize_name(self._ireq.req.name) - - @property - def name(self): - # type: () -> str - return format_name(self.project_name, self._extras) - - def format_for_error(self): - # type: () -> str - - # Convert comma-separated specifiers into "A, B, ..., F and G" - # This makes the specifier a bit more "human readable", without - # risking a change in meaning. (Hopefully! Not all edge cases have - # been checked) - parts = [s.strip() for s in str(self).split(",")] - if len(parts) == 0: - return "" - elif len(parts) == 1: - return parts[0] - - return ", ".join(parts[:-1]) + " and " + parts[-1] - - def get_candidate_lookup(self): - # type: () -> CandidateLookup - return None, self._ireq - - def is_satisfied_by(self, candidate): - # type: (Candidate) -> bool - assert candidate.name == self.name, ( - f"Internal issue: Candidate is not for this requirement " - f"{candidate.name} vs {self.name}" - ) - # We can safely always allow prereleases here since PackageFinder - # already implements the prerelease logic, and would have filtered out - # prerelease candidates if the user does not expect them. - assert self._ireq.req, "Specifier-backed ireq is always PEP 508" - spec = self._ireq.req.specifier - return spec.contains(candidate.version, prereleases=True) - - -class RequiresPythonRequirement(Requirement): - """A requirement representing Requires-Python metadata.""" - - def __init__(self, specifier, match): - # type: (SpecifierSet, Candidate) -> None - self.specifier = specifier - self._candidate = match - - def __str__(self): - # type: () -> str - return f"Python {self.specifier}" - - def __repr__(self): - # type: () -> str - return "{class_name}({specifier!r})".format( - class_name=self.__class__.__name__, - specifier=str(self.specifier), - ) - - @property - def project_name(self): - # type: () -> NormalizedName - return self._candidate.project_name - - @property - def name(self): - # type: () -> str - return self._candidate.name - - def format_for_error(self): - # type: () -> str - return str(self) - - def get_candidate_lookup(self): - # type: () -> CandidateLookup - if self.specifier.contains(self._candidate.version, prereleases=True): - return self._candidate, None - return None, None - - def is_satisfied_by(self, candidate): - # type: (Candidate) -> bool - assert candidate.name == self._candidate.name, "Not Python candidate" - # We can safely always allow prereleases here since PackageFinder - # already implements the prerelease logic, and would have filtered out - # prerelease candidates if the user does not expect them. - return self.specifier.contains(candidate.version, prereleases=True) - - -class UnsatisfiableRequirement(Requirement): - """A requirement that cannot be satisfied.""" - - def __init__(self, name): - # type: (NormalizedName) -> None - self._name = name - - def __str__(self): - # type: () -> str - return f"{self._name} (unavailable)" - - def __repr__(self): - # type: () -> str - return "{class_name}({name!r})".format( - class_name=self.__class__.__name__, - name=str(self._name), - ) - - @property - def project_name(self): - # type: () -> NormalizedName - return self._name - - @property - def name(self): - # type: () -> str - return self._name - - def format_for_error(self): - # type: () -> str - return str(self) - - def get_candidate_lookup(self): - # type: () -> CandidateLookup - return None, None - - def is_satisfied_by(self, candidate): - # type: (Candidate) -> bool - return False diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py deleted file mode 100644 index b90f82c..0000000 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +++ /dev/null @@ -1,305 +0,0 @@ -import functools -import logging -import os -from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, cast - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible -from pip._vendor.resolvelib import Resolver as RLResolver -from pip._vendor.resolvelib.structs import DirectedGraph - -from pip._internal.cache import WheelCache -from pip._internal.exceptions import InstallationError -from pip._internal.index.package_finder import PackageFinder -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.req_install import ( - InstallRequirement, - check_invalid_constraint_type, -) -from pip._internal.req.req_set import RequirementSet -from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider -from pip._internal.resolution.resolvelib.provider import PipProvider -from pip._internal.resolution.resolvelib.reporter import ( - PipDebuggingReporter, - PipReporter, -) -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.filetypes import is_archive_file -from pip._internal.utils.misc import dist_is_editable - -from .base import Candidate, Constraint, Requirement -from .factory import Factory - -if TYPE_CHECKING: - from pip._vendor.resolvelib.resolvers import Result as RLResult - - Result = RLResult[Requirement, Candidate, str] - - -logger = logging.getLogger(__name__) - - -class Resolver(BaseResolver): - _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} - - def __init__( - self, - preparer, # type: RequirementPreparer - finder, # type: PackageFinder - wheel_cache, # type: Optional[WheelCache] - make_install_req, # type: InstallRequirementProvider - use_user_site, # type: bool - ignore_dependencies, # type: bool - ignore_installed, # type: bool - ignore_requires_python, # type: bool - force_reinstall, # type: bool - upgrade_strategy, # type: str - py_version_info=None, # type: Optional[Tuple[int, ...]] - ): - super().__init__() - assert upgrade_strategy in self._allowed_strategies - - self.factory = Factory( - finder=finder, - preparer=preparer, - make_install_req=make_install_req, - wheel_cache=wheel_cache, - use_user_site=use_user_site, - force_reinstall=force_reinstall, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - py_version_info=py_version_info, - ) - self.ignore_dependencies = ignore_dependencies - self.upgrade_strategy = upgrade_strategy - self._result = None # type: Optional[Result] - - def resolve(self, root_reqs, check_supported_wheels): - # type: (List[InstallRequirement], bool) -> RequirementSet - - constraints = {} # type: Dict[str, Constraint] - user_requested = {} # type: Dict[str, int] - requirements = [] - for i, req in enumerate(root_reqs): - if req.constraint: - # Ensure we only accept valid constraints - problem = check_invalid_constraint_type(req) - if problem: - raise InstallationError(problem) - if not req.match_markers(): - continue - assert req.name, "Constraint must be named" - name = canonicalize_name(req.name) - if name in constraints: - constraints[name] &= req - else: - constraints[name] = Constraint.from_ireq(req) - else: - if req.user_supplied and req.name: - canonical_name = canonicalize_name(req.name) - if canonical_name not in user_requested: - user_requested[canonical_name] = i - r = self.factory.make_requirement_from_install_req( - req, requested_extras=() - ) - if r is not None: - requirements.append(r) - - provider = PipProvider( - factory=self.factory, - constraints=constraints, - ignore_dependencies=self.ignore_dependencies, - upgrade_strategy=self.upgrade_strategy, - user_requested=user_requested, - ) - if "PIP_RESOLVER_DEBUG" in os.environ: - reporter = PipDebuggingReporter() # type: BaseReporter - else: - reporter = PipReporter() - resolver = RLResolver( - provider, - reporter, - ) # type: RLResolver[Requirement, Candidate, str] - - try: - try_to_avoid_resolution_too_deep = 2000000 - result = self._result = resolver.resolve( - requirements, max_rounds=try_to_avoid_resolution_too_deep - ) - - except ResolutionImpossible as e: - error = self.factory.get_installation_error( - cast("ResolutionImpossible[Requirement, Candidate]", e), - constraints, - ) - raise error from e - - req_set = RequirementSet(check_supported_wheels=check_supported_wheels) - for candidate in result.mapping.values(): - ireq = candidate.get_install_requirement() - if ireq is None: - continue - - # Check if there is already an installation under the same name, - # and set a flag for later stages to uninstall it, if needed. - installed_dist = self.factory.get_dist_to_uninstall(candidate) - if installed_dist is None: - # There is no existing installation -- nothing to uninstall. - ireq.should_reinstall = False - elif self.factory.force_reinstall: - # The --force-reinstall flag is set -- reinstall. - ireq.should_reinstall = True - elif parse_version(installed_dist.version) != candidate.version: - # The installation is different in version -- reinstall. - ireq.should_reinstall = True - elif candidate.is_editable or dist_is_editable(installed_dist): - # The incoming distribution is editable, or different in - # editable-ness to installation -- reinstall. - ireq.should_reinstall = True - elif candidate.source_link and candidate.source_link.is_file: - # The incoming distribution is under file:// - if candidate.source_link.is_wheel: - # is a local wheel -- do nothing. - logger.info( - "%s is already installed with the same version as the " - "provided wheel. Use --force-reinstall to force an " - "installation of the wheel.", - ireq.name, - ) - continue - - looks_like_sdist = ( - is_archive_file(candidate.source_link.file_path) - and candidate.source_link.ext != ".zip" - ) - if looks_like_sdist: - # is a local sdist -- show a deprecation warning! - reason = ( - "Source distribution is being reinstalled despite an " - "installed package having the same name and version as " - "the installed package." - ) - replacement = "use --force-reinstall" - deprecated( - reason=reason, - replacement=replacement, - gone_in="21.2", - issue=8711, - ) - - # is a local sdist or path -- reinstall - ireq.should_reinstall = True - else: - continue - - link = candidate.source_link - if link and link.is_yanked: - # The reason can contain non-ASCII characters, Unicode - # is required for Python 2. - msg = ( - "The candidate selected for download or install is a " - "yanked version: {name!r} candidate (version {version} " - "at {link})\nReason for being yanked: {reason}" - ).format( - name=candidate.name, - version=candidate.version, - link=link, - reason=link.yanked_reason or "", - ) - logger.warning(msg) - - req_set.add_named_requirement(ireq) - - reqs = req_set.all_requirements - self.factory.preparer.prepare_linked_requirements_more(reqs) - return req_set - - def get_installation_order(self, req_set): - # type: (RequirementSet) -> List[InstallRequirement] - """Get order for installation of requirements in RequirementSet. - - The returned list contains a requirement before another that depends on - it. This helps ensure that the environment is kept consistent as they - get installed one-by-one. - - The current implementation creates a topological ordering of the - dependency graph, while breaking any cycles in the graph at arbitrary - points. We make no guarantees about where the cycle would be broken, - other than they would be broken. - """ - assert self._result is not None, "must call resolve() first" - - graph = self._result.graph - weights = get_topological_weights( - graph, - expected_node_count=len(self._result.mapping) + 1, - ) - - sorted_items = sorted( - req_set.requirements.items(), - key=functools.partial(_req_set_item_sorter, weights=weights), - reverse=True, - ) - return [ireq for _, ireq in sorted_items] - - -def get_topological_weights(graph, expected_node_count): - # type: (DirectedGraph[Optional[str]], int) -> Dict[Optional[str], int] - """Assign weights to each node based on how "deep" they are. - - This implementation may change at any point in the future without prior - notice. - - We take the length for the longest path to any node from root, ignoring any - paths that contain a single node twice (i.e. cycles). This is done through - a depth-first search through the graph, while keeping track of the path to - the node. - - Cycles in the graph result would result in node being revisited while also - being it's own path. In this case, take no action. This helps ensure we - don't get stuck in a cycle. - - When assigning weight, the longer path (i.e. larger length) is preferred. - """ - path = set() # type: Set[Optional[str]] - weights = {} # type: Dict[Optional[str], int] - - def visit(node): - # type: (Optional[str]) -> None - if node in path: - # We hit a cycle, so we'll break it here. - return - - # Time to visit the children! - path.add(node) - for child in graph.iter_children(node): - visit(child) - path.remove(node) - - last_known_parent_count = weights.get(node, 0) - weights[node] = max(last_known_parent_count, len(path)) - - # `None` is guaranteed to be the root node by resolvelib. - visit(None) - - # Sanity checks - assert weights[None] == 0 - assert len(weights) == expected_node_count - - return weights - - -def _req_set_item_sorter( - item, # type: Tuple[str, InstallRequirement] - weights, # type: Dict[Optional[str], int] -): - # type: (...) -> Tuple[int, str] - """Key function used to sort install requirements for installation. - - Based on the "weight" mapping calculated in ``get_installation_order()``. - The canonical package name is returned as the second member as a tie- - breaker to ensure the result is predictable, which is useful in tests. - """ - name = canonicalize_name(item[0]) - return weights[name], name diff --git a/venv/Lib/site-packages/pip/_internal/self_outdated_check.py b/venv/Lib/site-packages/pip/_internal/self_outdated_check.py deleted file mode 100644 index 6b24965..0000000 --- a/venv/Lib/site-packages/pip/_internal/self_outdated_check.py +++ /dev/null @@ -1,187 +0,0 @@ -import datetime -import hashlib -import json -import logging -import optparse -import os.path -import sys -from typing import Any, Dict - -from pip._vendor.packaging.version import parse as parse_version - -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.models.selection_prefs import SelectionPreferences -from pip._internal.network.session import PipSession -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" - - -logger = logging.getLogger(__name__) - - -def _get_statefile_name(key): - # type: (str) -> str - key_bytes = key.encode() - name = hashlib.sha224(key_bytes).hexdigest() - return name - - -class SelfCheckState: - def __init__(self, cache_dir): - # type: (str) -> None - self.state = {} # type: Dict[str, Any] - self.statefile_path = None - - # Try to load the existing state - if cache_dir: - 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) - except (OSError, ValueError, KeyError): - # Explicitly suppressing exceptions, since we don't want to - # error out if the cache file is invalid. - pass - - @property - def key(self): - # type: () -> str - return sys.prefix - - def save(self, pypi_version, current_time): - # type: (str, datetime.datetime) -> None - # If we do not have a path to cache in, don't bother saving. - 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)): - 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)) - - 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), - "pypi_version": pypi_version, - } - - text = json.dumps(state, sort_keys=True, separators=(",", ":")) - - 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) - except OSError: - # Best effort. - pass - - -def was_installed_by_pip(pkg): - # type: (str) -> bool - """Checks whether pkg was installed by pip - - This is used not to display the upgrade message when pip is in fact - installed by system package manager, such as dnf on Fedora. - """ - dist = get_default_environment().get_distribution(pkg) - return dist is not None and "pip" == dist.installer - - -def pip_self_version_check(session, options): - # type: (PipSession, optparse.Values) -> None - """Check for an update for pip. - - Limit the frequency of checks to once per week. State is stored either in - the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix - of the pip script path. - """ - installed_dist = get_default_environment().get_distribution("pip") - 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, - ) - 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`. - 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 - ) - except Exception: - logger.debug( - "There was an error checking the latest version of pip", - exc_info=True, - ) diff --git a/venv/Lib/site-packages/pip/_internal/utils/__init__.py b/venv/Lib/site-packages/pip/_internal/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index c5b84af6fcb86ae6db48d62c4b17fb300cd5c263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmYj~JqiLb5QVc~A;O-)+CmQ?A~v=*wgVyV4skF)W0GCiBY7oTk6>rzq|yiPd(792 zY1@U8+}+aDeO3IYk>eoEGeNJ;YSo+`Dpmc%r#o(;#}Qp*;1q2#-czu^Q@O^VEfuiF zqt0wPgb~9CjxLa?;9AtpSj@o0peYng!8jNSxeQta6|FZsJ?A?g`@!M9K7UKq7qSgB A#Q*>R diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc deleted file mode 100644 index d64328097dc618e1cdbf100663683f13439ca13f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1255 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 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc deleted file mode 100644 index 81b714a00e6707945c5ed649ec4272e84f6ea6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2510 zcmZWqTW=dh6rS0e*XzxtX`0@Et^`F`P%EHHKt-!YO(KfgRBCz=D@)srcVch47k6fy zl61`jtx#Y33kp*Ff&`B|@B{c6`^pnPfrzM_GwU>NS<5qL&YU@O=FB(W38$tU0^g(L zTo}v{@)r&!KOF{F;V+&;6Oo7}#IJhlQy6QBmg>GvQKu(HYWk*}SNEkESChYCNO(CgbB(a|uX@n=A9!T%ck#UIcVWRHvpB?XP>Nix*BWT;D8kS$H>Pc?p}&?0Tm z!10y|t)-;eNdFvcv#-aNHdrQwhV!UbHg*1Eq3=1BJff6jXU5izrfTjv*M2hm_{s3y` z)?uX)Lt=Ry5>{Fuq@m;u9OwhMn|dct(^v*^#7$Hhy-@T@EA01K7I7O@?&M~rv6aVJ z(}{4BWHPggFrBeu6heZeQ1wY%oKKHyucUpdKKW)Tx;qIA^bQTsGP%VWkRwj z;A|Uk1uUTRIhf+J*epP^PcJtqp9iTqTUxOQ;O$l*Tj(+wY{2yaoB}{!AUZvOc4>|K zd7K9fq3<9Bn{Xg|=V^fcFTjjgg@$Mr01#nlymAb~vZ-a-06*^MH~eaN4dX>%elF;=%^t)1c%&`4-C8kbVywygrr|$s$OA zBz^a{TN^TrGhnvm!y4e>xk1r?*oDiia^0G&F)hdO;JeM_fM>#6%QNQ1o1W}3FPbPt z9^9dq<=%s%l(x1+o;~nVCPSz);U~&Z&T;kstzzNDnIg=VvRm6dtBR7>4>^!$*E=sf z04#Ku;NNsh7d8wIeRHfv3WFt39b6=CT_Nn$x)B7s!Wypx0mDV;E3Gv*qiQO^Gh90eWOa79jH77 w0l$d8k*w8IPzRhynR=4yHQHZ6n1h5}!N($yzOV?mnyY!X3%#S;r<~9J0}VE{k^lez diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc deleted file mode 100644 index 262dd9b5695d224c99f96269788176749eaa5f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055 zcmZ`3%Wl&^aM!Q6Aw@|+l{n$6B^q(ygeamS1rDe};(&;ZtgStDwzb#p?m9G4!UeAU z190P)eC5Q258%YC+cY_pv37QLW_EU-X4~6cf^eSSXMY?*ewo82Sa^7bON|hvB&9hi z=$KMNTe(%(W4op8+$r3#TX1X=E+ zEMWggdd8|f-{wMTmgjrNOx?sznPzM4{z`iSECs37lHN*^^W!!5TEEJf{*R=VaI-`u zl2>};jm|2NmGiDFOMU%X98S-S!k_bpt{aj92`I9bvK8IccZp%Lqv!E7dqWmb< zHj#pWXQGsl4qG*B0SBK{q1z1Nbk!hn);2`rUGCC!W#iQq784pjM#V(Oap+3F6-ZEZ zt{WQ-H8gJA)~BCD4p91+A3ly!m_lAw5k{FwRumXhRL%6H6miCNl(7P0Rj~x3DTrx= z<%|^9u!pQOmVt^YUPUn%8l+%()HZRn_SOV2tY*#K%H(n*3?sOQPN+U2(s8IyExJp4 zj%VGb@(%Kj!fw;QwloAY7V0wI-8K8f49Qheq>a}aPtPihLgEY)Y5D`xf+NIBp`>Y* g)_9wM4YbqhJt@kx&f%%)FlGJ*J=&vv%OCjmKi%gf`v3p{ diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-39.pyc deleted file mode 100644 index 2f4445ab993e2971bf47342c88688b2ca1672d3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1220 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 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc deleted file mode 100644 index 33a75bd27e9d52afe27f80b1cedfa845f95f1130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 802 zcmY*XO>fgc5Z$$%#7UF3>Y)V*315A{hu%O4QL0ppghG`>P^~Pv+w3M;b^XEaCT*;8 zf*%4${*tep`V-*9Y!cBh(mc(F$8X-)w9{!Ju+Q>2{p}$1%O=|fHS`u-UjQ&f5W~!o zICY4FZR|=n^@sa0#0tifv&hxp7VP44sh5#mko#t|Yd)?}@3i0rVPAqv~& z;hB)!EDIipY?7;#8j)vF>jBtMh^yLYUPumsuL~&*zcZy5-Ogm_lzwEWimuCJsF>?A ztd)&b<*u}aHOg{RgrK?V$}*+UFGUf$o8ELautuuJ*ivuIs<(a$t^)vr?$KAw@Kf|1 z|3F{xJvPn)sb|a?BIbf3uY5V+X0Ebeq~;)M5?p08lkVlH+aLBm^oOBSdG@W93kUg$R1+Tm z!@93x#ur@XMO>(Ss%V;uY#J9!Gt0ANDoi|unM4m7O@o9v4*R@fYJ?}avc|< zh!c?+t}-g)xe-#wb~pQlbW|*>J)x7$(ur*x0=4!5kh_n4>|wP7aX)NVjU-|DI7zBH z48tPI9yYC;RlHGUY_%R)l&L!DScS-N!zkGBu*veHM nI9D63ZnOpVudn>qY0l=7zp;nc2LPVicG`{yI=qHev+w=|5{%bD diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc deleted file mode 100644 index ca0babebdcfe3b3dee033e1002f5bf52b5c093c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1612 zcmb7ETW=gS6t+D#XL6wpRV1JSBk{mW?W%$&5LAUUprB|2-O`HHNW*08-JN7^*q&6o z+IwhBcewjI8hPB~KD0g$IE6OgTReo8ay&%6?Z4q9 zH0TjSPivi3Ws)23WmD%OwF|ckhQT3J1usJyU7cu;p&MB$Hp#QIlwAs` z;4G%J%*x3lR!KIfO2M)*D=WRBz+pGf-f znAZIB>(Q4H7ndTh>Zq30L?%T6_eAwfPpdMXWICE8g@{$1q$0W$yCG`V)TbAzwl8x)ZxTH@EJeBVXd)4mSI&g>~h_WK3M9ik^_VM%l6&wi9yk;oa# z3ZSYGrA{n)tQvQ)-T`xkc%}L)RQtwzla-%;HZboV4&(0!KgTD>-yX)Vj$RCpPX|3} z95qvh)_J1Gl`IUYlnK_1c&g4bZT7y=K<`x8e8yy+%^T^yTWMeToN z$pEmBE|_rVq)_%`6J{VOrIRuhKpm*Y=OV4R=(+O1Zn+PFNQF{y2?}ThAm6j|+qXn_mmLor zK8C6ufYG(_?R@SvrLS z$4QfGd$uTQJzIOXhh-&86V=_7SJg#RvvC5F@3*TqDjf; Yii$V6cxsi=CS?kD+;gZ;_vw>=0T%qFcmMzZ diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-39.pyc deleted file mode 100644 index 09ed608bf629f094f5e6427b03f0660d80716adb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4994 zcmbVPQEwZ^5#HT9QYVU}Wm!>d$4D+|o0O@eIBC+Ru4>q|)mTl!1eTj12L|U8_e7p_ z#w*9&X~&ze6LLMI1bV% z=`Jgks2a~^R2WFV+3t5YH69B-eSwZsPws_jUv;yhZU=9_`-7ULDp1Nie*e99%>CWB z-fohn<39@zH*x80G$Hf2WS)@Rv*ZiXlJ+C+*|H#ukC;~oi*iajkJvuOpYJ z-BCfW7b-Vx2dTT(k7B9aPCrhgUL3k@Bj#cx={7?*=t{TQ4x5`A;$g=PT0sP(m0bKb zyU9-XjaHIKcRPstp)Q%%^`^i^kA4Mo2wAsr>37gXY)=fiJA8;qS|LP^-`4@1LX?Ib4aX)b4Q1x|zzTf~ z7}`3F*Rx`7t!!#EkXg_nvp2(C{gkOo*zH%r^7V!cx5GH;HF_#(LG=!FYV>x~cGC4* zQQBxhTVMBrX4u#cyW5R8T5D)5{RUob22iWfi+T+on+a7nh#UPhighDjda<_)y)YJ~ zzW);0*aUge<_@0~RX#YE`+f09X2Ln-7`h0edJRp=hCJo_LRVA3X2|uz6PW)A*Dnrn z&t11+9oWWcR~zEjY|nav@eOO6tD9R_AG61N9WImNku$XJ0LVk}gu$6t;aagzuC(e+ zj+KsngcZWb1zh??G%Yq{Uo7nLA;+}r3A@C$nX-rc4`Rz+&5c^)io|Oo6N}d}zWr3F z=kct-YPo>Aj9yk+BCj`-PVdG~@ceIFZ1BplJpgUrUtEflW)SNe=o|^dy`=~Q0d7DD zs9Bn;T2IoI4g#bT!VS`_ug+tnW}9WRLW1~Enbi$H3i)QfZ zNb~#?znS#A>6nd=K0t6;y5Gso_#J%sl#hAuWQp?lJU1by4Yyc>3umm;q}?6;s86^e z)$|-1Vv`Ma09>`$q1eVwYkcr#PU-GWJ0$lJ$GNQtQ8>m4ZlpmiCh!+w5<*^PwL;{U z-1F0IP^M3mg24CK${Nb8BK^6crkFp3-3?3*0rS7^)Ixa|01#8GcVDmf!qjyZnGDw5PJjZ~v z-Frc#Lzhfu$YP&hbY6~_5B2v z2zC@721`V5-~f;ZctCuK>I5wN8eRhH1Uh3QFsvchAJPjGp2sn&-o?9hTsfM>pfXY; zx5PIVKIX0}z5!SmG6M+cka7bb1kVOb;I2n;_(mLU0v~G|VKe=|uz+n{r(IAmp-DJ5 z7Ki=cV*2%KCSE!F9Cz|bP1G}?){yk9p5cS5r)YG=)P^V?cgKrFLOkF}J6KDSI1j$>VXo6k&-gyV zco3?@_a9>Xi1g=G<_?ki{&cAYlJoA!d;Hq$|A1PBx=M=t@x>Tn3Q_Mgm zSkO#i)BF>Z0`zL^8*?Z%X%>~lQ2{`@nMxsi*bIAgpm%jU*`ecKl+p>1CV_TpR2ED? zo@#0`3|*!)PT4*ZVk%lJ0$Km|q?md6PSSmiPMhnaYVpAX!bqqeJa9L60@Yf?;p90? zW6qDd56>GcWR;)Y`t;*_EBBZEySG;F8eBf**|hIB<3MX5=ETEieL{Cu8Evl_#^BbmHC9Q^Ec6L_f5c^C9&ny2Pbqp=yP&S&mKD?8 z9-OFXgNk;jh@Vt}8ls8pA`Zuk$A{y^WB2R4dNF&Yy6v=}IYlo5pG{K=s2Q5EObuBk ztE}F?_i_Dw(^b diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc deleted file mode 100644 index 3f52aabce7969935883d6f65c5c5b890e074453a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 963 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 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-39.pyc deleted file mode 100644 index a9b27f54449c9639c541f01403fb7cf6ecc4056b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21518 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 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc deleted file mode 100644 index 4d5bff919933715eb93f3abe077a582070a09ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2518 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 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc deleted file mode 100644 index 9103918ec9bfc310ce4186ad614fd47dbee405de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2960 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 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc deleted file mode 100644 index d9cb6ff984d5d5431cdf643a9011c299cb81ce45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6834 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 VzbjSKfVCzXbL!q`m=&YJ{|m#hpP~Q& diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc deleted file mode 100644 index fced2e2e8a0bd446961dae7cfed5df610777adfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6455 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 X_Dh!IIFnA@sX0~0aW6UV8UOwdu#&iq diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc deleted file mode 100644 index b6688ad545801208227a0c1f3ff6584bc7e757e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346 zcmZ8hPmdcl6t_KpGRbC_qCzVw1XfR-LnEBE7!8jM6m;b~F{q3E%2Lb16 z_{_H;7-CqUX|M4V2cJx%pyQy4NS5g|#fU{L{u50HEMY0=j15=@ddTooln-A+HuNON zF8i^uwUVWnV;{O2-iB(>Blrvj!ElFGSdSTciaN9dpOHOb(I;q!_YlkDCztr-wcn?` z$cal#BWmjsp)R3M15MA+VcAldQmR8DVn+|X0^0jL-|E(YhemF!%UjBJ6do%17~LD6<>0H zs7XN}lHnL@kNG|@(acyZyo6=U)DzKi{f}hY|e)?fT>CYAKXD(_X=qabml5tv|8YNl_hGeuVS3Kl8 zZCLv)ybVL~!`*U0-m0kvG0J(yZ!tDVwm%vuT-2mJ(RZBO}{JiDH zy0Kp-0p(+u%85RNTkC-r9<5#s!Ey(F;mj(J=LZnzflNQbx3K;g{C9x#U6a5Ufcy=N zzFYR#-1#0c(xI2oHLs#S@bB2-GqMZd7ReTG$u5>F@)J2KYueNo#=-+j-ZuGHc_q z>n(2dtQ0MOthLhmre8URmB-ig=5b)v;h9S%w@^|~_4_Qt9#690b_bG}&p@Cg#^g;( zM*qg~Eixu49+43tIC~SvH?Y17EAo*ZgVLXZ2nR#cO+wFw(%li{^`YywOYORWr>^~r n3-2)WP)PMw4inW4&<^NX95r_=;zj2fevV;EsStMRc diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc deleted file mode 100644 index 494c7c21ec55bde9fadf20b862a1aa487e49f9d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3213 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 diff --git a/venv/Lib/site-packages/pip/_internal/utils/appdirs.py b/venv/Lib/site-packages/pip/_internal/utils/appdirs.py deleted file mode 100644 index db974da..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/appdirs.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -This code wraps the vendored appdirs module to so the return values are -compatible for the current pip code base. - -The intention is to rewrite current usages gradually, keeping the tests pass, -and eventually drop this after all usages are changed. -""" - -import os -from typing import List - -from pip._vendor import appdirs as _appdirs - - -def user_cache_dir(appname): - # type: (str) -> str - return _appdirs.user_cache_dir(appname, appauthor=False) - - -def user_config_dir(appname, roaming=True): - # type: (str, bool) -> str - path = _appdirs.user_config_dir(appname, appauthor=False, roaming=roaming) - if _appdirs.system == "darwin" and not os.path.isdir(path): - path = os.path.expanduser("~/.config/") - if appname: - path = os.path.join(path, appname) - return path - - -# for the discussion regarding site_config_dir locations -# see -def site_config_dirs(appname): - # type: (str) -> List[str] - dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True) - if _appdirs.system not in ["win32", "darwin"]: - # always look in /etc directly as well - return dirval.split(os.pathsep) + ["/etc"] - return [dirval] diff --git a/venv/Lib/site-packages/pip/_internal/utils/compat.py b/venv/Lib/site-packages/pip/_internal/utils/compat.py deleted file mode 100644 index 1fb2dc7..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/compat.py +++ /dev/null @@ -1,65 +0,0 @@ -"""Stuff that differs in different Python versions and platform -distributions.""" - -import logging -import os -import sys - -__all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"] - - -logger = logging.getLogger(__name__) - - -def has_tls(): - # type: () -> bool - try: - import _ssl # noqa: F401 # ignore unused - - return True - except ImportError: - pass - - from pip._vendor.urllib3.util import IS_PYOPENSSL - - return IS_PYOPENSSL - - -def get_path_uid(path): - # type: (str) -> int - """ - Return path's uid. - - Does not follow symlinks: - https://github.com/pypa/pip/pull/935#discussion_r5307003 - - Placed this function in compat due to differences on AIX and - Jython, that should eventually go away. - - :raises OSError: When path is a symlink or can't be read. - """ - if hasattr(os, "O_NOFOLLOW"): - fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) - file_uid = os.fstat(fd).st_uid - os.close(fd) - else: # AIX and Jython - # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW - if not os.path.islink(path): - # older versions of Jython don't have `os.fstat` - file_uid = os.stat(path).st_uid - else: - # raise OSError for parity with os.O_NOFOLLOW above - raise OSError(f"{path} is a symlink; Will not return uid for symlinks") - return file_uid - - -# packages in the stdlib that may have installation metadata, but should not be -# considered 'installed'. this theoretically could be determined based on -# dist.location (py27:`sysconfig.get_paths()['stdlib']`, -# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may -# make this ineffective, so hard-coding -stdlib_pkgs = {"python", "wsgiref", "argparse"} - - -# windows detection, covers cpython and ironpython -WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt") diff --git a/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py b/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py deleted file mode 100644 index 14fe51c..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +++ /dev/null @@ -1,174 +0,0 @@ -"""Generate and work with PEP 425 Compatibility Tags. -""" - -import re -from typing import TYPE_CHECKING, List, Optional, Tuple - -from pip._vendor.packaging.tags import ( - Tag, - compatible_tags, - cpython_tags, - generic_tags, - interpreter_name, - interpreter_version, - mac_platforms, -) - -if TYPE_CHECKING: - from pip._vendor.packaging.tags import PythonVersion - - -_osx_arch_pat = re.compile(r"(.+)_(\d+)_(\d+)_(.+)") - - -def version_info_to_nodot(version_info): - # type: (Tuple[int, ...]) -> str - # Only use up to the first two numbers. - return "".join(map(str, version_info[:2])) - - -def _mac_platforms(arch): - # type: (str) -> List[str] - match = _osx_arch_pat.match(arch) - if match: - name, major, minor, actual_arch = match.groups() - mac_version = (int(major), int(minor)) - arches = [ - # Since we have always only checked that the platform starts - # with "macosx", for backwards-compatibility we extract the - # actual prefix provided by the user in case they provided - # something like "macosxcustom_". It may be good to remove - # this as undocumented or deprecate it in the future. - "{}_{}".format(name, arch[len("macosx_") :]) - for arch in mac_platforms(mac_version, actual_arch) - ] - else: - # arch pattern didn't match (?!) - arches = [arch] - return arches - - -def _custom_manylinux_platforms(arch): - # type: (str) -> List[str] - arches = [arch] - arch_prefix, arch_sep, arch_suffix = arch.partition("_") - if arch_prefix == "manylinux2014": - # manylinux1/manylinux2010 wheels run on most manylinux2014 systems - # with the exception of wheels depending on ncurses. PEP 599 states - # manylinux1/manylinux2010 wheels should be considered - # manylinux2014 wheels: - # https://www.python.org/dev/peps/pep-0599/#backwards-compatibility-with-manylinux2010-wheels - if arch_suffix in {"i686", "x86_64"}: - arches.append("manylinux2010" + arch_sep + arch_suffix) - arches.append("manylinux1" + arch_sep + arch_suffix) - elif arch_prefix == "manylinux2010": - # manylinux1 wheels run on most manylinux2010 systems with the - # exception of wheels depending on ncurses. PEP 571 states - # manylinux1 wheels should be considered manylinux2010 wheels: - # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels - arches.append("manylinux1" + arch_sep + arch_suffix) - return arches - - -def _get_custom_platforms(arch): - # type: (str) -> List[str] - arch_prefix, arch_sep, arch_suffix = arch.partition("_") - if arch.startswith("macosx"): - arches = _mac_platforms(arch) - elif arch_prefix in ["manylinux2014", "manylinux2010"]: - arches = _custom_manylinux_platforms(arch) - else: - arches = [arch] - return arches - - -def _expand_allowed_platforms(platforms): - # type: (Optional[List[str]]) -> Optional[List[str]] - if not platforms: - return None - - seen = set() - result = [] - - for p in platforms: - if p in seen: - continue - additions = [c for c in _get_custom_platforms(p) if c not in seen] - seen.update(additions) - result.extend(additions) - - return result - - -def _get_python_version(version): - # type: (str) -> PythonVersion - if len(version) > 1: - return int(version[0]), int(version[1:]) - else: - return (int(version[0]),) - - -def _get_custom_interpreter(implementation=None, version=None): - # type: (Optional[str], Optional[str]) -> str - if implementation is None: - implementation = interpreter_name() - if version is None: - version = interpreter_version() - return f"{implementation}{version}" - - -def get_supported( - version=None, # type: Optional[str] - platforms=None, # type: Optional[List[str]] - impl=None, # type: Optional[str] - abis=None, # type: Optional[List[str]] -): - # type: (...) -> List[Tag] - """Return a list of supported tags for each version specified in - `versions`. - - :param version: a string version, of the form "33" or "32", - or None. The version will be assumed to support our ABI. - :param platform: specify a list of platforms you want valid - tags for, or None. If None, use the local system platform. - :param impl: specify the exact implementation you want valid - tags for, or None. If None, use the local interpreter impl. - :param abis: specify a list of abis you want valid - tags for, or None. If None, use the local interpreter abi. - """ - supported = [] # type: List[Tag] - - python_version = None # type: Optional[PythonVersion] - if version is not None: - python_version = _get_python_version(version) - - interpreter = _get_custom_interpreter(impl, version) - - platforms = _expand_allowed_platforms(platforms) - - is_cpython = (impl or interpreter_name()) == "cp" - if is_cpython: - supported.extend( - cpython_tags( - python_version=python_version, - abis=abis, - platforms=platforms, - ) - ) - else: - supported.extend( - generic_tags( - interpreter=interpreter, - abis=abis, - platforms=platforms, - ) - ) - supported.extend( - compatible_tags( - python_version=python_version, - interpreter=interpreter, - platforms=platforms, - ) - ) - - return supported diff --git a/venv/Lib/site-packages/pip/_internal/utils/datetime.py b/venv/Lib/site-packages/pip/_internal/utils/datetime.py deleted file mode 100644 index b638646..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/datetime.py +++ /dev/null @@ -1,12 +0,0 @@ -"""For when pip wants to check the date or time. -""" - -import datetime - - -def today_is_later_than(year, month, day): - # type: (int, int, int) -> bool - today = datetime.date.today() - given = datetime.date(year, month, day) - - return today > given diff --git a/venv/Lib/site-packages/pip/_internal/utils/deprecation.py b/venv/Lib/site-packages/pip/_internal/utils/deprecation.py deleted file mode 100644 index b62b3fb..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/deprecation.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -A module that implements tooling to enable easy warnings about deprecations. -""" - -import logging -import warnings -from typing import Any, Optional, TextIO, Type, Union - -from pip._vendor.packaging.version import parse - -from pip import __version__ as current_version - -DEPRECATION_MSG_PREFIX = "DEPRECATION: " - - -class PipDeprecationWarning(Warning): - pass - - -_original_showwarning = None # type: Any - - -# Warnings <-> Logging Integration -def _showwarning( - message, # type: Union[Warning, str] - category, # type: Type[Warning] - filename, # type: str - lineno, # type: int - file=None, # type: Optional[TextIO] - line=None, # type: Optional[str] -): - # type: (...) -> None - if file is not None: - if _original_showwarning is not None: - _original_showwarning(message, category, filename, lineno, file, line) - elif issubclass(category, PipDeprecationWarning): - # We use a specially named logger which will handle all of the - # deprecation messages for pip. - logger = logging.getLogger("pip._internal.deprecations") - logger.warning(message) - else: - _original_showwarning(message, category, filename, lineno, file, line) - - -def install_warning_logger(): - # type: () -> None - # Enable our Deprecation Warnings - warnings.simplefilter("default", PipDeprecationWarning, append=True) - - global _original_showwarning - - if _original_showwarning is None: - _original_showwarning = warnings.showwarning - warnings.showwarning = _showwarning - - -def deprecated(reason, replacement, gone_in, issue=None): - # type: (str, Optional[str], Optional[str], Optional[int]) -> None - """Helper to deprecate existing functionality. - - reason: - Textual reason shown to the user about why this functionality has - been deprecated. - replacement: - Textual suggestion shown to the user about what alternative - functionality they can use. - gone_in: - The version of pip does this functionality should get removed in. - Raises errors if pip's current version is greater than or equal to - this. - issue: - Issue number on the tracker that would serve as a useful place for - users to find related discussion and provide feedback. - - Always pass replacement, gone_in and issue as keyword arguments for clarity - at the call site. - """ - - # Construct a nice message. - # This is eagerly formatted as we want it to get logged as if someone - # typed this entire message out. - sentences = [ - (reason, DEPRECATION_MSG_PREFIX + "{}"), - (gone_in, "pip {} will remove support for this functionality."), - (replacement, "A possible replacement is {}."), - ( - issue, - ( - "You can find discussion regarding this at " - "https://github.com/pypa/pip/issues/{}." - ), - ), - ] - message = " ".join( - template.format(val) for val, template in sentences if val is not None - ) - - # Raise as an error if it has to be removed. - if gone_in is not None and parse(current_version) >= parse(gone_in): - raise PipDeprecationWarning(message) - - warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py b/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py deleted file mode 100644 index eb50ac4..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +++ /dev/null @@ -1,117 +0,0 @@ -import json -import logging -from typing import Optional - -from pip._vendor.pkg_resources import Distribution - -from pip._internal.models.direct_url import ( - DIRECT_URL_METADATA_NAME, - ArchiveInfo, - DirectUrl, - DirectUrlValidationError, - DirInfo, - VcsInfo, -) -from pip._internal.models.link import Link -from pip._internal.vcs import vcs - -logger = logging.getLogger(__name__) - - -def direct_url_as_pep440_direct_reference(direct_url, name): - # type: (DirectUrl, str) -> str - """Convert a DirectUrl to a pip requirement string.""" - direct_url.validate() # if invalid, this is a pip bug - requirement = name + " @ " - fragments = [] - if isinstance(direct_url.info, VcsInfo): - requirement += "{}+{}@{}".format( - direct_url.info.vcs, direct_url.url, direct_url.info.commit_id - ) - elif isinstance(direct_url.info, ArchiveInfo): - requirement += direct_url.url - if direct_url.info.hash: - fragments.append(direct_url.info.hash) - else: - assert isinstance(direct_url.info, DirInfo) - requirement += direct_url.url - if direct_url.subdirectory: - fragments.append("subdirectory=" + direct_url.subdirectory) - if fragments: - requirement += "#" + "&".join(fragments) - return requirement - - -def direct_url_from_link(link, source_dir=None, link_is_in_wheel_cache=False): - # type: (Link, Optional[str], bool) -> DirectUrl - if link.is_vcs: - vcs_backend = vcs.get_backend_for_scheme(link.scheme) - assert vcs_backend - url, requested_revision, _ = vcs_backend.get_url_rev_and_auth( - link.url_without_fragment - ) - # For VCS links, we need to find out and add commit_id. - if link_is_in_wheel_cache: - # If the requested VCS link corresponds to a cached - # wheel, it means the requested revision was an - # immutable commit hash, otherwise it would not have - # been cached. In that case we don't have a source_dir - # with the VCS checkout. - assert requested_revision - commit_id = requested_revision - else: - # If the wheel was not in cache, it means we have - # had to checkout from VCS to build and we have a source_dir - # which we can inspect to find out the commit id. - assert source_dir - commit_id = vcs_backend.get_revision(source_dir) - return DirectUrl( - url=url, - info=VcsInfo( - vcs=vcs_backend.name, - commit_id=commit_id, - requested_revision=requested_revision, - ), - subdirectory=link.subdirectory_fragment, - ) - elif link.is_existing_dir(): - return DirectUrl( - url=link.url_without_fragment, - info=DirInfo(), - subdirectory=link.subdirectory_fragment, - ) - else: - hash = None - hash_name = link.hash_name - if hash_name: - hash = f"{hash_name}={link.hash}" - return DirectUrl( - url=link.url_without_fragment, - info=ArchiveInfo(hash=hash), - subdirectory=link.subdirectory_fragment, - ) - - -def dist_get_direct_url(dist): - # type: (Distribution) -> Optional[DirectUrl] - """Obtain a DirectUrl from a pkg_resource.Distribution. - - Returns None if the distribution has no `direct_url.json` metadata, - or if `direct_url.json` is invalid. - """ - if not dist.has_metadata(DIRECT_URL_METADATA_NAME): - return None - try: - return DirectUrl.from_json(dist.get_metadata(DIRECT_URL_METADATA_NAME)) - except ( - DirectUrlValidationError, - json.JSONDecodeError, - UnicodeDecodeError, - ) as e: - logger.warning( - "Error parsing %s for %s: %s", - DIRECT_URL_METADATA_NAME, - dist.project_name, - e, - ) - return None diff --git a/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py b/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py deleted file mode 100644 index e886c88..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py +++ /dev/null @@ -1,43 +0,0 @@ -from distutils.errors import DistutilsArgError -from distutils.fancy_getopt import FancyGetopt -from typing import Dict, List - -_options = [ - ("exec-prefix=", None, ""), - ("home=", None, ""), - ("install-base=", None, ""), - ("install-data=", None, ""), - ("install-headers=", None, ""), - ("install-lib=", None, ""), - ("install-platlib=", None, ""), - ("install-purelib=", None, ""), - ("install-scripts=", None, ""), - ("prefix=", None, ""), - ("root=", None, ""), - ("user", None, ""), -] - - -# typeshed doesn't permit Tuple[str, None, str], see python/typeshed#3469. -_distutils_getopt = FancyGetopt(_options) # type: ignore - - -def parse_distutils_args(args): - # type: (List[str]) -> Dict[str, str] - """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: - # 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__) - return result diff --git a/venv/Lib/site-packages/pip/_internal/utils/encoding.py b/venv/Lib/site-packages/pip/_internal/utils/encoding.py deleted file mode 100644 index 7c8893d..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/encoding.py +++ /dev/null @@ -1,37 +0,0 @@ -import codecs -import locale -import re -import sys -from typing import List, Tuple - -BOMS = [ - (codecs.BOM_UTF8, "utf-8"), - (codecs.BOM_UTF16, "utf-16"), - (codecs.BOM_UTF16_BE, "utf-16-be"), - (codecs.BOM_UTF16_LE, "utf-16-le"), - (codecs.BOM_UTF32, "utf-32"), - (codecs.BOM_UTF32_BE, "utf-32-be"), - (codecs.BOM_UTF32_LE, "utf-32-le"), -] # type: List[Tuple[bytes, str]] - -ENCODING_RE = re.compile(br"coding[:=]\s*([-\w.]+)") - - -def auto_decode(data): - # type: (bytes) -> str - """Check a bytes string for a BOM to correctly detect the encoding - - Fallback to locale.getpreferredencoding(False) like open() on Python3""" - for bom, encoding in BOMS: - if data.startswith(bom): - return data[len(bom) :].decode(encoding) - # Lets check the first two lines as in PEP263 - for line in data.split(b"\n")[:2]: - if line[0:1] == b"#" and ENCODING_RE.search(line): - result = ENCODING_RE.search(line) - assert result is not None - encoding = result.groups()[0].decode("ascii") - return data.decode(encoding) - return data.decode( - locale.getpreferredencoding(False) or sys.getdefaultencoding(), - ) diff --git a/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py b/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py deleted file mode 100644 index 879bf21..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +++ /dev/null @@ -1,28 +0,0 @@ -import sys -from typing import List, Optional - -from pip._internal.cli.main import main - - -def _wrapper(args=None): - # type: (Optional[List[str]]) -> int - """Central wrapper for all old entrypoints. - - Historically pip has had several entrypoints defined. Because of issues - arising from PATH, sys.path, multiple Pythons, their interactions, and most - of them having a pip installed, users suffer every time an entrypoint gets - moved. - - To alleviate this pain, and provide a mechanism for warning users and - directing them to an appropriate place for help, we now define all of - our old entrypoints as wrappers for the current one. - """ - sys.stderr.write( - "WARNING: pip is being invoked by an old script wrapper. This will " - "fail in a future version of pip.\n" - "Please see https://github.com/pypa/pip/issues/5599 for advice on " - "fixing the underlying issue.\n" - "To avoid this problem you can invoke Python with '-m pip' instead of " - "running pip directly.\n" - ) - return main(args) diff --git a/venv/Lib/site-packages/pip/_internal/utils/filesystem.py b/venv/Lib/site-packages/pip/_internal/utils/filesystem.py deleted file mode 100644 index 3db97dc..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/filesystem.py +++ /dev/null @@ -1,193 +0,0 @@ -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 pip._vendor.tenacity import retry, stop_after_delay, wait_fixed - -from pip._internal.utils.compat import get_path_uid -from pip._internal.utils.misc import format_size - - -def check_path_owner(path): - # type: (str) -> bool - # If we don't have a way to check the effective uid of this process, then - # we'll just assume that we own the directory. - if sys.platform == "win32" or not hasattr(os, "geteuid"): - return True - - assert os.path.isabs(path) - - previous = None - while path != previous: - if os.path.lexists(path): - # Check if path is writable by current user. - if os.geteuid() == 0: - # Special handling for root user in order to handle properly - # cases where users use sudo without -H flag. - try: - path_uid = get_path_uid(path) - except OSError: - return False - return path_uid == 0 - else: - return os.access(path, os.W_OK) - else: - previous, path = path, os.path.dirname(path) - return False # assume we don't own the path - - -def copy2_fixed(src, dest): - # type: (str, 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): - # type: (str) -> bool - return stat.S_ISSOCK(os.lstat(path).st_mode) - - -@contextmanager -def adjacent_tmp_file(path, **kwargs): - # type: (str, **Any) -> Iterator[BinaryIO] - """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 - after the context reaches its end. - - kwargs will be passed to tempfile.NamedTemporaryFile to control - the way the temporary file will be opened. - """ - with NamedTemporaryFile( - delete=False, - dir=os.path.dirname(path), - prefix=os.path.basename(path), - suffix=".tmp", - **kwargs, - ) as f: - result = cast(BinaryIO, f) - try: - yield result - finally: - result.flush() - os.fsync(result.fileno()) - - -# Tenacity raises RetryError by default, explictly raise the original exception -_replace_retry = retry(reraise=True, stop=stop_after_delay(1), wait=wait_fixed(0.25)) - -replace = _replace_retry(os.replace) - - -# test_writable_dir and _test_writable_dir_win are copied from Flit, -# with the author's agreement to also place them under pip's license. -def test_writable_dir(path): - # type: (str) -> bool - """Check if a directory is writable. - - Uses os.access() on POSIX, tries creating files on Windows. - """ - # If the directory doesn't exist, find the closest parent that does. - while not os.path.isdir(path): - parent = os.path.dirname(path) - if parent == path: - break # Should never get here, but infinite loops are bad - path = parent - - if os.name == "posix": - return os.access(path, os.W_OK) - - return _test_writable_dir_win(path) - - -def _test_writable_dir_win(path): - # type: (str) -> bool - # os.access doesn't work on Windows: http://bugs.python.org/issue2528 - # and we can't use tempfile: http://bugs.python.org/issue22107 - basename = "accesstest_deleteme_fishfingers_custard_" - alphabet = "abcdefghijklmnopqrstuvwxyz0123456789" - for _ in range(10): - name = basename + "".join(random.choice(alphabet) for _ in range(6)) - file = os.path.join(path, name) - try: - fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL) - except FileExistsError: - pass - except PermissionError: - # This could be because there's a directory with the same name. - # But it's highly unlikely there's a directory called that, - # so we'll assume it's because the parent dir is not writable. - # This could as well be because the parent dir is not readable, - # due to non-privileged user access. - return False - else: - os.close(fd) - os.unlink(file) - return True - - # This should never be reached - raise OSError("Unexpected condition testing for writable directory") - - -def find_files(path, pattern): - # type: (str, str) -> List[str] - """Returns a list of absolute paths of files beneath path, recursively, - with filenames which match the UNIX-style shell glob pattern.""" - result = [] # type: List[str] - for root, _, files in os.walk(path): - matches = fnmatch.filter(files, pattern) - result.extend(os.path.join(root, f) for f in matches) - return result - - -def file_size(path): - # type: (str) -> Union[int, float] - # If it's a symlink, return 0. - if os.path.islink(path): - return 0 - return os.path.getsize(path) - - -def format_file_size(path): - # type: (str) -> str - return format_size(file_size(path)) - - -def directory_size(path): - # type: (str) -> Union[int, float] - size = 0.0 - for root, _dirs, files in os.walk(path): - for filename in files: - file_path = os.path.join(root, filename) - size += file_size(file_path) - return size - - -def format_directory_size(path): - # type: (str) -> str - return format_size(directory_size(path)) diff --git a/venv/Lib/site-packages/pip/_internal/utils/filetypes.py b/venv/Lib/site-packages/pip/_internal/utils/filetypes.py deleted file mode 100644 index da93584..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/filetypes.py +++ /dev/null @@ -1,28 +0,0 @@ -"""Filetype information. -""" - -from typing import Tuple - -from pip._internal.utils.misc import splitext - -WHEEL_EXTENSION = ".whl" -BZ2_EXTENSIONS = (".tar.bz2", ".tbz") # type: Tuple[str, ...] -XZ_EXTENSIONS = ( - ".tar.xz", - ".txz", - ".tlz", - ".tar.lz", - ".tar.lzma", -) # type: Tuple[str, ...] -ZIP_EXTENSIONS = (".zip", WHEEL_EXTENSION) # type: Tuple[str, ...] -TAR_EXTENSIONS = (".tar.gz", ".tgz", ".tar") # type: Tuple[str, ...] -ARCHIVE_EXTENSIONS = ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS - - -def is_archive_file(name): - # type: (str) -> bool - """Return True if `name` is a considered as an archive file.""" - ext = splitext(name)[1].lower() - if ext in ARCHIVE_EXTENSIONS: - return True - return False diff --git a/venv/Lib/site-packages/pip/_internal/utils/glibc.py b/venv/Lib/site-packages/pip/_internal/utils/glibc.py deleted file mode 100644 index 1c9ff35..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/glibc.py +++ /dev/null @@ -1,92 +0,0 @@ -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import os -import sys -from typing import Optional, Tuple - - -def glibc_version_string(): - # type: () -> Optional[str] - "Returns glibc version string, or None if not using glibc." - return glibc_version_string_confstr() or glibc_version_string_ctypes() - - -def glibc_version_string_confstr(): - # type: () -> Optional[str] - "Primary implementation of glibc_version_string using os.confstr." - # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely - # to be broken or missing. This strategy is used in the standard library - # platform module: - # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183 - if sys.platform == "win32": - return None - try: - # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17": - _, version = os.confstr("CS_GNU_LIBC_VERSION").split() - except (AttributeError, OSError, ValueError): - # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... - return None - return version - - -def glibc_version_string_ctypes(): - # type: () -> Optional[str] - "Fallback implementation of glibc_version_string using ctypes." - - try: - import ctypes - except ImportError: - return None - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - process_namespace = ctypes.CDLL(None) - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -# platform.libc_ver regularly returns completely nonsensical glibc -# versions. E.g. on my computer, platform says: -# -# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.7') -# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.9') -# -# But the truth is: -# -# ~$ ldd --version -# ldd (Debian GLIBC 2.22-11) 2.22 -# -# This is unfortunate, because it means that the linehaul data on libc -# versions that was generated by pip 8.1.2 and earlier is useless and -# misleading. Solution: instead of using platform, use our code that actually -# works. -def libc_ver(): - # type: () -> Tuple[str, str] - """Try to determine the glibc version - - Returns a tuple of strings (lib, version) which default to empty strings - in case the lookup fails. - """ - glibc_version = glibc_version_string() - if glibc_version is None: - return ("", "") - else: - return ("glibc", glibc_version) diff --git a/venv/Lib/site-packages/pip/_internal/utils/hashes.py b/venv/Lib/site-packages/pip/_internal/utils/hashes.py deleted file mode 100644 index 3d20b8d..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/hashes.py +++ /dev/null @@ -1,165 +0,0 @@ -import hashlib -from typing import TYPE_CHECKING, BinaryIO, Dict, Iterator, List - -from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError -from pip._internal.utils.misc import read_chunks - -if TYPE_CHECKING: - from hashlib import _Hash - - # NoReturn introduced in 3.6.2; imported only for type checking to maintain - # pip compatibility with older patch versions of Python 3.6 - from typing import NoReturn - - -# The recommended hash algo of the moment. Change this whenever the state of -# the art changes; it won't hurt backward compatibility. -FAVORITE_HASH = "sha256" - - -# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` -# Currently, those are the ones at least as collision-resistant as sha256. -STRONG_HASHES = ["sha256", "sha384", "sha512"] - - -class Hashes: - """A wrapper that builds multiple hashes at once and checks them against - known-good values - - """ - - def __init__(self, hashes=None): - # type: (Dict[str, List[str]]) -> None - """ - :param hashes: A dict of algorithm names pointing to lists of allowed - hex digests - """ - allowed = {} - if hashes is not None: - for alg, keys in hashes.items(): - # Make sure values are always sorted (to ease equality checks) - allowed[alg] = sorted(keys) - self._allowed = allowed - - def __and__(self, other): - # type: (Hashes) -> Hashes - if not isinstance(other, Hashes): - return NotImplemented - - # If either of the Hashes object is entirely empty (i.e. no hash - # specified at all), all hashes from the other object are allowed. - if not other: - return self - if not self: - return other - - # Otherwise only hashes that present in both objects are allowed. - new = {} - for alg, values in other._allowed.items(): - if alg not in self._allowed: - continue - new[alg] = [v for v in values if v in self._allowed[alg]] - return Hashes(new) - - @property - def digest_count(self): - # type: () -> int - return sum(len(digests) for digests in self._allowed.values()) - - def is_hash_allowed( - self, - hash_name, # type: str - hex_digest, # type: str - ): - # type: (...) -> bool - """Return whether the given hex digest is allowed.""" - return hex_digest in self._allowed.get(hash_name, []) - - def check_against_chunks(self, chunks): - # type: (Iterator[bytes]) -> None - """Check good hashes against ones built from iterable of chunks of - data. - - Raise HashMismatch if none match. - - """ - gots = {} - for hash_name in self._allowed.keys(): - try: - gots[hash_name] = hashlib.new(hash_name) - except (ValueError, TypeError): - raise InstallationError(f"Unknown hash name: {hash_name}") - - for chunk in chunks: - for hash in gots.values(): - hash.update(chunk) - - for hash_name, got in gots.items(): - if got.hexdigest() in self._allowed[hash_name]: - return - self._raise(gots) - - def _raise(self, gots): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMismatch(self._allowed, gots) - - def check_against_file(self, file): - # type: (BinaryIO) -> None - """Check good hashes against a file-like object - - Raise HashMismatch if none match. - - """ - return self.check_against_chunks(read_chunks(file)) - - def check_against_path(self, path): - # type: (str) -> None - with open(path, "rb") as file: - return self.check_against_file(file) - - def __nonzero__(self): - # type: () -> bool - """Return whether I know any known-good hashes.""" - return bool(self._allowed) - - def __bool__(self): - # type: () -> bool - return self.__nonzero__() - - def __eq__(self, other): - # type: (object) -> bool - if not isinstance(other, Hashes): - return NotImplemented - return self._allowed == other._allowed - - def __hash__(self): - # type: () -> int - return hash( - ",".join( - sorted( - ":".join((alg, digest)) - for alg, digest_list in self._allowed.items() - for digest in digest_list - ) - ) - ) - - -class MissingHashes(Hashes): - """A workalike for Hashes used when we're missing a hash for a requirement - - It computes the actual hash of the requirement and raises a HashMissing - exception showing it to the user. - - """ - - def __init__(self): - # type: () -> None - """Don't offer the ``hashes`` kwarg.""" - # Pass our favorite hash in to generate a "gotten hash". With the - # empty list, it will never match, so an error will always raise. - super().__init__(hashes={FAVORITE_HASH: []}) - - def _raise(self, gots): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py b/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py deleted file mode 100644 index b6863d9..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py +++ /dev/null @@ -1,36 +0,0 @@ -"""A helper module that injects SecureTransport, on import. - -The import should be done as early as possible, to ensure all requests and -sessions (or whatever) are created after injecting SecureTransport. - -Note that we only do the injection on macOS, when the linked OpenSSL is too -old to handle TLSv1.2. -""" - -import sys - - -def inject_securetransport(): - # type: () -> None - # Only relevant on macOS - if sys.platform != "darwin": - return - - try: - import ssl - except ImportError: - return - - # Checks for OpenSSL 1.0.1 - if ssl.OPENSSL_VERSION_NUMBER >= 0x1000100F: - return - - try: - from pip._vendor.urllib3.contrib import securetransport - except (ImportError, OSError): - return - - securetransport.inject_into_urllib3() - - -inject_securetransport() diff --git a/venv/Lib/site-packages/pip/_internal/utils/logging.py b/venv/Lib/site-packages/pip/_internal/utils/logging.py deleted file mode 100644 index 45798d5..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/logging.py +++ /dev/null @@ -1,387 +0,0 @@ -import contextlib -import errno -import logging -import logging.handlers -import os -import sys -from logging import Filter, getLogger -from typing import IO, Any, Callable, Iterator, Optional, TextIO, Type, cast - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX -from pip._internal.utils.misc import ensure_dir - -try: - import threading -except ImportError: - import dummy_threading as threading # type: ignore - - -try: - from pip._vendor import colorama -# Lots of different errors can come from this, including SystemError and -# ImportError. -except Exception: - colorama = None - - -_log_state = threading.local() -subprocess_logger = getLogger("pip.subprocessor") - - -class BrokenStdoutLoggingError(Exception): - """ - Raised if BrokenPipeError occurs for the stdout stream while logging. - """ - - pass - - -# BrokenPipeError manifests differently in Windows and non-Windows. -if WINDOWS: - # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: - # https://bugs.python.org/issue19612 - # https://bugs.python.org/issue30418 - def _is_broken_pipe_error(exc_class, exc): - # type: (Type[BaseException], BaseException) -> bool - """See the docstring for non-Windows below.""" - return (exc_class is BrokenPipeError) or ( - isinstance(exc, OSError) and exc.errno in (errno.EINVAL, errno.EPIPE) - ) - - -else: - # Then we are in the non-Windows case. - def _is_broken_pipe_error(exc_class, exc): - # type: (Type[BaseException], BaseException) -> bool - """ - Return whether an exception is a broken pipe error. - - Args: - exc_class: an exception class. - exc: an exception instance. - """ - return exc_class is BrokenPipeError - - -@contextlib.contextmanager -def indent_log(num=2): - # type: (int) -> Iterator[None] - """ - A context manager which will cause the log output to be indented for any - log messages emitted inside it. - """ - # For thread-safety - _log_state.indentation = get_indentation() - _log_state.indentation += num - try: - yield - finally: - _log_state.indentation -= num - - -def get_indentation(): - # type: () -> int - return getattr(_log_state, "indentation", 0) - - -class IndentingFormatter(logging.Formatter): - default_time_format = "%Y-%m-%dT%H:%M:%S" - - def __init__( - self, - *args, # type: Any - add_timestamp=False, # type: bool - **kwargs, # type: Any - ): - # type: (...) -> None - """ - A logging.Formatter that obeys the indent_log() context manager. - - :param add_timestamp: A bool indicating output lines should be prefixed - with their record's timestamp. - """ - self.add_timestamp = add_timestamp - super().__init__(*args, **kwargs) - - def get_message_start(self, formatted, levelno): - # type: (str, int) -> str - """ - Return the start of the formatted log message (not counting the - prefix to add to each line). - """ - if levelno < logging.WARNING: - return "" - if formatted.startswith(DEPRECATION_MSG_PREFIX): - # Then the message already has a prefix. We don't want it to - # look like "WARNING: DEPRECATION: ...." - return "" - if levelno < logging.ERROR: - return "WARNING: " - - return "ERROR: " - - def format(self, record): - # type: (logging.LogRecord) -> str - """ - Calls the standard formatter, but will indent all of the log message - lines by our current indentation level. - """ - formatted = super().format(record) - message_start = self.get_message_start(formatted, record.levelno) - formatted = message_start + formatted - - prefix = "" - if self.add_timestamp: - prefix = f"{self.formatTime(record)} " - prefix += " " * get_indentation() - formatted = "".join([prefix + line for line in formatted.splitlines(True)]) - return formatted - - -def _color_wrap(*colors): - # type: (*str) -> Callable[[str], str] - def wrapped(inp): - # type: (str) -> str - return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) - - return wrapped - - -class ColorizedStreamHandler(logging.StreamHandler): - - # Don't build up a list of colors if we don't have colorama - if colorama: - COLORS = [ - # This needs to be in order from highest logging level to lowest. - (logging.ERROR, _color_wrap(colorama.Fore.RED)), - (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), - ] - else: - COLORS = [] - - def __init__(self, stream=None, no_color=None): - # type: (Optional[TextIO], bool) -> None - super().__init__(stream) - self._no_color = no_color - - if WINDOWS and colorama: - self.stream = colorama.AnsiToWin32(self.stream) - - def _using_stdout(self): - # type: () -> bool - """ - Return whether the handler is using sys.stdout. - """ - if WINDOWS and colorama: - # Then self.stream is an AnsiToWin32 object. - stream = cast(colorama.AnsiToWin32, self.stream) - return stream.wrapped is sys.stdout - - return self.stream is sys.stdout - - def should_color(self): - # type: () -> bool - # Don't colorize things if we do not have colorama or if told not to - if not colorama or self._no_color: - return False - - real_stream = ( - self.stream - if not isinstance(self.stream, colorama.AnsiToWin32) - else self.stream.wrapped - ) - - # If the stream is a tty we should color it - if hasattr(real_stream, "isatty") and real_stream.isatty(): - return True - - # If we have an ANSI term we should color it - if os.environ.get("TERM") == "ANSI": - return True - - # If anything else we should not color it - return False - - def format(self, record): - # type: (logging.LogRecord) -> str - msg = super().format(record) - - if self.should_color(): - for level, color in self.COLORS: - if record.levelno >= level: - msg = color(msg) - break - - return msg - - # The logging module says handleError() can be customized. - def handleError(self, record): - # type: (logging.LogRecord) -> None - exc_class, exc = sys.exc_info()[:2] - # If a broken pipe occurred while calling write() or flush() on the - # stdout stream in logging's Handler.emit(), then raise our special - # exception so we can handle it in main() instead of logging the - # broken pipe error and continuing. - if ( - exc_class - and exc - and self._using_stdout() - and _is_broken_pipe_error(exc_class, exc) - ): - raise BrokenStdoutLoggingError() - - return super().handleError(record) - - -class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): - def _open(self): - # type: () -> IO[Any] - ensure_dir(os.path.dirname(self.baseFilename)) - return super()._open() - - -class MaxLevelFilter(Filter): - def __init__(self, level): - # type: (int) -> None - self.level = level - - def filter(self, record): - # type: (logging.LogRecord) -> bool - return record.levelno < self.level - - -class ExcludeLoggerFilter(Filter): - - """ - A logging Filter that excludes records from a logger (or its children). - """ - - def filter(self, record): - # type: (logging.LogRecord) -> bool - # The base Filter class allows only records from a logger (or its - # children). - return not super().filter(record) - - -def setup_logging(verbosity, no_color, user_log_file): - # type: (int, bool, Optional[str]) -> int - """Configures and sets up all of the logging - - Returns the requested logging level, as its integer value. - """ - - # Determine the level to be logging at. - if verbosity >= 1: - level = "DEBUG" - elif verbosity == -1: - level = "WARNING" - elif verbosity == -2: - level = "ERROR" - elif verbosity <= -3: - level = "CRITICAL" - else: - level = "INFO" - - level_number = getattr(logging, level) - - # The "root" logger should match the "console" level *unless* we also need - # to log to a user log file. - include_user_log = user_log_file is not None - if include_user_log: - additional_log_file = user_log_file - root_level = "DEBUG" - else: - additional_log_file = "/dev/null" - root_level = level - - # Disable any logging besides WARNING unless we have DEBUG level logging - # enabled for vendored libraries. - vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" - - # Shorthands for clarity - log_streams = { - "stdout": "ext://sys.stdout", - "stderr": "ext://sys.stderr", - } - handler_classes = { - "stream": "pip._internal.utils.logging.ColorizedStreamHandler", - "file": "pip._internal.utils.logging.BetterRotatingFileHandler", - } - handlers = ["console", "console_errors", "console_subprocess"] + ( - ["user_log"] if include_user_log else [] - ) - - logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": False, - "filters": { - "exclude_warnings": { - "()": "pip._internal.utils.logging.MaxLevelFilter", - "level": logging.WARNING, - }, - "restrict_to_subprocess": { - "()": "logging.Filter", - "name": subprocess_logger.name, - }, - "exclude_subprocess": { - "()": "pip._internal.utils.logging.ExcludeLoggerFilter", - "name": subprocess_logger.name, - }, - }, - "formatters": { - "indent": { - "()": IndentingFormatter, - "format": "%(message)s", - }, - "indent_with_timestamp": { - "()": IndentingFormatter, - "format": "%(message)s", - "add_timestamp": True, - }, - }, - "handlers": { - "console": { - "level": level, - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stdout"], - "filters": ["exclude_subprocess", "exclude_warnings"], - "formatter": "indent", - }, - "console_errors": { - "level": "WARNING", - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stderr"], - "filters": ["exclude_subprocess"], - "formatter": "indent", - }, - # A handler responsible for logging to the console messages - # from the "subprocessor" logger. - "console_subprocess": { - "level": level, - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stderr"], - "filters": ["restrict_to_subprocess"], - "formatter": "indent", - }, - "user_log": { - "level": "DEBUG", - "class": handler_classes["file"], - "filename": additional_log_file, - "delay": True, - "formatter": "indent_with_timestamp", - }, - }, - "root": { - "level": root_level, - "handlers": handlers, - }, - "loggers": {"pip._vendor": {"level": vendored_log_level}}, - } - ) - - return level_number diff --git a/venv/Lib/site-packages/pip/_internal/utils/misc.py b/venv/Lib/site-packages/pip/_internal/utils/misc.py deleted file mode 100644 index a4ad35b..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/misc.py +++ /dev/null @@ -1,821 +0,0 @@ -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - -import contextlib -import errno -import getpass -import hashlib -import io -import logging -import os -import posixpath -import shutil -import stat -import sys -import urllib.parse -from io import StringIO -from itertools import filterfalse, tee, zip_longest -from types import TracebackType -from typing import ( - Any, - AnyStr, - BinaryIO, - Callable, - Container, - ContextManager, - Iterable, - Iterator, - List, - Optional, - TextIO, - Tuple, - Type, - TypeVar, - cast, -) - -from pip._vendor.pkg_resources import Distribution -from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed - -from pip import __version__ -from pip._internal.exceptions import CommandError -from pip._internal.locations import get_major_minor_version, site_packages, user_site -from pip._internal.utils.compat import WINDOWS, stdlib_pkgs -from pip._internal.utils.virtualenv import ( - running_under_virtualenv, - virtualenv_no_global, -) - -__all__ = [ - "rmtree", - "display_path", - "backup_dir", - "ask", - "splitext", - "format_size", - "is_installable_dir", - "normalize_path", - "renames", - "get_prog", - "captured_stdout", - "ensure_dir", - "remove_auth_from_url", -] - - -logger = logging.getLogger(__name__) - -T = TypeVar("T") -ExcInfo = Tuple[Type[BaseException], BaseException, TracebackType] -VersionInfo = Tuple[int, int, int] -NetlocTuple = Tuple[str, Tuple[Optional[str], Optional[str]]] - - -def get_pip_version(): - # type: () -> str - pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") - pip_pkg_dir = os.path.abspath(pip_pkg_dir) - - return "pip {} from {} (python {})".format( - __version__, - pip_pkg_dir, - get_major_minor_version(), - ) - - -def normalize_version_info(py_version_info): - # type: (Tuple[int, ...]) -> Tuple[int, int, int] - """ - Convert a tuple of ints representing a Python version to one of length - three. - - :param py_version_info: a tuple of ints representing a Python version, - or None to specify no version. The tuple can have any length. - - :return: a tuple of length three if `py_version_info` is non-None. - Otherwise, return `py_version_info` unchanged (i.e. None). - """ - if len(py_version_info) < 3: - py_version_info += (3 - len(py_version_info)) * (0,) - elif len(py_version_info) > 3: - py_version_info = py_version_info[:3] - - return cast("VersionInfo", py_version_info) - - -def ensure_dir(path): - # type: (AnyStr) -> None - """os.path.makedirs without EEXIST.""" - try: - os.makedirs(path) - except OSError as e: - # Windows can raise spurious ENOTEMPTY errors. See #6426. - if e.errno != errno.EEXIST and e.errno != errno.ENOTEMPTY: - raise - - -def get_prog(): - # type: () -> str - try: - prog = os.path.basename(sys.argv[0]) - if prog in ("__main__.py", "-c"): - return f"{sys.executable} -m pip" - else: - return prog - except (AttributeError, TypeError, IndexError): - pass - return "pip" - - -# Retry every half second for up to 3 seconds -# Tenacity raises RetryError by default, explictly raise the original exception -@retry(reraise=True, stop=stop_after_delay(3), wait=wait_fixed(0.5)) -def rmtree(dir, ignore_errors=False): - # type: (AnyStr, bool) -> None - shutil.rmtree(dir, ignore_errors=ignore_errors, onerror=rmtree_errorhandler) - - -def rmtree_errorhandler(func, path, exc_info): - # type: (Callable[..., Any], str, ExcInfo) -> None - """On Windows, the files in .svn are read-only, so when rmtree() tries to - remove them, an exception is thrown. We catch that here, remove the - read-only attribute, and hopefully continue without problems.""" - try: - has_attr_readonly = not (os.stat(path).st_mode & stat.S_IWRITE) - except OSError: - # it's equivalent to os.path.exists - return - - if has_attr_readonly: - # convert to read/write - os.chmod(path, stat.S_IWRITE) - # use the original function to repeat the operation - func(path) - return - else: - raise - - -def display_path(path): - # type: (str) -> str - """Gives the display value for a given path, making it relative to cwd - if possible.""" - path = os.path.normcase(os.path.abspath(path)) - if path.startswith(os.getcwd() + os.path.sep): - path = "." + path[len(os.getcwd()) :] - return path - - -def backup_dir(dir, ext=".bak"): - # type: (str, str) -> str - """Figure out the name of a directory to back up the given dir to - (adding .bak, .bak2, etc)""" - n = 1 - extension = ext - while os.path.exists(dir + extension): - n += 1 - extension = ext + str(n) - return dir + extension - - -def ask_path_exists(message, options): - # type: (str, Iterable[str]) -> str - for action in os.environ.get("PIP_EXISTS_ACTION", "").split(): - if action in options: - return action - return ask(message, options) - - -def _check_no_input(message): - # type: (str) -> None - """Raise an error if no input is allowed.""" - if os.environ.get("PIP_NO_INPUT"): - raise Exception( - f"No input was expected ($PIP_NO_INPUT set); question: {message}" - ) - - -def ask(message, options): - # type: (str, Iterable[str]) -> str - """Ask the message interactively, with the given possible responses""" - while 1: - _check_no_input(message) - response = input(message) - response = response.strip().lower() - if response not in options: - print( - "Your response ({!r}) was not one of the expected responses: " - "{}".format(response, ", ".join(options)) - ) - else: - return response - - -def ask_input(message): - # type: (str) -> str - """Ask for input interactively.""" - _check_no_input(message) - return input(message) - - -def ask_password(message): - # type: (str) -> str - """Ask for a password interactively.""" - _check_no_input(message) - return getpass.getpass(message) - - -def strtobool(val): - # type: (str) -> int - """Convert a string representation of truth to true (1) or false (0). - - True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values - are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if - 'val' is anything else. - """ - val = val.lower() - if val in ("y", "yes", "t", "true", "on", "1"): - return 1 - elif val in ("n", "no", "f", "false", "off", "0"): - return 0 - else: - raise ValueError(f"invalid truth value {val!r}") - - -def format_size(bytes): - # type: (float) -> str - if bytes > 1000 * 1000: - return "{:.1f} MB".format(bytes / 1000.0 / 1000) - elif bytes > 10 * 1000: - return "{} kB".format(int(bytes / 1000)) - elif bytes > 1000: - return "{:.1f} kB".format(bytes / 1000.0) - else: - return "{} bytes".format(int(bytes)) - - -def tabulate(rows): - # type: (Iterable[Iterable[Any]]) -> Tuple[List[str], List[int]] - """Return a list of formatted rows and a list of column sizes. - - For example:: - - >>> tabulate([['foobar', 2000], [0xdeadbeef]]) - (['foobar 2000', '3735928559'], [10, 4]) - """ - rows = [tuple(map(str, row)) for row in rows] - sizes = [max(map(len, col)) for col in zip_longest(*rows, fillvalue="")] - table = [" ".join(map(str.ljust, row, sizes)).rstrip() for row in rows] - return table, sizes - - -def is_installable_dir(path: str) -> bool: - """Is path is a directory containing pyproject.toml, setup.cfg or setup.py?""" - if not os.path.isdir(path): - return False - return any( - os.path.isfile(os.path.join(path, signifier)) - for signifier in ("pyproject.toml", "setup.cfg", "setup.py") - ) - - -def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): - # type: (BinaryIO, int) -> Iterator[bytes] - """Yield pieces of data from a file-like object until EOF.""" - while True: - chunk = file.read(size) - if not chunk: - break - yield chunk - - -def normalize_path(path, resolve_symlinks=True): - # type: (str, bool) -> str - """ - Convert a path to its canonical, case-normalized, absolute version. - - """ - path = os.path.expanduser(path) - if resolve_symlinks: - path = os.path.realpath(path) - else: - path = os.path.abspath(path) - return os.path.normcase(path) - - -def splitext(path): - # type: (str) -> Tuple[str, str] - """Like os.path.splitext, but take off .tar too""" - base, ext = posixpath.splitext(path) - if base.lower().endswith(".tar"): - ext = base[-4:] + ext - base = base[:-4] - return base, ext - - -def renames(old, new): - # type: (str, str) -> None - """Like os.renames(), but handles renaming across devices.""" - # Implementation borrowed from os.renames(). - head, tail = os.path.split(new) - if head and tail and not os.path.exists(head): - os.makedirs(head) - - shutil.move(old, new) - - head, tail = os.path.split(old) - if head and tail: - try: - os.removedirs(head) - except OSError: - pass - - -def is_local(path): - # type: (str) -> bool - """ - Return True if path is within sys.prefix, if we're running in a virtualenv. - - If we're not in a virtualenv, all paths are considered "local." - - Caution: this function assumes the head of path has been normalized - with normalize_path. - """ - if not running_under_virtualenv(): - return True - return path.startswith(normalize_path(sys.prefix)) - - -def dist_is_local(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution object is installed locally - (i.e. within current virtualenv). - - Always True if we're not in a virtualenv. - - """ - return is_local(dist_location(dist)) - - -def dist_in_usersite(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is installed in user site. - """ - return dist_location(dist).startswith(normalize_path(user_site)) - - -def dist_in_site_packages(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is installed in - sysconfig.get_python_lib(). - """ - return dist_location(dist).startswith(normalize_path(site_packages)) - - -def dist_is_editable(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is an editable install. - """ - for path_item in sys.path: - egg_link = os.path.join(path_item, dist.project_name + ".egg-link") - if os.path.isfile(egg_link): - return True - return False - - -def get_installed_distributions( - local_only=True, # type: bool - skip=stdlib_pkgs, # type: Container[str] - include_editables=True, # type: bool - editables_only=False, # type: bool - user_only=False, # type: bool - paths=None, # type: Optional[List[str]] -): - # type: (...) -> List[Distribution] - """Return a list of installed Distribution objects. - - Left for compatibility until direct pkg_resources uses are refactored out. - """ - from pip._internal.metadata import get_default_environment, get_environment - from pip._internal.metadata.pkg_resources import Distribution as _Dist - - if paths is None: - env = get_default_environment() - else: - env = get_environment(paths) - dists = env.iter_installed_distributions( - local_only=local_only, - skip=skip, - include_editables=include_editables, - editables_only=editables_only, - user_only=user_only, - ) - return [cast(_Dist, dist)._dist for dist in dists] - - -def get_distribution(req_name): - # type: (str) -> Optional[Distribution] - """Given a requirement name, return the installed Distribution object. - - This searches from *all* distributions available in the environment, to - match the behavior of ``pkg_resources.get_distribution()``. - - Left for compatibility until direct pkg_resources uses are refactored out. - """ - from pip._internal.metadata import get_default_environment - from pip._internal.metadata.pkg_resources import Distribution as _Dist - - dist = get_default_environment().get_distribution(req_name) - if dist is None: - return None - return cast(_Dist, dist)._dist - - -def egg_link_path(dist): - # type: (Distribution) -> Optional[str] - """ - Return the path for the .egg-link file if it exists, otherwise, None. - - There's 3 scenarios: - 1) not in a virtualenv - try to find in site.USER_SITE, then site_packages - 2) in a no-global virtualenv - try to find in site_packages - 3) in a yes-global virtualenv - try to find in site_packages, then site.USER_SITE - (don't look in global location) - - For #1 and #3, there could be odd cases, where there's an egg-link in 2 - locations. - - This method will just return the first one found. - """ - sites = [] - if running_under_virtualenv(): - sites.append(site_packages) - if not virtualenv_no_global() and user_site: - sites.append(user_site) - else: - if user_site: - sites.append(user_site) - sites.append(site_packages) - - for site in sites: - egglink = os.path.join(site, dist.project_name) + ".egg-link" - if os.path.isfile(egglink): - return egglink - return None - - -def dist_location(dist): - # type: (Distribution) -> str - """ - Get the site-packages location of this distribution. Generally - this is dist.location, except in the case of develop-installed - packages, where dist.location is the source code location, and we - want to know where the egg-link file is. - - The returned location is normalized (in particular, with symlinks removed). - """ - egg_link = egg_link_path(dist) - if egg_link: - return normalize_path(egg_link) - return normalize_path(dist.location) - - -def write_output(msg, *args): - # type: (Any, Any) -> None - logger.info(msg, *args) - - -class StreamWrapper(StringIO): - orig_stream = None # type: TextIO - - @classmethod - def from_stream(cls, orig_stream): - # type: (TextIO) -> StreamWrapper - cls.orig_stream = orig_stream - return cls() - - # compileall.compile_dir() needs stdout.encoding to print to stdout - # https://github.com/python/mypy/issues/4125 - @property - def encoding(self): # type: ignore - return self.orig_stream.encoding - - -@contextlib.contextmanager -def captured_output(stream_name): - # type: (str) -> Iterator[StreamWrapper] - """Return a context manager used by captured_stdout/stdin/stderr - that temporarily replaces the sys stream *stream_name* with a StringIO. - - Taken from Lib/support/__init__.py in the CPython repo. - """ - orig_stdout = getattr(sys, stream_name) - setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) - try: - yield getattr(sys, stream_name) - finally: - setattr(sys, stream_name, orig_stdout) - - -def captured_stdout(): - # type: () -> ContextManager[StreamWrapper] - """Capture the output of sys.stdout: - - with captured_stdout() as stdout: - print('hello') - self.assertEqual(stdout.getvalue(), 'hello\n') - - Taken from Lib/support/__init__.py in the CPython repo. - """ - return captured_output("stdout") - - -def captured_stderr(): - # type: () -> ContextManager[StreamWrapper] - """ - See captured_stdout(). - """ - return captured_output("stderr") - - -# Simulates an enum -def enum(*sequential, **named): - # type: (*Any, **Any) -> Type[Any] - enums = dict(zip(sequential, range(len(sequential))), **named) - reverse = {value: key for key, value in enums.items()} - enums["reverse_mapping"] = reverse - return type("Enum", (), enums) - - -def build_netloc(host, port): - # type: (str, Optional[int]) -> str - """ - Build a netloc from a host-port pair - """ - if port is None: - return host - if ":" in host: - # Only wrap host with square brackets when it is IPv6 - host = f"[{host}]" - return f"{host}:{port}" - - -def build_url_from_netloc(netloc, scheme="https"): - # type: (str, str) -> str - """ - Build a full URL from a netloc. - """ - if netloc.count(":") >= 2 and "@" not in netloc and "[" not in netloc: - # It must be a bare IPv6 address, so wrap it with brackets. - netloc = f"[{netloc}]" - return f"{scheme}://{netloc}" - - -def parse_netloc(netloc): - # type: (str) -> Tuple[str, Optional[int]] - """ - Return the host-port pair from a netloc. - """ - url = build_url_from_netloc(netloc) - parsed = urllib.parse.urlparse(url) - return parsed.hostname, parsed.port - - -def split_auth_from_netloc(netloc): - # type: (str) -> NetlocTuple - """ - Parse out and remove the auth information from a netloc. - - Returns: (netloc, (username, password)). - """ - if "@" not in netloc: - return netloc, (None, None) - - # Split from the right because that's how urllib.parse.urlsplit() - # behaves if more than one @ is present (which can be checked using - # the password attribute of urlsplit()'s return value). - auth, netloc = netloc.rsplit("@", 1) - pw = None # type: Optional[str] - if ":" in auth: - # Split from the left because that's how urllib.parse.urlsplit() - # behaves if more than one : is present (which again can be checked - # using the password attribute of the return value) - user, pw = auth.split(":", 1) - else: - user, pw = auth, None - - user = urllib.parse.unquote(user) - if pw is not None: - pw = urllib.parse.unquote(pw) - - return netloc, (user, pw) - - -def redact_netloc(netloc): - # type: (str) -> str - """ - Replace the sensitive data in a netloc with "****", if it exists. - - For example: - - "user:pass@example.com" returns "user:****@example.com" - - "accesstoken@example.com" returns "****@example.com" - """ - netloc, (user, password) = split_auth_from_netloc(netloc) - if user is None: - return netloc - if password is None: - user = "****" - password = "" - else: - user = urllib.parse.quote(user) - password = ":****" - return "{user}{password}@{netloc}".format( - user=user, password=password, netloc=netloc - ) - - -def _transform_url(url, transform_netloc): - # type: (str, Callable[[str], Tuple[Any, ...]]) -> Tuple[str, NetlocTuple] - """Transform and replace netloc in a url. - - transform_netloc is a function taking the netloc and returning a - tuple. The first element of this tuple is the new netloc. The - entire tuple is returned. - - Returns a tuple containing the transformed url as item 0 and the - original tuple returned by transform_netloc as item 1. - """ - purl = urllib.parse.urlsplit(url) - netloc_tuple = transform_netloc(purl.netloc) - # stripped url - url_pieces = (purl.scheme, netloc_tuple[0], purl.path, purl.query, purl.fragment) - surl = urllib.parse.urlunsplit(url_pieces) - return surl, cast("NetlocTuple", netloc_tuple) - - -def _get_netloc(netloc): - # type: (str) -> NetlocTuple - return split_auth_from_netloc(netloc) - - -def _redact_netloc(netloc): - # type: (str) -> Tuple[str,] - return (redact_netloc(netloc),) - - -def split_auth_netloc_from_url(url): - # type: (str) -> Tuple[str, str, Tuple[str, str]] - """ - Parse a url into separate netloc, auth, and url with no auth. - - Returns: (url_without_auth, netloc, (username, password)) - """ - url_without_auth, (netloc, auth) = _transform_url(url, _get_netloc) - return url_without_auth, netloc, auth - - -def remove_auth_from_url(url): - # type: (str) -> str - """Return a copy of url with 'username:password@' removed.""" - # username/pass params are passed to subversion through flags - # and are not recognized in the url. - return _transform_url(url, _get_netloc)[0] - - -def redact_auth_from_url(url): - # type: (str) -> str - """Replace the password in a given url with ****.""" - return _transform_url(url, _redact_netloc)[0] - - -class HiddenText: - def __init__( - self, - secret, # type: str - redacted, # type: str - ): - # type: (...) -> None - self.secret = secret - self.redacted = redacted - - def __repr__(self): - # type: (...) -> str - return "".format(str(self)) - - def __str__(self): - # type: (...) -> str - return self.redacted - - # This is useful for testing. - def __eq__(self, other): - # type: (Any) -> bool - if type(self) != type(other): - return False - - # The string being used for redaction doesn't also have to match, - # just the raw, original string. - return self.secret == other.secret - - -def hide_value(value): - # type: (str) -> HiddenText - return HiddenText(value, redacted="****") - - -def hide_url(url): - # type: (str) -> HiddenText - redacted = redact_auth_from_url(url) - return HiddenText(url, redacted=redacted) - - -def protect_pip_from_modification_on_windows(modifying_pip): - # type: (bool) -> None - """Protection of pip.exe from modification on Windows - - On Windows, any operation modifying pip should be run as: - python -m pip ... - """ - pip_names = [ - "pip.exe", - "pip{}.exe".format(sys.version_info[0]), - "pip{}.{}.exe".format(*sys.version_info[:2]), - ] - - # See https://github.com/pypa/pip/issues/1299 for more discussion - should_show_use_python_msg = ( - modifying_pip and WINDOWS and os.path.basename(sys.argv[0]) in pip_names - ) - - if should_show_use_python_msg: - new_command = [sys.executable, "-m", "pip"] + sys.argv[1:] - raise CommandError( - "To modify pip, please run the following command:\n{}".format( - " ".join(new_command) - ) - ) - - -def is_console_interactive(): - # type: () -> bool - """Is this console interactive?""" - return sys.stdin is not None and sys.stdin.isatty() - - -def hash_file(path, blocksize=1 << 20): - # type: (str, int) -> Tuple[Any, int] - """Return (hash, length) for path using hashlib.sha256()""" - - h = hashlib.sha256() - length = 0 - with open(path, "rb") as f: - for block in read_chunks(f, size=blocksize): - length += len(block) - h.update(block) - return h, length - - -def is_wheel_installed(): - # type: () -> bool - """ - Return whether the wheel package is installed. - """ - try: - import wheel # noqa: F401 - except ImportError: - return False - - return True - - -def pairwise(iterable): - # type: (Iterable[Any]) -> Iterator[Tuple[Any, Any]] - """ - Return paired elements. - - For example: - s -> (s0, s1), (s2, s3), (s4, s5), ... - """ - iterable = iter(iterable) - return zip_longest(iterable, iterable) - - -def partition( - pred, # type: Callable[[T], bool] - iterable, # type: Iterable[T] -): - # type: (...) -> Tuple[Iterable[T], Iterable[T]] - """ - Use a predicate to partition entries into false entries and true entries, - like - - partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 - """ - t1, t2 = tee(iterable) - return filterfalse(pred, t1), filter(pred, t2) diff --git a/venv/Lib/site-packages/pip/_internal/utils/models.py b/venv/Lib/site-packages/pip/_internal/utils/models.py deleted file mode 100644 index 0e02bc7..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/models.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Utilities for defining models -""" - -import operator -from typing import Any, Callable, Type - - -class KeyBasedCompareMixin: - """Provides comparison capabilities that is based on a key""" - - __slots__ = ["_compare_key", "_defining_class"] - - def __init__(self, key, defining_class): - # type: (Any, Type[KeyBasedCompareMixin]) -> None - self._compare_key = key - self._defining_class = defining_class - - def __hash__(self): - # type: () -> int - return hash(self._compare_key) - - def __lt__(self, other): - # type: (Any) -> bool - return self._compare(other, operator.__lt__) - - def __le__(self, other): - # type: (Any) -> bool - return self._compare(other, operator.__le__) - - def __gt__(self, other): - # type: (Any) -> bool - return self._compare(other, operator.__gt__) - - def __ge__(self, other): - # type: (Any) -> bool - return self._compare(other, operator.__ge__) - - def __eq__(self, other): - # type: (Any) -> bool - return self._compare(other, operator.__eq__) - - def _compare(self, other, method): - # type: (Any, Callable[[Any, Any], bool]) -> bool - if not isinstance(other, self._defining_class): - return NotImplemented - - return method(self._compare_key, other._compare_key) diff --git a/venv/Lib/site-packages/pip/_internal/utils/packaging.py b/venv/Lib/site-packages/pip/_internal/utils/packaging.py deleted file mode 100644 index 3f9dbd3..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/packaging.py +++ /dev/null @@ -1,89 +0,0 @@ -import logging -from email.message import Message -from email.parser import FeedParser -from typing import Optional, Tuple - -from pip._vendor import pkg_resources -from pip._vendor.packaging import specifiers, version -from pip._vendor.pkg_resources import Distribution - -from pip._internal.exceptions import NoneMetadataError -from pip._internal.utils.misc import display_path - -logger = logging.getLogger(__name__) - - -def check_requires_python(requires_python, version_info): - # type: (Optional[str], Tuple[int, ...]) -> bool - """ - Check if the given Python version matches a "Requires-Python" specifier. - - :param version_info: A 3-tuple of ints representing a Python - major-minor-micro version to check (e.g. `sys.version_info[:3]`). - - :return: `True` if the given Python version satisfies the requirement. - Otherwise, return `False`. - - :raises InvalidSpecifier: If `requires_python` has an invalid format. - """ - if requires_python is None: - # The package provides no information - return True - requires_python_specifier = specifiers.SpecifierSet(requires_python) - - python_version = version.parse(".".join(map(str, version_info))) - return python_version in requires_python_specifier - - -def get_metadata(dist): - # type: (Distribution) -> Message - """ - :raises NoneMetadataError: if the distribution reports `has_metadata()` - True but `get_metadata()` returns None. - """ - metadata_name = "METADATA" - if isinstance(dist, pkg_resources.DistInfoDistribution) and dist.has_metadata( - metadata_name - ): - metadata = dist.get_metadata(metadata_name) - elif dist.has_metadata("PKG-INFO"): - metadata_name = "PKG-INFO" - metadata = dist.get_metadata(metadata_name) - else: - logger.warning("No metadata found in %s", display_path(dist.location)) - metadata = "" - - if metadata is None: - raise NoneMetadataError(dist, metadata_name) - - feed_parser = FeedParser() - # The following line errors out if with a "NoneType" TypeError if - # passed metadata=None. - feed_parser.feed(metadata) - return feed_parser.close() - - -def get_requires_python(dist): - # type: (pkg_resources.Distribution) -> Optional[str] - """ - Return the "Requires-Python" metadata for a distribution, or None - if not present. - """ - pkg_info_dict = get_metadata(dist) - requires_python = pkg_info_dict.get("Requires-Python") - - if requires_python is not None: - # Convert to a str to satisfy the type checker, since requires_python - # can be a Header object. - requires_python = str(requires_python) - - return requires_python - - -def get_installer(dist): - # type: (Distribution) -> str - if dist.has_metadata("INSTALLER"): - for line in dist.get_metadata_lines("INSTALLER"): - if line.strip(): - return line.strip() - return "" diff --git a/venv/Lib/site-packages/pip/_internal/utils/parallel.py b/venv/Lib/site-packages/pip/_internal/utils/parallel.py deleted file mode 100644 index de91dc8..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/parallel.py +++ /dev/null @@ -1,101 +0,0 @@ -"""Convenient parallelization of higher order functions. - -This module provides two helper functions, with appropriate fallbacks on -Python 2 and on systems lacking support for synchronization mechanisms: - -- map_multiprocess -- map_multithread - -These helpers work like Python 3's map, with two differences: - -- They don't guarantee the order of processing of - the elements of the iterable. -- The underlying process/thread pools chop the iterable into - a number of chunks, so that for very long iterables using - a large value for chunksize can make the job complete much faster - than using the default value of 1. -""" - -__all__ = ["map_multiprocess", "map_multithread"] - -from contextlib import contextmanager -from multiprocessing import Pool as ProcessPool -from multiprocessing import pool -from multiprocessing.dummy import Pool as ThreadPool -from typing import Callable, Iterable, Iterator, TypeVar, Union - -from pip._vendor.requests.adapters import DEFAULT_POOLSIZE - -Pool = Union[pool.Pool, pool.ThreadPool] -S = TypeVar("S") -T = TypeVar("T") - -# On platforms without sem_open, multiprocessing[.dummy] Pool -# cannot be created. -try: - import multiprocessing.synchronize # noqa -except ImportError: - LACK_SEM_OPEN = True -else: - LACK_SEM_OPEN = False - -# Incredibly large timeout to work around bpo-8296 on Python 2. -TIMEOUT = 2000000 - - -@contextmanager -def closing(pool): - # type: (Pool) -> Iterator[Pool] - """Return a context manager making sure the pool closes properly.""" - try: - yield pool - finally: - # For Pool.imap*, close and join are needed - # for the returned iterator to begin yielding. - pool.close() - pool.join() - pool.terminate() - - -def _map_fallback(func, iterable, chunksize=1): - # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T] - """Make an iterator applying func to each element in iterable. - - This function is the sequential fallback either on Python 2 - where Pool.imap* doesn't react to KeyboardInterrupt - or when sem_open is unavailable. - """ - return map(func, iterable) - - -def _map_multiprocess(func, iterable, chunksize=1): - # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T] - """Chop iterable into chunks and submit them to a process pool. - - For very long iterables using a large value for chunksize can make - the job complete much faster than using the default value of 1. - - Return an unordered iterator of the results. - """ - with closing(ProcessPool()) as pool: - return pool.imap_unordered(func, iterable, chunksize) - - -def _map_multithread(func, iterable, chunksize=1): - # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T] - """Chop iterable into chunks and submit them to a thread pool. - - For very long iterables using a large value for chunksize can make - the job complete much faster than using the default value of 1. - - Return an unordered iterator of the results. - """ - with closing(ThreadPool(DEFAULT_POOLSIZE)) as pool: - return pool.imap_unordered(func, iterable, chunksize) - - -if LACK_SEM_OPEN: - map_multiprocess = map_multithread = _map_fallback -else: - map_multiprocess = _map_multiprocess - map_multithread = _map_multithread diff --git a/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py b/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py deleted file mode 100644 index ee1eca3..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py +++ /dev/null @@ -1,40 +0,0 @@ -from typing import Dict, Iterable, List - -from pip._vendor.pkg_resources import yield_lines - - -class DictMetadata: - """IMetadataProvider that reads metadata files from a dictionary.""" - - def __init__(self, metadata): - # type: (Dict[str, bytes]) -> None - self._metadata = metadata - - def has_metadata(self, name): - # type: (str) -> bool - return name in self._metadata - - def get_metadata(self, name): - # type: (str) -> str - try: - return self._metadata[name].decode() - except UnicodeDecodeError as e: - # Mirrors handling done in pkg_resources.NullProvider. - e.reason += f" in {name} file" - raise - - def get_metadata_lines(self, name): - # type: (str) -> Iterable[str] - return yield_lines(self.get_metadata(name)) - - def metadata_isdir(self, name): - # type: (str) -> bool - return False - - def metadata_listdir(self, name): - # type: (str) -> List[str] - return [] - - def run_script(self, script_name, namespace): - # type: (str, str) -> None - pass diff --git a/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py b/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py deleted file mode 100644 index 4b8e4b3..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +++ /dev/null @@ -1,173 +0,0 @@ -import sys -from typing import List, Optional, Sequence - -# Shim to wrap setup.py invocation with setuptools -# -# We set sys.argv[0] to the path to the underlying setup.py file so -# setuptools / distutils don't take the path to the setup.py to be "-c" when -# invoking via the shim. This avoids e.g. the following manifest_maker -# warning: "warning: manifest_maker: standard file '-c' not found". -_SETUPTOOLS_SHIM = ( - "import io, os, sys, setuptools, tokenize; sys.argv[0] = {0!r}; __file__={0!r};" - "f = getattr(tokenize, 'open', open)(__file__) " - "if os.path.exists(__file__) " - "else io.StringIO('from setuptools import setup; setup()');" - "code = f.read().replace('\\r\\n', '\\n');" - "f.close();" - "exec(compile(code, __file__, 'exec'))" -) - - -def make_setuptools_shim_args( - setup_py_path, # type: str - global_options=None, # type: Sequence[str] - no_user_config=False, # type: bool - unbuffered_output=False, # type: bool -): - # type: (...) -> List[str] - """ - Get setuptools command arguments with shim wrapped setup file invocation. - - :param setup_py_path: The path to setup.py to be wrapped. - :param global_options: Additional global options. - :param no_user_config: If True, disables personal user configuration. - :param unbuffered_output: If True, adds the unbuffered switch to the - argument list. - """ - args = [sys.executable] - if unbuffered_output: - args += ["-u"] - args += ["-c", _SETUPTOOLS_SHIM.format(setup_py_path)] - if global_options: - args += global_options - if no_user_config: - args += ["--no-user-cfg"] - return args - - -def make_setuptools_bdist_wheel_args( - setup_py_path, # type: str - global_options, # type: Sequence[str] - build_options, # type: Sequence[str] - destination_dir, # type: str -): - # type: (...) -> List[str] - # NOTE: Eventually, we'd want to also -S to the flags here, when we're - # isolating. Currently, it breaks Python in virtualenvs, because it - # relies on site.py to find parts of the standard library outside the - # virtualenv. - args = make_setuptools_shim_args( - setup_py_path, global_options=global_options, unbuffered_output=True - ) - args += ["bdist_wheel", "-d", destination_dir] - args += build_options - return args - - -def make_setuptools_clean_args( - setup_py_path, # type: str - global_options, # type: Sequence[str] -): - # type: (...) -> List[str] - args = make_setuptools_shim_args( - setup_py_path, global_options=global_options, unbuffered_output=True - ) - args += ["clean", "--all"] - return args - - -def make_setuptools_develop_args( - setup_py_path, # type: str - global_options, # type: Sequence[str] - install_options, # type: Sequence[str] - no_user_config, # type: bool - prefix, # type: Optional[str] - home, # type: Optional[str] - use_user_site, # type: bool -): - # type: (...) -> List[str] - assert not (use_user_site and prefix) - - args = make_setuptools_shim_args( - setup_py_path, - global_options=global_options, - no_user_config=no_user_config, - ) - - args += ["develop", "--no-deps"] - - args += install_options - - if prefix: - args += ["--prefix", prefix] - if home is not None: - args += ["--install-dir", home] - - if use_user_site: - args += ["--user", "--prefix="] - - return args - - -def make_setuptools_egg_info_args( - setup_py_path, # type: str - egg_info_dir, # type: Optional[str] - no_user_config, # type: bool -): - # type: (...) -> List[str] - args = make_setuptools_shim_args(setup_py_path, no_user_config=no_user_config) - - args += ["egg_info"] - - if egg_info_dir: - args += ["--egg-base", egg_info_dir] - - return args - - -def make_setuptools_install_args( - setup_py_path, # type: str - global_options, # type: Sequence[str] - install_options, # type: Sequence[str] - record_filename, # type: str - root, # type: Optional[str] - prefix, # type: Optional[str] - header_dir, # type: Optional[str] - home, # type: Optional[str] - use_user_site, # type: bool - no_user_config, # type: bool - pycompile, # type: bool -): - # type: (...) -> List[str] - assert not (use_user_site and prefix) - assert not (use_user_site and root) - - args = make_setuptools_shim_args( - setup_py_path, - global_options=global_options, - no_user_config=no_user_config, - unbuffered_output=True, - ) - args += ["install", "--record", record_filename] - args += ["--single-version-externally-managed"] - - if root is not None: - args += ["--root", root] - if prefix is not None: - args += ["--prefix", prefix] - if home is not None: - args += ["--home", home] - if use_user_site: - args += ["--user", "--prefix="] - - if pycompile: - args += ["--compile"] - else: - args += ["--no-compile"] - - if header_dir: - args += ["--install-headers", header_dir] - - args += install_options - - return args diff --git a/venv/Lib/site-packages/pip/_internal/utils/subprocess.py b/venv/Lib/site-packages/pip/_internal/utils/subprocess.py deleted file mode 100644 index 2c8cf21..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/subprocess.py +++ /dev/null @@ -1,281 +0,0 @@ -import logging -import os -import shlex -import subprocess -from typing import Any, Callable, Iterable, List, Mapping, Optional, Union - -from pip._internal.cli.spinners import SpinnerInterface, open_spinner -from pip._internal.exceptions import InstallationSubprocessError -from pip._internal.utils.logging import subprocess_logger -from pip._internal.utils.misc import HiddenText - -CommandArgs = List[Union[str, HiddenText]] - - -LOG_DIVIDER = "----------------------------------------" - - -def make_command(*args): - # type: (Union[str, HiddenText, CommandArgs]) -> CommandArgs - """ - Create a CommandArgs object. - """ - command_args = [] # type: CommandArgs - for arg in args: - # Check for list instead of CommandArgs since CommandArgs is - # only known during type-checking. - if isinstance(arg, list): - command_args.extend(arg) - else: - # Otherwise, arg is str or HiddenText. - command_args.append(arg) - - return command_args - - -def format_command_args(args): - # type: (Union[List[str], CommandArgs]) -> str - """ - Format command arguments for display. - """ - # For HiddenText arguments, display the redacted form by calling str(). - # Also, we don't apply str() to arguments that aren't HiddenText since - # this can trigger a UnicodeDecodeError in Python 2 if the argument - # has type unicode and includes a non-ascii character. (The type - # checker doesn't ensure the annotations are correct in all cases.) - return " ".join( - shlex.quote(str(arg)) if isinstance(arg, HiddenText) else shlex.quote(arg) - for arg in args - ) - - -def reveal_command_args(args): - # type: (Union[List[str], CommandArgs]) -> List[str] - """ - Return the arguments in their raw, unredacted form. - """ - return [arg.secret if isinstance(arg, HiddenText) else arg for arg in args] - - -def make_subprocess_output_error( - cmd_args, # type: Union[List[str], CommandArgs] - cwd, # type: Optional[str] - lines, # type: List[str] - exit_status, # type: int -): - # type: (...) -> str - """ - Create and return the error message to use to log a subprocess error - with command output. - - :param lines: A list of lines, each ending with a newline. - """ - command = format_command_args(cmd_args) - - # We know the joined output value ends in a newline. - output = "".join(lines) - msg = ( - # Use a unicode string to avoid "UnicodeEncodeError: 'ascii' - # codec can't encode character ..." in Python 2 when a format - # argument (e.g. `output`) has a non-ascii character. - "Command errored out with exit status {exit_status}:\n" - " command: {command_display}\n" - " cwd: {cwd_display}\n" - "Complete output ({line_count} lines):\n{output}{divider}" - ).format( - exit_status=exit_status, - command_display=command, - cwd_display=cwd, - line_count=len(lines), - output=output, - divider=LOG_DIVIDER, - ) - return msg - - -def call_subprocess( - cmd, # type: Union[List[str], CommandArgs] - show_stdout=False, # type: bool - cwd=None, # type: Optional[str] - on_returncode="raise", # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - unset_environ=None, # type: Optional[Iterable[str]] - spinner=None, # type: Optional[SpinnerInterface] - log_failed_cmd=True, # type: Optional[bool] - stdout_only=False, # type: Optional[bool] -): - # type: (...) -> str - """ - Args: - show_stdout: if true, use INFO to log the subprocess's stderr and - stdout streams. Otherwise, use DEBUG. Defaults to False. - extra_ok_returncodes: an iterable of integer return codes that are - acceptable, in addition to 0. Defaults to None, which means []. - unset_environ: an iterable of environment variable names to unset - prior to calling subprocess.Popen(). - log_failed_cmd: if false, failed commands are not logged, only raised. - stdout_only: if true, return only stdout, else return both. When true, - logging of both stdout and stderr occurs when the subprocess has - terminated, else logging occurs as subprocess output is produced. - """ - if extra_ok_returncodes is None: - extra_ok_returncodes = [] - if unset_environ is None: - unset_environ = [] - # Most places in pip use show_stdout=False. What this means is-- - # - # - We connect the child's output (combined stderr and stdout) to a - # single pipe, which we read. - # - We log this output to stderr at DEBUG level as it is received. - # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't - # requested), then we show a spinner so the user can still see the - # subprocess is in progress. - # - If the subprocess exits with an error, we log the output to stderr - # at ERROR level if it hasn't already been displayed to the console - # (e.g. if --verbose logging wasn't enabled). This way we don't log - # the output to the console twice. - # - # If show_stdout=True, then the above is still done, but with DEBUG - # replaced by INFO. - if show_stdout: - # Then log the subprocess output at INFO level. - log_subprocess = subprocess_logger.info - used_level = logging.INFO - else: - # Then log the subprocess output using DEBUG. This also ensures - # it will be logged to the log file (aka user_log), if enabled. - log_subprocess = subprocess_logger.debug - used_level = logging.DEBUG - - # Whether the subprocess will be visible in the console. - showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level - - # Only use the spinner if we're not showing the subprocess output - # and we have a spinner. - use_spinner = not showing_subprocess and spinner is not None - - if command_desc is None: - command_desc = format_command_args(cmd) - - log_subprocess("Running command %s", command_desc) - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - for name in unset_environ: - env.pop(name, None) - try: - proc = subprocess.Popen( - # Convert HiddenText objects to the underlying str. - reveal_command_args(cmd), - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT if not stdout_only else subprocess.PIPE, - cwd=cwd, - env=env, - errors="backslashreplace", - ) - except Exception as exc: - if log_failed_cmd: - subprocess_logger.critical( - "Error %s while executing command %s", - exc, - command_desc, - ) - raise - all_output = [] - if not stdout_only: - assert proc.stdout - assert proc.stdin - proc.stdin.close() - # In this mode, stdout and stderr are in the same pipe. - while True: - line = proc.stdout.readline() # type: str - if not line: - break - line = line.rstrip() - all_output.append(line + "\n") - - # Show the line immediately. - log_subprocess(line) - # Update the spinner. - if use_spinner: - assert spinner - spinner.spin() - try: - proc.wait() - finally: - if proc.stdout: - proc.stdout.close() - output = "".join(all_output) - else: - # In this mode, stdout and stderr are in different pipes. - # We must use communicate() which is the only safe way to read both. - out, err = proc.communicate() - # log line by line to preserve pip log indenting - for out_line in out.splitlines(): - log_subprocess(out_line) - all_output.append(out) - for err_line in err.splitlines(): - log_subprocess(err_line) - all_output.append(err) - output = out - - proc_had_error = proc.returncode and proc.returncode not in extra_ok_returncodes - if use_spinner: - assert spinner - if proc_had_error: - spinner.finish("error") - else: - spinner.finish("done") - if proc_had_error: - if on_returncode == "raise": - if not showing_subprocess and log_failed_cmd: - # Then the subprocess streams haven't been logged to the - # console yet. - msg = make_subprocess_output_error( - cmd_args=cmd, - cwd=cwd, - lines=all_output, - exit_status=proc.returncode, - ) - subprocess_logger.error(msg) - raise InstallationSubprocessError(proc.returncode, command_desc) - elif on_returncode == "warn": - subprocess_logger.warning( - 'Command "%s" had error code %s in %s', - command_desc, - proc.returncode, - cwd, - ) - elif on_returncode == "ignore": - pass - else: - raise ValueError(f"Invalid value: on_returncode={on_returncode!r}") - return output - - -def runner_with_spinner_message(message): - # type: (str) -> Callable[..., None] - """Provide a subprocess_runner that shows a spinner message. - - Intended for use with for pep517's Pep517HookCaller. Thus, the runner has - an API that matches what's expected by Pep517HookCaller.subprocess_runner. - """ - - def runner( - cmd, # type: List[str] - cwd=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - ): - # type: (...) -> None - with open_spinner(message) as spinner: - call_subprocess( - cmd, - cwd=cwd, - extra_environ=extra_environ, - spinner=spinner, - ) - - return runner diff --git a/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py b/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py deleted file mode 100644 index 477cbe6..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +++ /dev/null @@ -1,260 +0,0 @@ -import errno -import itertools -import logging -import os.path -import tempfile -from contextlib import ExitStack, contextmanager -from typing import Any, Dict, Iterator, Optional, TypeVar, Union - -from pip._internal.utils.misc import enum, rmtree - -logger = logging.getLogger(__name__) - -_T = TypeVar("_T", bound="TempDirectory") - - -# Kinds of temporary directories. Only needed for ones that are -# globally-managed. -tempdir_kinds = enum( - BUILD_ENV="build-env", - EPHEM_WHEEL_CACHE="ephem-wheel-cache", - REQ_BUILD="req-build", -) - - -_tempdir_manager = None # type: Optional[ExitStack] - - -@contextmanager -def global_tempdir_manager(): - # type: () -> Iterator[None] - global _tempdir_manager - with ExitStack() as stack: - old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack - try: - yield - finally: - _tempdir_manager = old_tempdir_manager - - -class TempDirectoryTypeRegistry: - """Manages temp directory behavior""" - - def __init__(self): - # type: () -> None - self._should_delete = {} # type: Dict[str, bool] - - def set_delete(self, kind, value): - # type: (str, bool) -> None - """Indicate whether a TempDirectory of the given kind should be - auto-deleted. - """ - self._should_delete[kind] = value - - def get_delete(self, kind): - # type: (str) -> bool - """Get configured auto-delete flag for a given TempDirectory type, - default True. - """ - return self._should_delete.get(kind, True) - - -_tempdir_registry = None # type: Optional[TempDirectoryTypeRegistry] - - -@contextmanager -def tempdir_registry(): - # type: () -> Iterator[TempDirectoryTypeRegistry] - """Provides a scoped global tempdir registry that can be used to dictate - whether directories should be deleted. - """ - global _tempdir_registry - old_tempdir_registry = _tempdir_registry - _tempdir_registry = TempDirectoryTypeRegistry() - try: - yield _tempdir_registry - finally: - _tempdir_registry = old_tempdir_registry - - -class _Default: - pass - - -_default = _Default() - - -class TempDirectory: - """Helper class that owns and cleans up a temporary directory. - - This class can be used as a context manager or as an OO representation of a - temporary directory. - - Attributes: - path - Location to the created temporary directory - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - Methods: - cleanup() - Deletes the temporary directory - - When used as a context manager, if the delete attribute is True, on - exiting the context the temporary directory is deleted. - """ - - def __init__( - self, - path=None, # type: Optional[str] - delete=_default, # type: Union[bool, None, _Default] - kind="temp", # type: str - globally_managed=False, # type: bool - ): - super().__init__() - - if delete is _default: - if path is not None: - # If we were given an explicit directory, resolve delete option - # now. - delete = False - else: - # Otherwise, we wait until cleanup and see what - # tempdir_registry says. - delete = None - - # The only time we specify path is in for editables where it - # is the value of the --src option. - if path is None: - path = self._create(kind) - - self._path = path - self._deleted = False - self.delete = delete - self.kind = kind - - if globally_managed: - assert _tempdir_manager is not None - _tempdir_manager.enter_context(self) - - @property - def path(self): - # type: () -> str - assert not self._deleted, f"Attempted to access deleted path: {self._path}" - return self._path - - def __repr__(self): - # type: () -> str - return f"<{self.__class__.__name__} {self.path!r}>" - - def __enter__(self): - # type: (_T) -> _T - return self - - def __exit__(self, exc, value, tb): - # type: (Any, Any, Any) -> None - if self.delete is not None: - delete = self.delete - elif _tempdir_registry: - delete = _tempdir_registry.get_delete(self.kind) - else: - delete = True - - if delete: - self.cleanup() - - def _create(self, kind): - # type: (str) -> str - """Create a temporary directory and store its path in self.path""" - # We realpath here because some systems have their default tmpdir - # symlinked to another directory. This tends to confuse build - # scripts, so we canonicalize the path by traversing potential - # symlinks here. - path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) - logger.debug("Created temporary directory: %s", path) - return path - - def cleanup(self): - # type: () -> None - """Remove the temporary directory created and reset state""" - self._deleted = True - if not os.path.exists(self._path): - return - rmtree(self._path) - - -class AdjacentTempDirectory(TempDirectory): - """Helper class that creates a temporary directory adjacent to a real one. - - Attributes: - original - The original directory to create a temp directory for. - path - After calling create() or entering, contains the full - path to the temporary directory. - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - """ - - # The characters that may be used to name the temp directory - # We always prepend a ~ and then rotate through these until - # a usable name is found. - # pkg_resources raises a different error for .dist-info folder - # with leading '-' and invalid metadata - LEADING_CHARS = "-~.=%0123456789" - - def __init__(self, original, delete=None): - # type: (str, Optional[bool]) -> None - self.original = original.rstrip("/\\") - super().__init__(delete=delete) - - @classmethod - def _generate_names(cls, name): - # type: (str) -> Iterator[str] - """Generates a series of temporary names. - - The algorithm replaces the leading characters in the name - with ones that are valid filesystem characters, but are not - valid package names (for both Python and pip definitions of - package). - """ - for i in range(1, len(name)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i - 1 - ): - new_name = "~" + "".join(candidate) + name[i:] - if new_name != name: - yield new_name - - # If we make it this far, we will have to make a longer name - for i in range(len(cls.LEADING_CHARS)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i - ): - new_name = "~" + "".join(candidate) + name - if new_name != name: - yield new_name - - def _create(self, kind): - # type: (str) -> str - root, name = os.path.split(self.original) - for candidate in self._generate_names(name): - path = os.path.join(root, candidate) - try: - os.mkdir(path) - except OSError as ex: - # Continue if the name exists already - if ex.errno != errno.EEXIST: - raise - else: - path = os.path.realpath(path) - break - else: - # Final fallback on the default behavior. - path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) - - logger.debug("Created temporary directory: %s", path) - return path diff --git a/venv/Lib/site-packages/pip/_internal/utils/unpacking.py b/venv/Lib/site-packages/pip/_internal/utils/unpacking.py deleted file mode 100644 index 44ac475..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/unpacking.py +++ /dev/null @@ -1,267 +0,0 @@ -"""Utilities related archives. -""" - -import logging -import os -import shutil -import stat -import tarfile -import zipfile -from typing import Iterable, List, Optional -from zipfile import ZipInfo - -from pip._internal.exceptions import InstallationError -from pip._internal.utils.filetypes import ( - BZ2_EXTENSIONS, - TAR_EXTENSIONS, - XZ_EXTENSIONS, - ZIP_EXTENSIONS, -) -from pip._internal.utils.misc import ensure_dir - -logger = logging.getLogger(__name__) - - -SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS - -try: - import bz2 # noqa - - SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS -except ImportError: - logger.debug("bz2 module is not available") - -try: - # Only for Python 3.3+ - import lzma # noqa - - SUPPORTED_EXTENSIONS += XZ_EXTENSIONS -except ImportError: - logger.debug("lzma module is not available") - - -def current_umask(): - # type: () -> int - """Get the current umask which involves having to set it temporarily.""" - mask = os.umask(0) - os.umask(mask) - return mask - - -def split_leading_dir(path): - # type: (str) -> List[str] - path = path.lstrip("/").lstrip("\\") - if "/" in path and ( - ("\\" in path and path.find("/") < path.find("\\")) or "\\" not in path - ): - return path.split("/", 1) - elif "\\" in path: - return path.split("\\", 1) - else: - return [path, ""] - - -def has_leading_dir(paths): - # type: (Iterable[str]) -> bool - """Returns true if all the paths have the same leading path name - (i.e., everything is in one subdirectory in an archive)""" - common_prefix = None - for path in paths: - prefix, rest = split_leading_dir(path) - if not prefix: - return False - elif common_prefix is None: - common_prefix = prefix - elif prefix != common_prefix: - return False - return True - - -def is_within_directory(directory, target): - # type: (str, str) -> bool - """ - Return true if the absolute path of target is within the directory - """ - abs_directory = os.path.abspath(directory) - abs_target = os.path.abspath(target) - - prefix = os.path.commonprefix([abs_directory, abs_target]) - return prefix == abs_directory - - -def set_extracted_file_to_default_mode_plus_executable(path): - # type: (str) -> None - """ - Make file present at path have execute for user/group/world - (chmod +x) is no-op on windows per python docs - """ - os.chmod(path, (0o777 & ~current_umask() | 0o111)) - - -def zip_item_is_executable(info): - # type: (ZipInfo) -> bool - mode = info.external_attr >> 16 - # if mode and regular file and any execute permissions for - # user/group/world? - return bool(mode and stat.S_ISREG(mode) and mode & 0o111) - - -def unzip_file(filename, location, flatten=True): - # type: (str, str, bool) -> None - """ - Unzip the file (with path `filename`) to the destination `location`. All - files are written based on system defaults and umask (i.e. permissions are - not preserved), except that regular file members with any execute - permissions (user, group, or world) have "chmod +x" applied after being - written. Note that for windows, any execute changes using os.chmod are - no-ops per the python docs. - """ - ensure_dir(location) - zipfp = open(filename, "rb") - try: - zip = zipfile.ZipFile(zipfp, allowZip64=True) - leading = has_leading_dir(zip.namelist()) and flatten - for info in zip.infolist(): - name = info.filename - fn = name - if leading: - fn = split_leading_dir(name)[1] - fn = os.path.join(location, fn) - dir = os.path.dirname(fn) - if not is_within_directory(location, fn): - message = ( - "The zip file ({}) has a file ({}) trying to install " - "outside target directory ({})" - ) - raise InstallationError(message.format(filename, fn, location)) - if fn.endswith("/") or fn.endswith("\\"): - # A directory - ensure_dir(fn) - else: - ensure_dir(dir) - # Don't use read() to avoid allocating an arbitrarily large - # chunk of memory for the file's content - fp = zip.open(name) - try: - with open(fn, "wb") as destfp: - shutil.copyfileobj(fp, destfp) - finally: - fp.close() - if zip_item_is_executable(info): - set_extracted_file_to_default_mode_plus_executable(fn) - finally: - zipfp.close() - - -def untar_file(filename, location): - # type: (str, str) -> None - """ - Untar the file (with path `filename`) to the destination `location`. - All files are written based on system defaults and umask (i.e. permissions - are not preserved), except that regular file members with any execute - permissions (user, group, or world) have "chmod +x" applied after being - written. Note that for windows, any execute changes using os.chmod are - no-ops per the python docs. - """ - ensure_dir(location) - if filename.lower().endswith(".gz") or filename.lower().endswith(".tgz"): - mode = "r:gz" - elif filename.lower().endswith(BZ2_EXTENSIONS): - mode = "r:bz2" - elif filename.lower().endswith(XZ_EXTENSIONS): - mode = "r:xz" - elif filename.lower().endswith(".tar"): - mode = "r" - else: - logger.warning( - "Cannot determine compression type for file %s", - filename, - ) - mode = "r:*" - tar = tarfile.open(filename, mode) - try: - leading = has_leading_dir([member.name for member in tar.getmembers()]) - for member in tar.getmembers(): - fn = member.name - if leading: - fn = split_leading_dir(fn)[1] - path = os.path.join(location, fn) - if not is_within_directory(location, path): - message = ( - "The tar file ({}) has a file ({}) trying to install " - "outside target directory ({})" - ) - raise InstallationError(message.format(filename, path, location)) - if member.isdir(): - ensure_dir(path) - elif member.issym(): - try: - # https://github.com/python/typeshed/issues/2673 - tar._extract_member(member, path) # type: ignore - except Exception as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - "In the tar file %s the member %s is invalid: %s", - filename, - member.name, - exc, - ) - continue - else: - try: - fp = tar.extractfile(member) - except (KeyError, AttributeError) as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - "In the tar file %s the member %s is invalid: %s", - filename, - member.name, - exc, - ) - continue - ensure_dir(os.path.dirname(path)) - assert fp is not None - with open(path, "wb") as destfp: - shutil.copyfileobj(fp, destfp) - fp.close() - # Update the timestamp (useful for cython compiled files) - tar.utime(member, path) - # member have any execute permissions for user/group/world? - if member.mode & 0o111: - set_extracted_file_to_default_mode_plus_executable(path) - finally: - tar.close() - - -def unpack_file( - filename, # type: str - location, # type: str - content_type=None, # type: Optional[str] -): - # type: (...) -> None - filename = os.path.realpath(filename) - if ( - content_type == "application/zip" - or filename.lower().endswith(ZIP_EXTENSIONS) - or zipfile.is_zipfile(filename) - ): - unzip_file(filename, location, flatten=not filename.endswith(".whl")) - elif ( - content_type == "application/x-gzip" - or tarfile.is_tarfile(filename) - or filename.lower().endswith(TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS) - ): - untar_file(filename, location) - else: - # FIXME: handle? - # FIXME: magic signatures? - logger.critical( - "Cannot unpack file %s (downloaded from %s, content-type: %s); " - "cannot detect archive format", - filename, - location, - content_type, - ) - raise InstallationError(f"Cannot determine archive format of {location}") diff --git a/venv/Lib/site-packages/pip/_internal/utils/urls.py b/venv/Lib/site-packages/pip/_internal/utils/urls.py deleted file mode 100644 index 50a04d8..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/urls.py +++ /dev/null @@ -1,49 +0,0 @@ -import os -import sys -import urllib.parse -import urllib.request -from typing import Optional - - -def get_url_scheme(url): - # type: (str) -> Optional[str] - if ":" not in url: - return None - return url.split(":", 1)[0].lower() - - -def path_to_url(path): - # type: (str) -> str - """ - Convert a path to a file: URL. The path will be made absolute and have - quoted path parts. - """ - path = os.path.normpath(os.path.abspath(path)) - url = urllib.parse.urljoin("file:", urllib.request.pathname2url(path)) - return url - - -def url_to_path(url): - # type: (str) -> str - """ - Convert a file: URL to a path. - """ - assert url.startswith( - "file:" - ), f"You can only turn file: urls into filenames (not {url!r})" - - _, netloc, path, _, _ = urllib.parse.urlsplit(url) - - if not netloc or netloc == "localhost": - # According to RFC 8089, same as empty authority. - netloc = "" - elif sys.platform == "win32": - # If we have a UNC path, prepend UNC share notation. - netloc = "\\\\" + netloc - else: - raise ValueError( - f"non-local file URIs are not supported on this platform: {url!r}" - ) - - path = urllib.request.url2pathname(netloc + path) - return path diff --git a/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py b/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py deleted file mode 100644 index 51cacb5..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +++ /dev/null @@ -1,111 +0,0 @@ -import logging -import os -import re -import site -import sys -from typing import List, Optional - -logger = logging.getLogger(__name__) -_INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile( - r"include-system-site-packages\s*=\s*(?Ptrue|false)" -) - - -def _running_under_venv(): - # type: () -> bool - """Checks if sys.base_prefix and sys.prefix match. - - This handles PEP 405 compliant virtual environments. - """ - return sys.prefix != getattr(sys, "base_prefix", sys.prefix) - - -def _running_under_regular_virtualenv(): - # type: () -> bool - """Checks if sys.real_prefix is set. - - This handles virtual environments created with pypa's virtualenv. - """ - # pypa/virtualenv case - return hasattr(sys, "real_prefix") - - -def running_under_virtualenv(): - # type: () -> bool - """Return True if we're running inside a virtualenv, False otherwise.""" - return _running_under_venv() or _running_under_regular_virtualenv() - - -def _get_pyvenv_cfg_lines(): - # type: () -> Optional[List[str]] - """Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines - - Returns None, if it could not read/access the file. - """ - pyvenv_cfg_file = os.path.join(sys.prefix, "pyvenv.cfg") - try: - # Although PEP 405 does not specify, the built-in venv module always - # writes with UTF-8. (pypa/pip#8717) - with open(pyvenv_cfg_file, encoding="utf-8") as f: - return f.read().splitlines() # avoids trailing newlines - except OSError: - return None - - -def _no_global_under_venv(): - # type: () -> bool - """Check `{sys.prefix}/pyvenv.cfg` for system site-packages inclusion - - PEP 405 specifies that when system site-packages are not supposed to be - visible from a virtual environment, `pyvenv.cfg` must contain the following - line: - - include-system-site-packages = false - - Additionally, log a warning if accessing the file fails. - """ - cfg_lines = _get_pyvenv_cfg_lines() - if cfg_lines is None: - # We're not in a "sane" venv, so assume there is no system - # site-packages access (since that's PEP 405's default state). - logger.warning( - "Could not access 'pyvenv.cfg' despite a virtual environment " - "being active. Assuming global site-packages is not accessible " - "in this environment." - ) - return True - - for line in cfg_lines: - match = _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX.match(line) - if match is not None and match.group("value") == "false": - return True - return False - - -def _no_global_under_regular_virtualenv(): - # type: () -> bool - """Check if "no-global-site-packages.txt" exists beside site.py - - This mirrors logic in pypa/virtualenv for determining whether system - site-packages are visible in the virtual environment. - """ - site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) - no_global_site_packages_file = os.path.join( - site_mod_dir, - "no-global-site-packages.txt", - ) - return os.path.exists(no_global_site_packages_file) - - -def virtualenv_no_global(): - # type: () -> bool - """Returns a boolean, whether running in venv with no system site-packages.""" - # PEP 405 compliance needs to be checked first since virtualenv >=20 would - # return True for both checks, but is only able to use the PEP 405 config. - if _running_under_venv(): - return _no_global_under_venv() - - if _running_under_regular_virtualenv(): - return _no_global_under_regular_virtualenv() - - return False diff --git a/venv/Lib/site-packages/pip/_internal/utils/wheel.py b/venv/Lib/site-packages/pip/_internal/utils/wheel.py deleted file mode 100644 index 42f0808..0000000 --- a/venv/Lib/site-packages/pip/_internal/utils/wheel.py +++ /dev/null @@ -1,189 +0,0 @@ -"""Support functions for working with wheel files. -""" - -import logging -from email.message import Message -from email.parser import Parser -from typing import Dict, Tuple -from zipfile import BadZipFile, ZipFile - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import DistInfoDistribution, Distribution - -from pip._internal.exceptions import UnsupportedWheel -from pip._internal.utils.pkg_resources import DictMetadata - -VERSION_COMPATIBLE = (1, 0) - - -logger = logging.getLogger(__name__) - - -class WheelMetadata(DictMetadata): - """Metadata provider that maps metadata decoding exceptions to our - internal exception type. - """ - - def __init__(self, metadata, wheel_name): - # type: (Dict[str, bytes], str) -> None - super().__init__(metadata) - self._wheel_name = wheel_name - - def get_metadata(self, name): - # type: (str) -> str - try: - return super().get_metadata(name) - except UnicodeDecodeError as e: - # Augment the default error with the origin of the file. - raise UnsupportedWheel( - f"Error decoding metadata for {self._wheel_name}: {e}" - ) - - -def pkg_resources_distribution_for_wheel(wheel_zip, name, location): - # type: (ZipFile, str, str) -> Distribution - """Get a pkg_resources distribution given a wheel. - - :raises UnsupportedWheel: on any errors - """ - info_dir, _ = parse_wheel(wheel_zip, name) - - metadata_files = [p for p in wheel_zip.namelist() if p.startswith(f"{info_dir}/")] - - metadata_text = {} # type: Dict[str, bytes] - for path in metadata_files: - _, metadata_name = path.split("/", 1) - - try: - metadata_text[metadata_name] = read_wheel_metadata_file(wheel_zip, path) - except UnsupportedWheel as e: - raise UnsupportedWheel("{} has an invalid wheel, {}".format(name, str(e))) - - metadata = WheelMetadata(metadata_text, location) - - return DistInfoDistribution(location=location, metadata=metadata, project_name=name) - - -def parse_wheel(wheel_zip, name): - # type: (ZipFile, str) -> Tuple[str, Message] - """Extract information from the provided wheel, ensuring it meets basic - standards. - - Returns the name of the .dist-info directory and the parsed WHEEL metadata. - """ - try: - info_dir = wheel_dist_info_dir(wheel_zip, name) - metadata = wheel_metadata(wheel_zip, info_dir) - version = wheel_version(metadata) - except UnsupportedWheel as e: - raise UnsupportedWheel("{} has an invalid wheel, {}".format(name, str(e))) - - check_compatibility(version, name) - - return info_dir, metadata - - -def wheel_dist_info_dir(source, name): - # type: (ZipFile, str) -> str - """Returns the name of the contained .dist-info directory. - - Raises AssertionError or UnsupportedWheel if not found, >1 found, or - it doesn't match the provided name. - """ - # Zip file path separators must be / - subdirs = {p.split("/", 1)[0] for p in source.namelist()} - - info_dirs = [s for s in subdirs if s.endswith(".dist-info")] - - if not info_dirs: - raise UnsupportedWheel(".dist-info directory not found") - - if len(info_dirs) > 1: - raise UnsupportedWheel( - "multiple .dist-info directories found: {}".format(", ".join(info_dirs)) - ) - - info_dir = info_dirs[0] - - info_dir_name = canonicalize_name(info_dir) - canonical_name = canonicalize_name(name) - if not info_dir_name.startswith(canonical_name): - raise UnsupportedWheel( - ".dist-info directory {!r} does not start with {!r}".format( - info_dir, canonical_name - ) - ) - - return info_dir - - -def read_wheel_metadata_file(source, path): - # type: (ZipFile, str) -> bytes - try: - return source.read(path) - # BadZipFile for general corruption, KeyError for missing entry, - # and RuntimeError for password-protected files - except (BadZipFile, KeyError, RuntimeError) as e: - raise UnsupportedWheel(f"could not read {path!r} file: {e!r}") - - -def wheel_metadata(source, dist_info_dir): - # type: (ZipFile, str) -> Message - """Return the WHEEL metadata of an extracted wheel, if possible. - Otherwise, raise UnsupportedWheel. - """ - path = f"{dist_info_dir}/WHEEL" - # Zip file path separators must be / - wheel_contents = read_wheel_metadata_file(source, path) - - try: - wheel_text = wheel_contents.decode() - except UnicodeDecodeError as e: - raise UnsupportedWheel(f"error decoding {path!r}: {e!r}") - - # FeedParser (used by Parser) does not raise any exceptions. The returned - # message may have .defects populated, but for backwards-compatibility we - # currently ignore them. - return Parser().parsestr(wheel_text) - - -def wheel_version(wheel_data): - # type: (Message) -> Tuple[int, ...] - """Given WHEEL metadata, return the parsed Wheel-Version. - Otherwise, raise UnsupportedWheel. - """ - version_text = wheel_data["Wheel-Version"] - if version_text is None: - raise UnsupportedWheel("WHEEL is missing Wheel-Version") - - version = version_text.strip() - - try: - return tuple(map(int, version.split("."))) - except ValueError: - raise UnsupportedWheel(f"invalid Wheel-Version: {version!r}") - - -def check_compatibility(version, name): - # type: (Tuple[int, ...], str) -> None - """Raises errors or warns if called with an incompatible Wheel-Version. - - pip should refuse to install a Wheel-Version that's a major series - ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when - installing a version only minor version ahead (e.g 1.2 > 1.1). - - version: a 2-tuple representing a Wheel-Version (Major, Minor) - name: name of wheel or package to raise exception about - - :raises UnsupportedWheel: when an incompatible Wheel-Version is given - """ - if version[0] > VERSION_COMPATIBLE[0]: - raise UnsupportedWheel( - "{}'s Wheel-Version ({}) is not compatible with this version " - "of pip".format(name, ".".join(map(str, version))) - ) - elif version > VERSION_COMPATIBLE: - logger.warning( - "Installing from a newer Wheel-Version (%s)", - ".".join(map(str, version)), - ) diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__init__.py b/venv/Lib/site-packages/pip/_internal/vcs/__init__.py deleted file mode 100644 index 30025d6..0000000 --- a/venv/Lib/site-packages/pip/_internal/vcs/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Expose a limited set of classes and functions so callers outside of -# the vcs package don't need to import deeper than `pip._internal.vcs`. -# (The test directory may still need to import from a vcs sub-package.) -# Import all vcs modules to register each VCS in the VcsSupport object. -import pip._internal.vcs.bazaar -import pip._internal.vcs.git -import pip._internal.vcs.mercurial -import pip._internal.vcs.subversion # noqa: F401 -from pip._internal.vcs.versioncontrol import ( # noqa: F401 - RemoteNotFoundError, - is_url, - make_vcs_requirement_url, - vcs, -) diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 893688be7c4e7cdeb4b090a6505ddf0fc25d8ffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmZWlO-lnY5Y2Ym?Y7X92n7Yb_Tc^iE#jpfd(c}5gmiaUL-VnnWEbi`@-OYxlYhaJ zNi8DmguIt|k7Q;d7K=FvaZoqnVMNGhO#VmE$Wz#E9iSprq6ke+JUVlF=JAO~YN9im z=_#G+oaTB)XGysAN>=Gtc!6wJVGY_Eh1Sy4tU3BOYk267)j|Vz zjVOV2U^=GcjydV!E=YS(gJYo!_BS>QV>2F7={YZ&W1p|Jty%?-vABy>^W=B^06_1P A#Q*>R diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc deleted file mode 100644 index 604548700ca29e2d85bf696d1adaccc93a55cfef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2999 zcmZ`*TW{RP6`mo7T<%q?TWmK@vMu5yo7ghY0J#`Nki?180>Ktdg#snEASljgmo;yi znUySJ^%5CKU-HslAU*mo&1;|h7lH!rIm4AKIWCDgJTr4RJeTjB!?@q?5V#JqcjA9{ z3Hc9Bu3ii#U&2uT0>TNW842;}WHfg|CwD_PXCb4w=4M{*hko7)TXxQ}Aa93l%X?WT z?}lB=`&lpVhy8pI4)V2dEgy!%d_7#JM3A!$v3X9zt?vkL@!%=pff$~;;kH;mdqZrW zQ+S{Lm5kfZK^rm|yM}$ADs6&4S2`_=I5XbvqRPbBF`YlAoQq;tJkh4dQ&na0aa6^6 zKBlIZ$B#vnlzAQ(9OhkIk8~L=WH$Cp@YO=k|5WUkX7dM;ms(6p{is|N{97qYX*xfM z!{&R+4E`phf-gTT3oXmcxQB^KP`9fW`VcSm1c)FZ@XQu3bXL z$Gxm-w)WFZB-C2j5ab;g4`HYP2&YRjb3hMgQaktLGXj2hr8tyB*tF!A=-UTVE)GRj zR?|wBGa2W3TFj=^v7VPjG)wh#7Uv>TRh)?Fp(qZgS-Lk>sTTKO>2W+0YFee$G)fCC zB*0+`;h64Ot9Pnnvpy3#+KZKl;KNZYXX;H<5A`H&eY0`T&aZ@$ivXgW52FRc8ukS+ zOZSYNlM|-t83c9dESYwf^pu`MQfS5pmT*{<7ee;CZu60U{s<)5;Za{kU^tNS1yW6 zc>9Jak?kAC1!Rf~5Qlv*zqBc%LOZ!QI!JPE&v+RYxq)Z5_k~X8Q6Y{-FjZSXh!apo z9eex#Wvz`Dj$02`PP`Pq<~(#H4(q&|z%0o>iKghbQ*aM=es-`zfLq*&@zqfZ-+Tr* zNsjo~k@$kObj;)}+osQ zUML}y zGl&tS7v=0{cH%4@jMg{gAG=_?d*(n=y4-{L*APGV%w00@#a-YSa@@Z~Y%+S7jB-yy zQl3(WP$*jz5V-VS@&|VhZtK>MP`ANzt%-aCGV?jE5X#pv@Z8YO|5+}s@JMmib7v5JjZG|4lHKC(^Z!0EG>kBkZ74!@(yeRkL%%9 zl&UBzlNbY3l~DXjc`UKQO6=rgU%rRZ0g7NxGz>he48sEreG)Q!>s9m(Fy_+sIt=}n zaDqYr6PMA>3*YTQv;wC?2N1U*-1YXA$h~~;TFelgmoXc`ht;^73sYSU4qCLDRLFyb{11mLDVe1j%P8 z&|f8cBC_lv;caF607Y!-4}e2P;fdHW?Cm+U!-7G;0^kM#%!V*p4wWcBzF}I}F#ztaH%uQ(YJC}`qXQ9(f?c}LSBo=bp6~nh*C!-d7@N zY*Lxg^)ujyVrLcgr1|HQZTueQo`fH0B6~>sKujBe_`Pk_@^f6=MuO%cc4zS4D&!SV fShu00Oz?*$q+cKk6|M(#3;ID1?%P4f9ZvoS+pX>L diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc deleted file mode 100644 index 18e8793d35b107e7d58f1145eeda29bed5c7632b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9975 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 diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc deleted file mode 100644 index 01a2ccf9e41f422b702622d47a397e12e516b840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7954 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 diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc deleted file mode 100644 index 266e5fe52e4a2c24668fad1d61f7b20706c1f05f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19099 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 s{_7|$!e}C List[str] - return ['-r', rev] - - def fetch_new(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - rev_display = rev_options.to_display() - logger.info( - 'Checking out %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cmd_args = ( - make_command('branch', '-q', rev_options.to_args(), url, dest) - ) - self.run_command(cmd_args) - - def switch(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - self.run_command(make_command('switch', url), cwd=dest) - - def update(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - cmd_args = make_command('pull', '-q', rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_url_rev_and_auth(cls, url): - # type: (str) -> Tuple[str, Optional[str], AuthInfo] - # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it - url, rev, user_pass = super().get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'bzr+' + url - return url, rev, user_pass - - @classmethod - def get_remote_url(cls, location): - # type: (str) -> str - urls = cls.run_command( - ['info'], show_stdout=False, stdout_only=True, cwd=location - ) - for line in urls.splitlines(): - line = line.strip() - for x in ('checkout of branch: ', - 'parent branch: '): - if line.startswith(x): - repo = line.split(x)[1] - if cls._is_local_repository(repo): - return path_to_url(repo) - return repo - raise RemoteNotFoundError - - @classmethod - def get_revision(cls, location): - # type: (str) -> str - revision = cls.run_command( - ['revno'], show_stdout=False, stdout_only=True, cwd=location, - ) - return revision.splitlines()[-1] - - @classmethod - def is_commit_id_equal(cls, dest, name): - # type: (str, Optional[str]) -> bool - """Always assume the versions don't match""" - return False - - -vcs.register(Bazaar) diff --git a/venv/Lib/site-packages/pip/_internal/vcs/git.py b/venv/Lib/site-packages/pip/_internal/vcs/git.py deleted file mode 100644 index b7c1b9f..0000000 --- a/venv/Lib/site-packages/pip/_internal/vcs/git.py +++ /dev/null @@ -1,450 +0,0 @@ -import logging -import os.path -import re -import urllib.parse -import urllib.request -from typing import List, Optional, Tuple - -from pip._vendor.packaging.version import _BaseVersion -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.utils.misc import HiddenText, display_path, hide_url -from pip._internal.utils.subprocess import make_command -from pip._internal.vcs.versioncontrol import ( - AuthInfo, - RemoteNotFoundError, - RevOptions, - VersionControl, - find_path_to_setup_from_repo_root, - vcs, -) - -urlsplit = urllib.parse.urlsplit -urlunsplit = urllib.parse.urlunsplit - - -logger = logging.getLogger(__name__) - - -HASH_REGEX = re.compile('^[a-fA-F0-9]{40}$') - - -def looks_like_hash(sha): - # type: (str) -> bool - return bool(HASH_REGEX.match(sha)) - - -class Git(VersionControl): - name = 'git' - dirname = '.git' - repo_name = 'clone' - schemes = ( - 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', - ) - # Prevent the user's environment variables from interfering with pip: - # https://github.com/pypa/pip/issues/1130 - unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') - default_arg_rev = 'HEAD' - - @staticmethod - def get_base_rev_args(rev): - # type: (str) -> List[str] - return [rev] - - def is_immutable_rev_checkout(self, url, dest): - # type: (str, str) -> bool - _, rev_options = self.get_url_rev_options(hide_url(url)) - if not rev_options.rev: - return False - if not self.is_commit_id_equal(dest, rev_options.rev): - # the current commit is different from rev, - # which means rev was something else than a commit hash - return False - # return False in the rare case rev is both a commit hash - # and a tag or a branch; we don't want to cache in that case - # because that branch/tag could point to something else in the future - is_tag_or_branch = bool( - self.get_revision_sha(dest, rev_options.rev)[0] - ) - return not is_tag_or_branch - - def get_git_version(self): - # type: () -> _BaseVersion - VERSION_PFX = 'git version ' - version = self.run_command( - ['version'], show_stdout=False, stdout_only=True - ) - if version.startswith(VERSION_PFX): - version = version[len(VERSION_PFX):].split()[0] - else: - version = '' - # get first 3 positions of the git version because - # on windows it is x.y.z.windows.t, and this parses as - # LegacyVersion which always smaller than a Version. - version = '.'.join(version.split('.')[:3]) - return parse_version(version) - - @classmethod - def get_current_branch(cls, location): - # type: (str) -> Optional[str] - """ - Return the current branch, or None if HEAD isn't at a branch - (e.g. detached HEAD). - """ - # git-symbolic-ref exits with empty stdout if "HEAD" is a detached - # HEAD rather than a symbolic ref. In addition, the -q causes the - # command to exit with status code 1 instead of 128 in this case - # and to suppress the message to stderr. - args = ['symbolic-ref', '-q', 'HEAD'] - output = cls.run_command( - args, - extra_ok_returncodes=(1, ), - show_stdout=False, - stdout_only=True, - cwd=location, - ) - ref = output.strip() - - if ref.startswith('refs/heads/'): - return ref[len('refs/heads/'):] - - return None - - @classmethod - def get_revision_sha(cls, dest, rev): - # type: (str, str) -> Tuple[Optional[str], bool] - """ - Return (sha_or_none, is_branch), where sha_or_none is a commit hash - if the revision names a remote branch or tag, otherwise None. - - Args: - dest: the repository directory. - rev: the revision name. - """ - # Pass rev to pre-filter the list. - output = cls.run_command( - ['show-ref', rev], - cwd=dest, - show_stdout=False, - stdout_only=True, - on_returncode='ignore', - ) - refs = {} - # NOTE: We do not use splitlines here since that would split on other - # unicode separators, which can be maliciously used to install a - # different revision. - for line in output.strip().split("\n"): - line = line.rstrip("\r") - if not line: - continue - try: - ref_sha, ref_name = line.split(" ", maxsplit=2) - except ValueError: - # Include the offending line to simplify troubleshooting if - # this error ever occurs. - raise ValueError(f'unexpected show-ref line: {line!r}') - - refs[ref_name] = ref_sha - - branch_ref = f'refs/remotes/origin/{rev}' - tag_ref = f'refs/tags/{rev}' - - sha = refs.get(branch_ref) - if sha is not None: - return (sha, True) - - sha = refs.get(tag_ref) - - return (sha, False) - - @classmethod - def _should_fetch(cls, dest, rev): - # type: (str, str) -> bool - """ - Return true if rev is a ref or is a commit that we don't have locally. - - Branches and tags are not considered in this method because they are - assumed to be always available locally (which is a normal outcome of - ``git clone`` and ``git fetch --tags``). - """ - if rev.startswith("refs/"): - # Always fetch remote refs. - return True - - if not looks_like_hash(rev): - # Git fetch would fail with abbreviated commits. - return False - - if cls.has_commit(dest, rev): - # Don't fetch if we have the commit locally. - return False - - return True - - @classmethod - def resolve_revision(cls, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> RevOptions - """ - Resolve a revision to a new RevOptions object with the SHA1 of the - branch, tag, or ref if found. - - Args: - rev_options: a RevOptions object. - """ - rev = rev_options.arg_rev - # The arg_rev property's implementation for Git ensures that the - # rev return value is always non-None. - assert rev is not None - - sha, is_branch = cls.get_revision_sha(dest, rev) - - if sha is not None: - rev_options = rev_options.make_new(sha) - rev_options.branch_name = rev if is_branch else None - - return rev_options - - # Do not show a warning for the common case of something that has - # the form of a Git commit hash. - if not looks_like_hash(rev): - logger.warning( - "Did not find branch or tag '%s', assuming revision or ref.", - rev, - ) - - if not cls._should_fetch(dest, rev): - return rev_options - - # fetch the requested revision - cls.run_command( - make_command('fetch', '-q', url, rev_options.to_args()), - cwd=dest, - ) - # Change the revision to the SHA of the ref we fetched - sha = cls.get_revision(dest, rev='FETCH_HEAD') - rev_options = rev_options.make_new(sha) - - return rev_options - - @classmethod - def is_commit_id_equal(cls, dest, name): - # type: (str, Optional[str]) -> bool - """ - Return whether the current commit hash equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - if not name: - # Then avoid an unnecessary subprocess call. - return False - - return cls.get_revision(dest) == name - - def fetch_new(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - rev_display = rev_options.to_display() - logger.info('Cloning %s%s to %s', url, rev_display, display_path(dest)) - self.run_command(make_command('clone', '-q', url, dest)) - - if rev_options.rev: - # Then a specific revision was requested. - rev_options = self.resolve_revision(dest, url, rev_options) - branch_name = getattr(rev_options, 'branch_name', None) - if branch_name is None: - # Only do a checkout if the current commit id doesn't match - # the requested revision. - if not self.is_commit_id_equal(dest, rev_options.rev): - cmd_args = make_command( - 'checkout', '-q', rev_options.to_args(), - ) - self.run_command(cmd_args, cwd=dest) - elif self.get_current_branch(dest) != branch_name: - # Then a specific branch was requested, and that branch - # is not yet checked out. - track_branch = f'origin/{branch_name}' - cmd_args = [ - 'checkout', '-b', branch_name, '--track', track_branch, - ] - self.run_command(cmd_args, cwd=dest) - - #: repo may contain submodules - self.update_submodules(dest) - - def switch(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - self.run_command( - make_command('config', 'remote.origin.url', url), - cwd=dest, - ) - cmd_args = make_command('checkout', '-q', rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - - self.update_submodules(dest) - - def update(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - # First fetch changes from the default remote - if self.get_git_version() >= parse_version('1.9.0'): - # fetch tags in addition to everything else - self.run_command(['fetch', '-q', '--tags'], cwd=dest) - else: - self.run_command(['fetch', '-q'], cwd=dest) - # Then reset to wanted revision (maybe even origin/master) - rev_options = self.resolve_revision(dest, url, rev_options) - cmd_args = make_command('reset', '--hard', '-q', rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - #: update submodules - self.update_submodules(dest) - - @classmethod - def get_remote_url(cls, location): - # type: (str) -> str - """ - Return URL of the first remote encountered. - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - # We need to pass 1 for extra_ok_returncodes since the command - # exits with return code 1 if there are no matching lines. - stdout = cls.run_command( - ['config', '--get-regexp', r'remote\..*\.url'], - extra_ok_returncodes=(1, ), - show_stdout=False, - stdout_only=True, - cwd=location, - ) - remotes = stdout.splitlines() - try: - found_remote = remotes[0] - except IndexError: - raise RemoteNotFoundError - - for remote in remotes: - if remote.startswith('remote.origin.url '): - found_remote = remote - break - url = found_remote.split(' ')[1] - return url.strip() - - @classmethod - def has_commit(cls, location, rev): - # type: (str, str) -> bool - """ - Check if rev is a commit that is available in the local repository. - """ - try: - cls.run_command( - ['rev-parse', '-q', '--verify', "sha^" + rev], - cwd=location, - log_failed_cmd=False, - ) - except InstallationError: - return False - else: - return True - - @classmethod - def get_revision(cls, location, rev=None): - # type: (str, Optional[str]) -> str - if rev is None: - rev = 'HEAD' - current_rev = cls.run_command( - ['rev-parse', rev], - show_stdout=False, - stdout_only=True, - cwd=location, - ) - return current_rev.strip() - - @classmethod - def get_subdirectory(cls, location): - # type: (str) -> Optional[str] - """ - Return the path to setup.py, relative to the repo root. - Return None if setup.py is in the repo root. - """ - # find the repo root - git_dir = cls.run_command( - ['rev-parse', '--git-dir'], - show_stdout=False, - stdout_only=True, - cwd=location, - ).strip() - if not os.path.isabs(git_dir): - git_dir = os.path.join(location, git_dir) - repo_root = os.path.abspath(os.path.join(git_dir, '..')) - return find_path_to_setup_from_repo_root(location, repo_root) - - @classmethod - def get_url_rev_and_auth(cls, url): - # type: (str) -> Tuple[str, Optional[str], AuthInfo] - """ - Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. - That's required because although they use SSH they sometimes don't - work with a ssh:// scheme (e.g. GitHub). But we need a scheme for - parsing. Hence we remove it again afterwards and return it as a stub. - """ - # Works around an apparent Git bug - # (see https://article.gmane.org/gmane.comp.version-control.git/146500) - scheme, netloc, path, query, fragment = urlsplit(url) - if scheme.endswith('file'): - initial_slashes = path[:-len(path.lstrip('/'))] - newpath = ( - initial_slashes + - urllib.request.url2pathname(path) - .replace('\\', '/').lstrip('/') - ) - after_plus = scheme.find('+') + 1 - url = scheme[:after_plus] + urlunsplit( - (scheme[after_plus:], netloc, newpath, query, fragment), - ) - - if '://' not in url: - assert 'file:' not in url - url = url.replace('git+', 'git+ssh://') - url, rev, user_pass = super().get_url_rev_and_auth(url) - url = url.replace('ssh://', '') - else: - url, rev, user_pass = super().get_url_rev_and_auth(url) - - return url, rev, user_pass - - @classmethod - def update_submodules(cls, location): - # type: (str) -> None - if not os.path.exists(os.path.join(location, '.gitmodules')): - return - cls.run_command( - ['submodule', 'update', '--init', '--recursive', '-q'], - cwd=location, - ) - - @classmethod - def get_repository_root(cls, location): - # type: (str) -> Optional[str] - loc = super().get_repository_root(location) - if loc: - return loc - try: - r = cls.run_command( - ['rev-parse', '--show-toplevel'], - cwd=location, - show_stdout=False, - stdout_only=True, - on_returncode='raise', - log_failed_cmd=False, - ) - except BadCommand: - logger.debug("could not determine if %s is under git control " - "because git is not available", location) - return None - except InstallationError: - return None - return os.path.normpath(r.rstrip('\r\n')) - - -vcs.register(Git) diff --git a/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py b/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py deleted file mode 100644 index b4f887d..0000000 --- a/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +++ /dev/null @@ -1,158 +0,0 @@ -import configparser -import logging -import os -from typing import List, Optional - -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.utils.misc import HiddenText, display_path -from pip._internal.utils.subprocess import make_command -from pip._internal.utils.urls import path_to_url -from pip._internal.vcs.versioncontrol import ( - RevOptions, - VersionControl, - find_path_to_setup_from_repo_root, - vcs, -) - -logger = logging.getLogger(__name__) - - -class Mercurial(VersionControl): - name = 'hg' - dirname = '.hg' - repo_name = 'clone' - schemes = ( - 'hg+file', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http', - ) - - @staticmethod - def get_base_rev_args(rev): - # type: (str) -> List[str] - return [rev] - - def fetch_new(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - rev_display = rev_options.to_display() - logger.info( - 'Cloning hg %s%s to %s', - url, - rev_display, - display_path(dest), - ) - self.run_command(make_command('clone', '--noupdate', '-q', url, dest)) - self.run_command( - make_command('update', '-q', rev_options.to_args()), - cwd=dest, - ) - - def switch(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - repo_config = os.path.join(dest, self.dirname, 'hgrc') - config = configparser.RawConfigParser() - try: - config.read(repo_config) - config.set('paths', 'default', url.secret) - with open(repo_config, 'w') as config_file: - config.write(config_file) - except (OSError, configparser.NoSectionError) as exc: - logger.warning( - 'Could not switch Mercurial repository to %s: %s', url, exc, - ) - else: - cmd_args = make_command('update', '-q', rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - - def update(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - self.run_command(['pull', '-q'], cwd=dest) - cmd_args = make_command('update', '-q', rev_options.to_args()) - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_remote_url(cls, location): - # type: (str) -> str - url = cls.run_command( - ['showconfig', 'paths.default'], - show_stdout=False, - stdout_only=True, - cwd=location, - ).strip() - if cls._is_local_repository(url): - url = path_to_url(url) - return url.strip() - - @classmethod - def get_revision(cls, location): - # type: (str) -> str - """ - Return the repository-local changeset revision number, as an integer. - """ - current_revision = cls.run_command( - ['parents', '--template={rev}'], - show_stdout=False, - stdout_only=True, - cwd=location, - ).strip() - return current_revision - - @classmethod - def get_requirement_revision(cls, location): - # type: (str) -> str - """ - Return the changeset identification hash, as a 40-character - hexadecimal string - """ - current_rev_hash = cls.run_command( - ['parents', '--template={node}'], - show_stdout=False, - stdout_only=True, - cwd=location, - ).strip() - return current_rev_hash - - @classmethod - def is_commit_id_equal(cls, dest, name): - # type: (str, Optional[str]) -> bool - """Always assume the versions don't match""" - return False - - @classmethod - def get_subdirectory(cls, location): - # type: (str) -> Optional[str] - """ - Return the path to setup.py, relative to the repo root. - Return None if setup.py is in the repo root. - """ - # find the repo root - repo_root = cls.run_command( - ['root'], show_stdout=False, stdout_only=True, cwd=location - ).strip() - if not os.path.isabs(repo_root): - repo_root = os.path.abspath(os.path.join(location, repo_root)) - return find_path_to_setup_from_repo_root(location, repo_root) - - @classmethod - def get_repository_root(cls, location): - # type: (str) -> Optional[str] - loc = super().get_repository_root(location) - if loc: - return loc - try: - r = cls.run_command( - ['root'], - cwd=location, - show_stdout=False, - stdout_only=True, - on_returncode='raise', - log_failed_cmd=False, - ) - except BadCommand: - logger.debug("could not determine if %s is under hg control " - "because hg is not available", location) - return None - except InstallationError: - return None - return os.path.normpath(r.rstrip('\r\n')) - - -vcs.register(Mercurial) diff --git a/venv/Lib/site-packages/pip/_internal/vcs/subversion.py b/venv/Lib/site-packages/pip/_internal/vcs/subversion.py deleted file mode 100644 index 4d1237c..0000000 --- a/venv/Lib/site-packages/pip/_internal/vcs/subversion.py +++ /dev/null @@ -1,329 +0,0 @@ -import logging -import os -import re -from typing import List, Optional, Tuple - -from pip._internal.utils.misc import ( - HiddenText, - display_path, - is_console_interactive, - split_auth_from_netloc, -) -from pip._internal.utils.subprocess import CommandArgs, make_command -from pip._internal.vcs.versioncontrol import ( - AuthInfo, - RemoteNotFoundError, - RevOptions, - VersionControl, - vcs, -) - -logger = logging.getLogger(__name__) - -_svn_xml_url_re = re.compile('url="([^"]+)"') -_svn_rev_re = re.compile(r'committed-rev="(\d+)"') -_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') -_svn_info_xml_url_re = re.compile(r'(.*)') - - -class Subversion(VersionControl): - name = 'svn' - dirname = '.svn' - repo_name = 'checkout' - schemes = ( - 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn', 'svn+file' - ) - - @classmethod - def should_add_vcs_url_prefix(cls, remote_url): - # type: (str) -> bool - return True - - @staticmethod - def get_base_rev_args(rev): - # type: (str) -> List[str] - return ['-r', rev] - - @classmethod - def get_revision(cls, location): - # type: (str) -> str - """ - Return the maximum revision for all files under a given location - """ - # Note: taken from setuptools.command.egg_info - revision = 0 - - for base, dirs, _ in os.walk(location): - if cls.dirname not in dirs: - dirs[:] = [] - continue # no sense walking uncontrolled subdirs - dirs.remove(cls.dirname) - entries_fn = os.path.join(base, cls.dirname, 'entries') - if not os.path.exists(entries_fn): - # FIXME: should we warn? - continue - - dirurl, localrev = cls._get_svn_url_rev(base) - - if base == location: - assert dirurl is not None - base = dirurl + '/' # save the root url - elif not dirurl or not dirurl.startswith(base): - dirs[:] = [] - continue # not part of the same svn tree, skip it - revision = max(revision, localrev) - return str(revision) - - @classmethod - def get_netloc_and_auth(cls, netloc, scheme): - # type: (str, str) -> Tuple[str, Tuple[Optional[str], Optional[str]]] - """ - This override allows the auth information to be passed to svn via the - --username and --password options instead of via the URL. - """ - if scheme == 'ssh': - # The --username and --password options can't be used for - # svn+ssh URLs, so keep the auth information in the URL. - return super().get_netloc_and_auth(netloc, scheme) - - return split_auth_from_netloc(netloc) - - @classmethod - def get_url_rev_and_auth(cls, url): - # type: (str) -> Tuple[str, Optional[str], AuthInfo] - # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it - url, rev, user_pass = super().get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'svn+' + url - return url, rev, user_pass - - @staticmethod - def make_rev_args(username, password): - # type: (Optional[str], Optional[HiddenText]) -> CommandArgs - extra_args = [] # type: CommandArgs - if username: - extra_args += ['--username', username] - if password: - extra_args += ['--password', password] - - return extra_args - - @classmethod - def get_remote_url(cls, location): - # type: (str) -> str - # In cases where the source is in a subdirectory, not alongside - # setup.py we have to look up in the location until we find a real - # setup.py - orig_location = location - while not os.path.exists(os.path.join(location, 'setup.py')): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding setup.py - logger.warning( - "Could not find setup.py for directory %s (tried all " - "parent directories)", - orig_location, - ) - raise RemoteNotFoundError - - url, _rev = cls._get_svn_url_rev(location) - if url is None: - raise RemoteNotFoundError - - return url - - @classmethod - def _get_svn_url_rev(cls, location): - # type: (str) -> Tuple[Optional[str], int] - from pip._internal.exceptions import InstallationError - - entries_path = os.path.join(location, cls.dirname, 'entries') - if os.path.exists(entries_path): - with open(entries_path) as f: - data = f.read() - else: # subversion >= 1.7 does not have the 'entries' file - data = '' - - url = None - if (data.startswith('8') or - data.startswith('9') or - data.startswith('10')): - entries = list(map(str.splitlines, data.split('\n\x0c\n'))) - del entries[0][0] # get rid of the '8' - url = entries[0][3] - revs = [int(d[9]) for d in entries if len(d) > 9 and d[9]] + [0] - elif data.startswith('= 1.7 - # Note that using get_remote_call_options is not necessary here - # because `svn info` is being run against a local directory. - # We don't need to worry about making sure interactive mode - # is being used to prompt for passwords, because passwords - # are only potentially needed for remote server requests. - xml = cls.run_command( - ['info', '--xml', location], - show_stdout=False, - stdout_only=True, - ) - match = _svn_info_xml_url_re.search(xml) - assert match is not None - url = match.group(1) - revs = [ - int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) - ] - except InstallationError: - url, revs = None, [] - - if revs: - rev = max(revs) - else: - rev = 0 - - return url, rev - - @classmethod - def is_commit_id_equal(cls, dest, name): - # type: (str, Optional[str]) -> bool - """Always assume the versions don't match""" - return False - - def __init__(self, use_interactive=None): - # type: (bool) -> None - if use_interactive is None: - use_interactive = is_console_interactive() - self.use_interactive = use_interactive - - # This member is used to cache the fetched version of the current - # ``svn`` client. - # Special value definitions: - # None: Not evaluated yet. - # Empty tuple: Could not parse version. - self._vcs_version = None # type: Optional[Tuple[int, ...]] - - super().__init__() - - def call_vcs_version(self): - # type: () -> Tuple[int, ...] - """Query the version of the currently installed Subversion client. - - :return: A tuple containing the parts of the version information or - ``()`` if the version returned from ``svn`` could not be parsed. - :raises: BadCommand: If ``svn`` is not installed. - """ - # Example versions: - # svn, version 1.10.3 (r1842928) - # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 - # svn, version 1.7.14 (r1542130) - # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu - # svn, version 1.12.0-SlikSvn (SlikSvn/1.12.0) - # compiled May 28 2019, 13:44:56 on x86_64-microsoft-windows6.2 - version_prefix = 'svn, version ' - version = self.run_command( - ['--version'], show_stdout=False, stdout_only=True - ) - if not version.startswith(version_prefix): - return () - - version = version[len(version_prefix):].split()[0] - version_list = version.partition('-')[0].split('.') - try: - parsed_version = tuple(map(int, version_list)) - except ValueError: - return () - - return parsed_version - - def get_vcs_version(self): - # type: () -> Tuple[int, ...] - """Return the version of the currently installed Subversion client. - - If the version of the Subversion client has already been queried, - a cached value will be used. - - :return: A tuple containing the parts of the version information or - ``()`` if the version returned from ``svn`` could not be parsed. - :raises: BadCommand: If ``svn`` is not installed. - """ - if self._vcs_version is not None: - # Use cached version, if available. - # If parsing the version failed previously (empty tuple), - # do not attempt to parse it again. - return self._vcs_version - - vcs_version = self.call_vcs_version() - self._vcs_version = vcs_version - return vcs_version - - def get_remote_call_options(self): - # type: () -> CommandArgs - """Return options to be used on calls to Subversion that contact the server. - - These options are applicable for the following ``svn`` subcommands used - in this class. - - - checkout - - switch - - update - - :return: A list of command line arguments to pass to ``svn``. - """ - if not self.use_interactive: - # --non-interactive switch is available since Subversion 0.14.4. - # Subversion < 1.8 runs in interactive mode by default. - return ['--non-interactive'] - - svn_version = self.get_vcs_version() - # By default, Subversion >= 1.8 runs in non-interactive mode if - # stdin is not a TTY. Since that is how pip invokes SVN, in - # call_subprocess(), pip must pass --force-interactive to ensure - # the user can be prompted for a password, if required. - # SVN added the --force-interactive option in SVN 1.8. Since - # e.g. RHEL/CentOS 7, which is supported until 2024, ships with - # SVN 1.7, pip should continue to support SVN 1.7. Therefore, pip - # can't safely add the option if the SVN version is < 1.8 (or unknown). - if svn_version >= (1, 8): - return ['--force-interactive'] - - return [] - - def fetch_new(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - rev_display = rev_options.to_display() - logger.info( - 'Checking out %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cmd_args = make_command( - 'checkout', '-q', self.get_remote_call_options(), - rev_options.to_args(), url, dest, - ) - self.run_command(cmd_args) - - def switch(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - cmd_args = make_command( - 'switch', self.get_remote_call_options(), rev_options.to_args(), - url, dest, - ) - self.run_command(cmd_args) - - def update(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - cmd_args = make_command( - 'update', self.get_remote_call_options(), rev_options.to_args(), - dest, - ) - self.run_command(cmd_args) - - -vcs.register(Subversion) diff --git a/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py b/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py deleted file mode 100644 index 97977b5..0000000 --- a/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +++ /dev/null @@ -1,715 +0,0 @@ -"""Handles all VCS (version control) support""" - -import logging -import os -import shutil -import sys -import urllib.parse -from typing import ( - Any, - Dict, - Iterable, - Iterator, - List, - Mapping, - Optional, - Tuple, - Type, - Union, -) - -from pip._internal.cli.spinners import SpinnerInterface -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.utils.misc import ( - HiddenText, - ask_path_exists, - backup_dir, - display_path, - hide_url, - hide_value, - rmtree, -) -from pip._internal.utils.subprocess import CommandArgs, call_subprocess, make_command -from pip._internal.utils.urls import get_url_scheme - -__all__ = ['vcs'] - - -logger = logging.getLogger(__name__) - -AuthInfo = Tuple[Optional[str], Optional[str]] - - -def is_url(name): - # type: (str) -> bool - """ - Return true if the name looks like a URL. - """ - scheme = get_url_scheme(name) - if scheme is None: - return False - return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes - - -def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): - # type: (str, str, str, Optional[str]) -> str - """ - Return the URL for a VCS requirement. - - Args: - repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). - project_name: the (unescaped) project name. - """ - egg_project_name = project_name.replace("-", "_") - req = f'{repo_url}@{rev}#egg={egg_project_name}' - if subdir: - req += f'&subdirectory={subdir}' - - return req - - -def find_path_to_setup_from_repo_root(location, repo_root): - # type: (str, str) -> Optional[str] - """ - Find the path to `setup.py` by searching up the filesystem from `location`. - Return the path to `setup.py` relative to `repo_root`. - Return None if `setup.py` is in `repo_root` or cannot be found. - """ - # find setup.py - orig_location = location - while not os.path.exists(os.path.join(location, 'setup.py')): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding setup.py - logger.warning( - "Could not find setup.py for directory %s (tried all " - "parent directories)", - orig_location, - ) - return None - - if os.path.samefile(repo_root, location): - return None - - return os.path.relpath(location, repo_root) - - -class RemoteNotFoundError(Exception): - pass - - -class RevOptions: - - """ - Encapsulates a VCS-specific revision to install, along with any VCS - install options. - - Instances of this class should be treated as if immutable. - """ - - def __init__( - self, - vc_class, # type: Type[VersionControl] - rev=None, # type: Optional[str] - extra_args=None, # type: Optional[CommandArgs] - ): - # type: (...) -> None - """ - Args: - vc_class: a VersionControl subclass. - rev: the name of the revision to install. - extra_args: a list of extra options. - """ - if extra_args is None: - extra_args = [] - - self.extra_args = extra_args - self.rev = rev - self.vc_class = vc_class - self.branch_name = None # type: Optional[str] - - def __repr__(self): - # type: () -> str - return f'' - - @property - def arg_rev(self): - # type: () -> Optional[str] - if self.rev is None: - return self.vc_class.default_arg_rev - - return self.rev - - def to_args(self): - # type: () -> CommandArgs - """ - Return the VCS-specific command arguments. - """ - args = [] # type: CommandArgs - rev = self.arg_rev - if rev is not None: - args += self.vc_class.get_base_rev_args(rev) - args += self.extra_args - - return args - - def to_display(self): - # type: () -> str - if not self.rev: - return '' - - return f' (to revision {self.rev})' - - def make_new(self, rev): - # type: (str) -> RevOptions - """ - Make a copy of the current instance, but with a new rev. - - Args: - rev: the name of the revision for the new object. - """ - return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) - - -class VcsSupport: - _registry = {} # type: Dict[str, VersionControl] - schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] - - def __init__(self): - # type: () -> None - # Register more schemes with urlparse for various version control - # systems - urllib.parse.uses_netloc.extend(self.schemes) - super().__init__() - - def __iter__(self): - # type: () -> Iterator[str] - return self._registry.__iter__() - - @property - def backends(self): - # type: () -> List[VersionControl] - return list(self._registry.values()) - - @property - def dirnames(self): - # type: () -> List[str] - return [backend.dirname for backend in self.backends] - - @property - def all_schemes(self): - # type: () -> List[str] - schemes = [] # type: List[str] - for backend in self.backends: - schemes.extend(backend.schemes) - return schemes - - def register(self, cls): - # type: (Type[VersionControl]) -> None - if not hasattr(cls, 'name'): - logger.warning('Cannot register VCS %s', cls.__name__) - return - if cls.name not in self._registry: - self._registry[cls.name] = cls() - logger.debug('Registered VCS backend: %s', cls.name) - - def unregister(self, name): - # type: (str) -> None - if name in self._registry: - del self._registry[name] - - def get_backend_for_dir(self, location): - # type: (str) -> Optional[VersionControl] - """ - Return a VersionControl object if a repository of that type is found - at the given directory. - """ - vcs_backends = {} - for vcs_backend in self._registry.values(): - repo_path = vcs_backend.get_repository_root(location) - if not repo_path: - continue - logger.debug('Determine that %s uses VCS: %s', - location, vcs_backend.name) - vcs_backends[repo_path] = vcs_backend - - if not vcs_backends: - return None - - # Choose the VCS in the inner-most directory. Since all repository - # roots found here would be either `location` or one of its - # parents, the longest path should have the most path components, - # i.e. the backend representing the inner-most repository. - inner_most_repo_path = max(vcs_backends, key=len) - return vcs_backends[inner_most_repo_path] - - def get_backend_for_scheme(self, scheme): - # type: (str) -> Optional[VersionControl] - """ - Return a VersionControl object or None. - """ - for vcs_backend in self._registry.values(): - if scheme in vcs_backend.schemes: - return vcs_backend - return None - - def get_backend(self, name): - # type: (str) -> Optional[VersionControl] - """ - Return a VersionControl object or None. - """ - name = name.lower() - return self._registry.get(name) - - -vcs = VcsSupport() - - -class VersionControl: - name = '' - dirname = '' - repo_name = '' - # List of supported schemes for this Version Control - schemes = () # type: Tuple[str, ...] - # Iterable of environment variable names to pass to call_subprocess(). - unset_environ = () # type: Tuple[str, ...] - default_arg_rev = None # type: Optional[str] - - @classmethod - def should_add_vcs_url_prefix(cls, remote_url): - # type: (str) -> bool - """ - Return whether the vcs prefix (e.g. "git+") should be added to a - repository's remote url when used in a requirement. - """ - return not remote_url.lower().startswith(f'{cls.name}:') - - @classmethod - def get_subdirectory(cls, location): - # type: (str) -> Optional[str] - """ - Return the path to setup.py, relative to the repo root. - Return None if setup.py is in the repo root. - """ - return None - - @classmethod - def get_requirement_revision(cls, repo_dir): - # type: (str) -> str - """ - Return the revision string that should be used in a requirement. - """ - return cls.get_revision(repo_dir) - - @classmethod - def get_src_requirement(cls, repo_dir, project_name): - # type: (str, str) -> str - """ - Return the requirement string to use to redownload the files - currently at the given repository directory. - - Args: - project_name: the (unescaped) project name. - - The return value has a form similar to the following: - - {repository_url}@{revision}#egg={project_name} - """ - repo_url = cls.get_remote_url(repo_dir) - - if cls.should_add_vcs_url_prefix(repo_url): - repo_url = f'{cls.name}+{repo_url}' - - revision = cls.get_requirement_revision(repo_dir) - subdir = cls.get_subdirectory(repo_dir) - req = make_vcs_requirement_url(repo_url, revision, project_name, - subdir=subdir) - - return req - - @staticmethod - def get_base_rev_args(rev): - # type: (str) -> List[str] - """ - Return the base revision arguments for a vcs command. - - Args: - rev: the name of a revision to install. Cannot be None. - """ - raise NotImplementedError - - def is_immutable_rev_checkout(self, url, dest): - # type: (str, str) -> bool - """ - Return true if the commit hash checked out at dest matches - the revision in url. - - Always return False, if the VCS does not support immutable commit - hashes. - - This method does not check if there are local uncommitted changes - in dest after checkout, as pip currently has no use case for that. - """ - return False - - @classmethod - def make_rev_options(cls, rev=None, extra_args=None): - # type: (Optional[str], Optional[CommandArgs]) -> RevOptions - """ - Return a RevOptions object. - - Args: - rev: the name of a revision to install. - extra_args: a list of extra options. - """ - return RevOptions(cls, rev, extra_args=extra_args) - - @classmethod - def _is_local_repository(cls, repo): - # type: (str) -> bool - """ - posix absolute paths start with os.path.sep, - win32 ones start with drive (like c:\\folder) - """ - drive, tail = os.path.splitdrive(repo) - return repo.startswith(os.path.sep) or bool(drive) - - @classmethod - def get_netloc_and_auth(cls, netloc, scheme): - # type: (str, str) -> Tuple[str, Tuple[Optional[str], Optional[str]]] - """ - Parse the repository URL's netloc, and return the new netloc to use - along with auth information. - - Args: - netloc: the original repository URL netloc. - scheme: the repository URL's scheme without the vcs prefix. - - This is mainly for the Subversion class to override, so that auth - information can be provided via the --username and --password options - instead of through the URL. For other subclasses like Git without - such an option, auth information must stay in the URL. - - Returns: (netloc, (username, password)). - """ - return netloc, (None, None) - - @classmethod - def get_url_rev_and_auth(cls, url): - # type: (str) -> Tuple[str, Optional[str], AuthInfo] - """ - Parse the repository URL to use, and return the URL, revision, - and auth info to use. - - Returns: (url, rev, (username, password)). - """ - scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) - if '+' not in scheme: - raise ValueError( - "Sorry, {!r} is a malformed VCS url. " - "The format is +://, " - "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) - ) - # Remove the vcs prefix. - scheme = scheme.split('+', 1)[1] - netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) - rev = None - if '@' in path: - path, rev = path.rsplit('@', 1) - if not rev: - raise InstallationError( - "The URL {!r} has an empty revision (after @) " - "which is not supported. Include a revision after @ " - "or remove @ from the URL.".format(url) - ) - url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) - return url, rev, user_pass - - @staticmethod - def make_rev_args(username, password): - # type: (Optional[str], Optional[HiddenText]) -> CommandArgs - """ - Return the RevOptions "extra arguments" to use in obtain(). - """ - return [] - - def get_url_rev_options(self, url): - # type: (HiddenText) -> Tuple[HiddenText, RevOptions] - """ - Return the URL and RevOptions object to use in obtain(), - as a tuple (url, rev_options). - """ - secret_url, rev, user_pass = self.get_url_rev_and_auth(url.secret) - username, secret_password = user_pass - password = None # type: Optional[HiddenText] - if secret_password is not None: - password = hide_value(secret_password) - extra_args = self.make_rev_args(username, password) - rev_options = self.make_rev_options(rev, extra_args=extra_args) - - return hide_url(secret_url), rev_options - - @staticmethod - def normalize_url(url): - # type: (str) -> str - """ - Normalize a URL for comparison by unquoting it and removing any - trailing slash. - """ - return urllib.parse.unquote(url).rstrip('/') - - @classmethod - def compare_urls(cls, url1, url2): - # type: (str, str) -> bool - """ - Compare two repo URLs for identity, ignoring incidental differences. - """ - return (cls.normalize_url(url1) == cls.normalize_url(url2)) - - def fetch_new(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - """ - Fetch a revision from a repository, in the case that this is the - first fetch from the repository. - - Args: - dest: the directory to fetch the repository to. - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def switch(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - """ - Switch the repo at ``dest`` to point to ``URL``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def update(self, dest, url, rev_options): - # type: (str, HiddenText, RevOptions) -> None - """ - Update an already-existing repo to the given ``rev_options``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - @classmethod - def is_commit_id_equal(cls, dest, name): - # type: (str, Optional[str]) -> bool - """ - Return whether the id of the current commit equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - raise NotImplementedError - - def obtain(self, dest, url): - # type: (str, HiddenText) -> None - """ - Install or update in editable mode the package represented by this - VersionControl object. - - :param dest: the repository directory in which to install or update. - :param url: the repository URL starting with a vcs prefix. - """ - url, rev_options = self.get_url_rev_options(url) - - if not os.path.exists(dest): - self.fetch_new(dest, url, rev_options) - return - - rev_display = rev_options.to_display() - if self.is_repository_directory(dest): - existing_url = self.get_remote_url(dest) - if self.compare_urls(existing_url, url.secret): - logger.debug( - '%s in %s exists, and has correct URL (%s)', - self.repo_name.title(), - display_path(dest), - url, - ) - if not self.is_commit_id_equal(dest, rev_options.rev): - logger.info( - 'Updating %s %s%s', - display_path(dest), - self.repo_name, - rev_display, - ) - self.update(dest, url, rev_options) - else: - logger.info('Skipping because already up-to-date.') - return - - logger.warning( - '%s %s in %s exists with URL %s', - self.name, - self.repo_name, - display_path(dest), - existing_url, - ) - prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', - ('s', 'i', 'w', 'b')) - else: - logger.warning( - 'Directory %s already exists, and is not a %s %s.', - dest, - self.name, - self.repo_name, - ) - # https://github.com/python/mypy/issues/1174 - prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore - ('i', 'w', 'b')) - - logger.warning( - 'The plan is to install the %s repository %s', - self.name, - url, - ) - response = ask_path_exists('What to do? {}'.format( - prompt[0]), prompt[1]) - - if response == 'a': - sys.exit(-1) - - if response == 'w': - logger.warning('Deleting %s', display_path(dest)) - rmtree(dest) - self.fetch_new(dest, url, rev_options) - return - - if response == 'b': - dest_dir = backup_dir(dest) - logger.warning( - 'Backing up %s to %s', display_path(dest), dest_dir, - ) - shutil.move(dest, dest_dir) - self.fetch_new(dest, url, rev_options) - return - - # Do nothing if the response is "i". - if response == 's': - logger.info( - 'Switching %s %s to %s%s', - self.repo_name, - display_path(dest), - url, - rev_display, - ) - self.switch(dest, url, rev_options) - - def unpack(self, location, url): - # type: (str, HiddenText) -> None - """ - Clean up current location and download the url repository - (and vcs infos) into location - - :param url: the repository URL starting with a vcs prefix. - """ - if os.path.exists(location): - rmtree(location) - self.obtain(location, url=url) - - @classmethod - def get_remote_url(cls, location): - # type: (str) -> str - """ - Return the url used at location - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - raise NotImplementedError - - @classmethod - def get_revision(cls, location): - # type: (str) -> str - """ - Return the current commit id of the files at the given location. - """ - raise NotImplementedError - - @classmethod - def run_command( - cls, - cmd, # type: Union[List[str], CommandArgs] - show_stdout=True, # type: bool - cwd=None, # type: Optional[str] - on_returncode='raise', # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - spinner=None, # type: Optional[SpinnerInterface] - log_failed_cmd=True, # type: bool - stdout_only=False, # type: bool - ): - # type: (...) -> str - """ - Run a VCS subcommand - This is simply a wrapper around call_subprocess that adds the VCS - command name, and checks that the VCS is available - """ - cmd = make_command(cls.name, *cmd) - try: - return call_subprocess(cmd, show_stdout, cwd, - on_returncode=on_returncode, - extra_ok_returncodes=extra_ok_returncodes, - command_desc=command_desc, - extra_environ=extra_environ, - unset_environ=cls.unset_environ, - spinner=spinner, - log_failed_cmd=log_failed_cmd, - stdout_only=stdout_only) - except FileNotFoundError: - # errno.ENOENT = no such file or directory - # In other words, the VCS executable isn't available - raise BadCommand( - f'Cannot find command {cls.name!r} - do you have ' - f'{cls.name!r} installed and in your PATH?') - except PermissionError: - # errno.EACCES = Permission denied - # This error occurs, for instance, when the command is installed - # only for another user. So, the current user don't have - # permission to call the other user command. - raise BadCommand( - f"No permission to execute {cls.name!r} - install it " - f"locally, globally (ask admin), or check your PATH. " - f"See possible solutions at " - f"https://pip.pypa.io/en/latest/reference/pip_freeze/" - f"#fixing-permission-denied." - ) - - @classmethod - def is_repository_directory(cls, path): - # type: (str) -> bool - """ - Return whether a directory path is a repository directory. - """ - logger.debug('Checking in %s for %s (%s)...', - path, cls.dirname, cls.name) - return os.path.exists(os.path.join(path, cls.dirname)) - - @classmethod - def get_repository_root(cls, location): - # type: (str) -> Optional[str] - """ - Return the "root" (top-level) directory controlled by the vcs, - or `None` if the directory is not in any. - - It is meant to be overridden to implement smarter detection - mechanisms for specific vcs. - - This can do more than is_repository_directory() alone. For - example, the Git override checks that Git is actually available. - """ - if cls.is_repository_directory(location): - return location - return None diff --git a/venv/Lib/site-packages/pip/_internal/wheel_builder.py b/venv/Lib/site-packages/pip/_internal/wheel_builder.py deleted file mode 100644 index 92f172b..0000000 --- a/venv/Lib/site-packages/pip/_internal/wheel_builder.py +++ /dev/null @@ -1,360 +0,0 @@ -"""Orchestrator for building wheels from InstallRequirements. -""" - -import logging -import os.path -import re -import shutil -from typing import Any, Callable, Iterable, List, Optional, Tuple - -from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version -from pip._vendor.packaging.version import InvalidVersion, Version - -from pip._internal.cache import WheelCache -from pip._internal.exceptions import InvalidWheelFilename, UnsupportedWheel -from pip._internal.metadata import get_wheel_distribution -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.operations.build.wheel import build_wheel_pep517 -from pip._internal.operations.build.wheel_legacy import build_wheel_legacy -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed -from pip._internal.utils.setuptools_build import make_setuptools_clean_args -from pip._internal.utils.subprocess import call_subprocess -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.urls import path_to_url -from pip._internal.vcs import vcs - -logger = logging.getLogger(__name__) - -_egg_info_re = re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.IGNORECASE) - -BinaryAllowedPredicate = Callable[[InstallRequirement], bool] -BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] - - -def _contains_egg_info(s): - # type: (str) -> bool - """Determine whether the string looks like an egg_info. - - :param s: The string to parse. E.g. foo-2.1 - """ - return bool(_egg_info_re.search(s)) - - -def _should_build( - req, # type: InstallRequirement - need_wheel, # type: bool - check_binary_allowed, # type: BinaryAllowedPredicate -): - # type: (...) -> bool - """Return whether an InstallRequirement should be built into a wheel.""" - if req.constraint: - # never build requirements that are merely constraints - return False - if req.is_wheel: - if need_wheel: - logger.info( - 'Skipping %s, due to already being wheel.', req.name, - ) - return False - - if need_wheel: - # i.e. pip wheel, not pip install - return True - - # From this point, this concerns the pip install command only - # (need_wheel=False). - - if req.editable or not req.source_dir: - return False - - if req.use_pep517: - return True - - if not check_binary_allowed(req): - logger.info( - "Skipping wheel build for %s, due to binaries " - "being disabled for it.", req.name, - ) - return False - - if not is_wheel_installed(): - # we don't build legacy requirements if wheel is not installed - logger.info( - "Using legacy 'setup.py install' for %s, " - "since package 'wheel' is not installed.", req.name, - ) - return False - - return True - - -def should_build_for_wheel_command( - req, # type: InstallRequirement -): - # type: (...) -> bool - return _should_build( - req, need_wheel=True, check_binary_allowed=_always_true - ) - - -def should_build_for_install_command( - req, # type: InstallRequirement - check_binary_allowed, # type: BinaryAllowedPredicate -): - # type: (...) -> bool - return _should_build( - req, need_wheel=False, check_binary_allowed=check_binary_allowed - ) - - -def _should_cache( - req, # type: InstallRequirement -): - # type: (...) -> Optional[bool] - """ - Return whether a built InstallRequirement can be stored in the persistent - wheel cache, assuming the wheel cache is available, and _should_build() - has determined a wheel needs to be built. - """ - if req.editable or not req.source_dir: - # never cache editable requirements - return False - - if req.link and req.link.is_vcs: - # VCS checkout. Do not cache - # unless it points to an immutable commit hash. - assert not req.editable - assert req.source_dir - vcs_backend = vcs.get_backend_for_scheme(req.link.scheme) - assert vcs_backend - if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir): - return True - return False - - assert req.link - base, ext = req.link.splitext() - if _contains_egg_info(base): - return True - - # Otherwise, do not cache. - return False - - -def _get_cache_dir( - req, # type: InstallRequirement - wheel_cache, # type: WheelCache -): - # type: (...) -> str - """Return the persistent or temporary cache directory where the built - wheel need to be stored. - """ - cache_available = bool(wheel_cache.cache_dir) - assert req.link - if cache_available and _should_cache(req): - cache_dir = wheel_cache.get_path_for_link(req.link) - else: - cache_dir = wheel_cache.get_ephem_path_for_link(req.link) - return cache_dir - - -def _always_true(_): - # type: (Any) -> bool - return True - - -def _verify_one(req, wheel_path): - # type: (InstallRequirement, str) -> None - canonical_name = canonicalize_name(req.name or "") - w = Wheel(os.path.basename(wheel_path)) - if canonicalize_name(w.name) != canonical_name: - raise InvalidWheelFilename( - "Wheel has unexpected file name: expected {!r}, " - "got {!r}".format(canonical_name, w.name), - ) - dist = get_wheel_distribution(wheel_path, canonical_name) - dist_verstr = str(dist.version) - if canonicalize_version(dist_verstr) != canonicalize_version(w.version): - raise InvalidWheelFilename( - "Wheel has unexpected file name: expected {!r}, " - "got {!r}".format(dist_verstr, w.version), - ) - metadata_version_value = dist.metadata_version - if metadata_version_value is None: - raise UnsupportedWheel("Missing Metadata-Version") - try: - metadata_version = Version(metadata_version_value) - except InvalidVersion: - msg = f"Invalid Metadata-Version: {metadata_version_value}" - raise UnsupportedWheel(msg) - if (metadata_version >= Version("1.2") - and not isinstance(dist.version, Version)): - raise UnsupportedWheel( - "Metadata 1.2 mandates PEP 440 version, " - "but {!r} is not".format(dist_verstr) - ) - - -def _build_one( - req, # type: InstallRequirement - output_dir, # type: str - verify, # type: bool - build_options, # type: List[str] - global_options, # type: List[str] -): - # type: (...) -> Optional[str] - """Build one wheel. - - :return: The filename of the built wheel, or None if the build failed. - """ - try: - ensure_dir(output_dir) - except OSError as e: - logger.warning( - "Building wheel for %s failed: %s", - req.name, e, - ) - return None - - # Install build deps into temporary directory (PEP 518) - with req.build_env: - wheel_path = _build_one_inside_env( - req, output_dir, build_options, global_options - ) - if wheel_path and verify: - try: - _verify_one(req, wheel_path) - except (InvalidWheelFilename, UnsupportedWheel) as e: - logger.warning("Built wheel for %s is invalid: %s", req.name, e) - return None - return wheel_path - - -def _build_one_inside_env( - req, # type: InstallRequirement - output_dir, # type: str - build_options, # type: List[str] - global_options, # type: List[str] -): - # type: (...) -> Optional[str] - with TempDirectory(kind="wheel") as temp_dir: - assert req.name - if req.use_pep517: - assert req.metadata_directory - assert req.pep517_backend - if global_options: - logger.warning( - 'Ignoring --global-option when building %s using PEP 517', req.name - ) - if build_options: - logger.warning( - 'Ignoring --build-option when building %s using PEP 517', req.name - ) - wheel_path = build_wheel_pep517( - name=req.name, - backend=req.pep517_backend, - metadata_directory=req.metadata_directory, - tempd=temp_dir.path, - ) - else: - wheel_path = build_wheel_legacy( - name=req.name, - setup_py_path=req.setup_py_path, - source_dir=req.unpacked_source_directory, - global_options=global_options, - build_options=build_options, - tempd=temp_dir.path, - ) - - if wheel_path is not None: - wheel_name = os.path.basename(wheel_path) - dest_path = os.path.join(output_dir, wheel_name) - try: - wheel_hash, length = hash_file(wheel_path) - shutil.move(wheel_path, dest_path) - logger.info('Created wheel for %s: ' - 'filename=%s size=%d sha256=%s', - req.name, wheel_name, length, - wheel_hash.hexdigest()) - logger.info('Stored in directory: %s', output_dir) - return dest_path - except Exception as e: - logger.warning( - "Building wheel for %s failed: %s", - req.name, e, - ) - # Ignore return, we can't do anything else useful. - if not req.use_pep517: - _clean_one_legacy(req, global_options) - return None - - -def _clean_one_legacy(req, global_options): - # type: (InstallRequirement, List[str]) -> bool - clean_args = make_setuptools_clean_args( - req.setup_py_path, - global_options=global_options, - ) - - logger.info('Running setup.py clean for %s', req.name) - try: - call_subprocess(clean_args, cwd=req.source_dir) - return True - except Exception: - logger.error('Failed cleaning build dir for %s', req.name) - return False - - -def build( - requirements, # type: Iterable[InstallRequirement] - wheel_cache, # type: WheelCache - verify, # type: bool - build_options, # type: List[str] - global_options, # type: List[str] -): - # type: (...) -> BuildResult - """Build wheels. - - :return: The list of InstallRequirement that succeeded to build and - the list of InstallRequirement that failed to build. - """ - if not requirements: - return [], [] - - # Build the wheels. - logger.info( - 'Building wheels for collected packages: %s', - ', '.join(req.name for req in requirements), # type: ignore - ) - - with indent_log(): - build_successes, build_failures = [], [] - for req in requirements: - cache_dir = _get_cache_dir(req, wheel_cache) - wheel_file = _build_one( - req, cache_dir, verify, build_options, global_options - ) - if wheel_file: - # Update the link for this. - req.link = Link(path_to_url(wheel_file)) - req.local_file_path = req.link.file_path - assert req.link.is_wheel - build_successes.append(req) - else: - build_failures.append(req) - - # notify success/failure - if build_successes: - logger.info( - 'Successfully built %s', - ' '.join([req.name for req in build_successes]), # type: ignore - ) - if build_failures: - logger.info( - 'Failed to build %s', - ' '.join([req.name for req in build_failures]), # type: ignore - ) - # Return a list of requirements that failed to build - return build_successes, build_failures diff --git a/venv/Lib/site-packages/pip/_vendor/__init__.py b/venv/Lib/site-packages/pip/_vendor/__init__.py deleted file mode 100644 index a10ecd6..0000000 --- a/venv/Lib/site-packages/pip/_vendor/__init__.py +++ /dev/null @@ -1,113 +0,0 @@ -""" -pip._vendor is for vendoring dependencies of pip to prevent needing pip to -depend on something external. - -Files inside of pip._vendor should be considered immutable and should only be -updated to versions from upstream. -""" -from __future__ import absolute_import - -import glob -import os.path -import sys - -# Downstream redistributors which have debundled our dependencies should also -# patch this value to be true. This will trigger the additional patching -# to cause things like "six" to be available as pip. -DEBUNDLED = False - -# By default, look in this directory for a bunch of .whl files which we will -# add to the beginning of sys.path before attempting to import anything. This -# is done to support downstream re-distributors like Debian and Fedora who -# wish to create their own Wheels for our dependencies to aid in debundling. -WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) - - -# Define a small helper function to alias our vendored modules to the real ones -# if the vendored ones do not exist. This idea of this was taken from -# https://github.com/kennethreitz/requests/pull/2567. -def vendored(modulename): - vendored_name = "{0}.{1}".format(__name__, modulename) - - try: - __import__(modulename, globals(), locals(), level=0) - except ImportError: - # We can just silently allow import failures to pass here. If we - # got to this point it means that ``import pip._vendor.whatever`` - # failed and so did ``import whatever``. Since we're importing this - # upfront in an attempt to alias imports, not erroring here will - # just mean we get a regular import error whenever pip *actually* - # tries to import one of these modules to use it, which actually - # gives us a better error message than we would have otherwise - # gotten. - pass - else: - sys.modules[vendored_name] = sys.modules[modulename] - base, head = vendored_name.rsplit(".", 1) - setattr(sys.modules[base], head, sys.modules[modulename]) - - -# If we're operating in a debundled setup, then we want to go ahead and trigger -# the aliasing of our vendored libraries as well as looking for wheels to add -# to our sys.path. This will cause all of this code to be a no-op typically -# however downstream redistributors can enable it in a consistent way across -# all platforms. -if DEBUNDLED: - # Actually look inside of WHEEL_DIR to find .whl files and add them to the - # front of our sys.path. - sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path - - # Actually alias all of our vendored dependencies. - vendored("appdirs") - vendored("cachecontrol") - vendored("certifi") - vendored("colorama") - vendored("distlib") - vendored("distro") - vendored("html5lib") - vendored("six") - vendored("six.moves") - vendored("six.moves.urllib") - vendored("six.moves.urllib.parse") - vendored("packaging") - vendored("packaging.version") - vendored("packaging.specifiers") - vendored("pep517") - vendored("pkg_resources") - vendored("progress") - vendored("requests") - vendored("requests.exceptions") - vendored("requests.packages") - vendored("requests.packages.urllib3") - vendored("requests.packages.urllib3._collections") - vendored("requests.packages.urllib3.connection") - vendored("requests.packages.urllib3.connectionpool") - vendored("requests.packages.urllib3.contrib") - vendored("requests.packages.urllib3.contrib.ntlmpool") - vendored("requests.packages.urllib3.contrib.pyopenssl") - vendored("requests.packages.urllib3.exceptions") - vendored("requests.packages.urllib3.fields") - vendored("requests.packages.urllib3.filepost") - vendored("requests.packages.urllib3.packages") - vendored("requests.packages.urllib3.packages.ordered_dict") - vendored("requests.packages.urllib3.packages.six") - vendored("requests.packages.urllib3.packages.ssl_match_hostname") - vendored("requests.packages.urllib3.packages.ssl_match_hostname." - "_implementation") - vendored("requests.packages.urllib3.poolmanager") - vendored("requests.packages.urllib3.request") - vendored("requests.packages.urllib3.response") - vendored("requests.packages.urllib3.util") - vendored("requests.packages.urllib3.util.connection") - vendored("requests.packages.urllib3.util.request") - vendored("requests.packages.urllib3.util.response") - vendored("requests.packages.urllib3.util.retry") - vendored("requests.packages.urllib3.util.ssl_") - vendored("requests.packages.urllib3.util.timeout") - vendored("requests.packages.urllib3.util.url") - vendored("resolvelib") - vendored("tenacity") - vendored("toml") - vendored("toml.encoder") - vendored("toml.decoder") - vendored("urllib3") diff --git a/venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index fbca9ba797f0a052bfd7994f5706e055b98189fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2945 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 diff --git a/venv/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-39.pyc deleted file mode 100644 index 97b7c3a20a9f354b468a0d2f0817288e319db6ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240434 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 HRW1Jl+GCvU diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc deleted file mode 100644 index aa695f7fb4e02c52c5f8cb81096726cab6f9df9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3113 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 o3VN{~tk&R+(!l41HpeF$N&HU diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc deleted file mode 100644 index e118b82e756a78aae675e1296fed89738db182b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1990 zcma)7OK&4Z5bmCr$Idtj$%==BKw6|lM!S(XAhHM%7TcRdO6-;GTt-GMXS(g!o*6qm zHny<=JHs=ZbJg z&`Zh{@nT&;$IXJ3Z#`H6`A{>p|V>#-{ zP80#e?eTefGKyKRpSF9QNU&tw2}Ju$#AofWf80*`sdxfY!%j~m?QwtHX0XObvW-r; zNZXUNyA2n@vu=&gWgcRD1S4@l5V}eW)S=VOJJ_}sIsG?m58>o}*k)v4W&m;o&(d%i zwOjO2vL*V`h)EAMtaQ18qKIM*#d|0=P~euwFcO3_i*UNW6rV=%AHm_fmhlue3a9W| zMr~?C?oYO}yR|Fr<*h5_>4y<1ivig$@w5Sg7}F1y{4MYKUvAYrn}74@hMl-Kfw%f< z$=fpei}gT9g3-W-IpNR={tU{DR>+Ut3j=T`*K}sw&!4Qwo43UqR6 z>G>SYS76?KXFd<}mcFHM1F#Kkv@9}M;l|g*AZ!KBlYs{(i?H(*w8QERG{#_UXvtTL z`)~&UZq{xwXsIb>UB9v_#NwxvB}gI?Gf;N5(Wo~hwx4op^%gsKu7zdS-C0EhEdwiZkL#0yD0BT|0w>s8$3dQOQ!JopJ%H0iZTjHNA3L|$Aaj=cbEjlvh!pF!Dl6|jYp@rM`VTORsrt?&4*Nrq zwZhv5kPl()07jz!e5eKKtYZovEv0ZD&yt6%hyB8sDlis}_#{N#W9)R&39}Vhf=e~m z=yp~v5D>6tdM+Q}!uu#bM}YwVPi8zAh%f{$y~AEJgC+%}+s|MmXt~rfJjb&QS}<|A zo0?o|rGhHXyEP*`iD)ZZ01YR)l% TW=VhdF$RR(<^gIR^{l@EL;Jx# diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc deleted file mode 100644 index 8b7aa3ea68786a8a4c7b1d6e49612ee7b392fb6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmYjOJx{|h6inKbqM)v9hfSFDntjCB2mOpS&E$aHL-|4u$@5pH83*sZ?f_a z7@2TGEAb?sb@EB??o3CcIPmjSozQQ8e{ISC>3cHs#~yoN!75v=E#`h(+AQY=B1bpGvSx~atfKy<(&=p^Az@Rf68!iiQB|?M7awS35B0~de4S7io zLl>`&67bAj$t75HwNCT~sASMR>{MXuOw;_47HE?=p3>Tt%1q&!O1P@1>|}7ts7$gw zofU%eD#?`?$FGC)WRgtUFj -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -#Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 - -BIG5_CHAR_TO_FREQ_ORDER = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 -) - diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py deleted file mode 100644 index 98f9970..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## 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 ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import BIG5_SM_MODEL - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - super(Big5Prober, self).__init__() - self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) - self.distribution_analyzer = Big5DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "Big5" - - @property - def language(self): - return "Chinese" diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py b/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py deleted file mode 100644 index c0395f4..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## 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 ######################### - -from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) - - -class CharDistributionAnalysis(object): - ENOUGH_DATA_THRESHOLD = 1024 - SURE_YES = 0.99 - SURE_NO = 0.01 - MINIMUM_DATA_THRESHOLD = 3 - - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._char_to_freq_order = None - self._table_size = None # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self.typical_distribution_ratio = None - self._done = None - self._total_chars = None - self._freq_chars = None - self.reset() - - def reset(self): - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - self._total_chars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._freq_chars = 0 - - def feed(self, char, char_len): - """feed a character with known length""" - if char_len == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(char) - else: - order = -1 - if order >= 0: - self._total_chars += 1 - # order is valid - if order < self._table_size: - if 512 > self._char_to_freq_order[order]: - self._freq_chars += 1 - - def get_confidence(self): - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: - return self.SURE_NO - - if self._total_chars != self._freq_chars: - r = (self._freq_chars / ((self._total_chars - self._freq_chars) - * self.typical_distribution_ratio)) - if r < self.SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return self.SURE_YES - - def got_enough_data(self): - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._total_chars > self.ENOUGH_DATA_THRESHOLD - - def get_order(self, byte_str): - # 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 - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCTWDistributionAnalysis, self).__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 - - def get_order(self, byte_str): - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCKRDistributionAnalysis, self).__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): - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(GB2312DistributionAnalysis, self).__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 - - def get_order(self, byte_str): - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - 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 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(Big5DistributionAnalysis, self).__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 - - def get_order(self, byte_str): - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - 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 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(SJISDistributionAnalysis, self).__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 - - def get_order(self, byte_str): - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # 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): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCJPDistributionAnalysis, self).__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 - - def get_order(self, byte_str): - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # 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 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py deleted file mode 100644 index 5812cef..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py +++ /dev/null @@ -1,107 +0,0 @@ -######################## 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 ######################### - -from .enums import ProbingState -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self, lang_filter=None): - super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) - self._active_num = 0 - self.probers = [] - self._best_guess_prober = None - - def reset(self): - super(CharSetGroupProber, self).reset() - self._active_num = 0 - for prober in self.probers: - if prober: - prober.reset() - prober.active = True - self._active_num += 1 - self._best_guess_prober = None - - @property - def charset_name(self): - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.charset_name - - @property - def language(self): - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.language - - def feed(self, byte_str): - for prober in self.probers: - if not prober: - continue - if not prober.active: - continue - state = prober.feed(byte_str) - if not state: - continue - if state == ProbingState.FOUND_IT: - self._best_guess_prober = prober - self._state = ProbingState.FOUND_IT - return self.state - elif state == ProbingState.NOT_ME: - prober.active = False - self._active_num -= 1 - if self._active_num <= 0: - self._state = ProbingState.NOT_ME - return self.state - return self.state - - def get_confidence(self): - state = self.state - if state == ProbingState.FOUND_IT: - return 0.99 - elif state == ProbingState.NOT_ME: - return 0.01 - best_conf = 0.0 - self._best_guess_prober = None - for prober in self.probers: - if not prober: - continue - if not prober.active: - 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) - if best_conf < conf: - best_conf = conf - self._best_guess_prober = prober - if not self._best_guess_prober: - return 0.0 - return best_conf diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py deleted file mode 100644 index eac4e59..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# 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 ######################### - -import logging -import re - -from .enums import ProbingState - - -class CharSetProber(object): - - SHORTCUT_THRESHOLD = 0.95 - - def __init__(self, lang_filter=None): - self._state = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - - def reset(self): - self._state = ProbingState.DETECTING - - @property - def charset_name(self): - return None - - def feed(self, buf): - pass - - @property - def state(self): - return self._state - - def get_confidence(self): - return 0.0 - - @staticmethod - def filter_high_byte_only(buf): - buf = re.sub(b'([\x00-\x7F])+', b' ', buf) - return buf - - @staticmethod - def filter_international_words(buf): - """ - We define three types of bytes: - 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() - - # 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) - - for word in words: - filtered.extend(word[:-1]) - - # If the last character in the word is a marker, replace it with a - # space as markers shouldn't affect our analysis (they are used - # 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' ' - filtered.extend(last_char) - - return filtered - - @staticmethod - def filter_with_english_letters(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``. - """ - filtered = bytearray() - in_tag = False - prev = 0 - - 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'>': - 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 - 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 - - # If we're not in a tag... - if not in_tag: - # Keep everything after last non-extended-ASCII, non-alphabetic - # character - filtered.extend(buf[prev:]) - - return filtered diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py b/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py b/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py deleted file mode 100644 index 6d6f93a..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -Script which takes one or more file paths and reports on their detected -encodings - -Example:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -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 - - -def description_of(lines, name='stdin'): - """ - Return a string describing the probable encoding of a file or - list of strings. - - :param lines: The lines to get the encoding of. - :type lines: Iterable of bytes - :param name: Name of file or collection of lines - :type name: str - """ - u = UniversalDetector() - for line in lines: - line = bytearray(line) - u.feed(line) - # shortcut out of the loop to save reading further - particularly useful if we read a BOM. - if u.done: - 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) - - -def main(argv=None): - """ - Handles command line arguments and gets things started. - - :param argv: List of arguments, as if specified on the command-line. - If None, ``sys.argv[1:]`` is used instead. - :type argv: list of str - """ - # 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__)) - 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(description_of(f, f.name)) - - -if __name__ == '__main__': - main() diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py b/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py deleted file mode 100644 index 68fba44..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py +++ /dev/null @@ -1,88 +0,0 @@ -######################## 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): -# 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 ######################### - -import logging - -from .enums import MachineState - - -class CodingStateMachine(object): - """ - 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 - state machine available, one byte at a time. The state machine changes its - state based on its previous state and the byte it receives. There are 3 - states in a state machine that are of interest to an auto-detector: - - START state: This is the state to start with, or a legal byte sequence - (i.e. a valid code point) for character has been identified. - - ME state: This indicates that the state machine identified a byte sequence - that is specific to the charset it is designed for and that - there is no other possible encoding which can contain this byte - sequence. This will to lead to an immediate positive answer for - the detector. - - ERROR state: This indicates the state machine identified an illegal byte - sequence for that encoding. This will lead to an immediate - 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 - self._curr_char_len = 0 - self._curr_state = None - self.logger = logging.getLogger(__name__) - self.reset() - - def reset(self): - self._curr_state = MachineState.START - - 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] - if self._curr_state == MachineState.START: - self._curr_byte_pos = 0 - 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] - self._curr_byte_pos += 1 - return self._curr_state - - def get_current_charlen(self): - return self._curr_char_len - - def get_coding_state_machine(self): - return self._model['name'] - - @property - def language(self): - return self._model['language'] diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/compat.py b/venv/Lib/site-packages/pip/_vendor/chardet/compat.py deleted file mode 100644 index 8941572..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/compat.py +++ /dev/null @@ -1,36 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# Contributor(s): -# Dan Blanchard -# Ian Cordasco -# -# 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 ######################### - -import sys - - -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 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py deleted file mode 100644 index efd793a..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py +++ /dev/null @@ -1,49 +0,0 @@ -######################## 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): -# 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 ######################### - -from .chardistribution import EUCKRDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import CP949_SM_MODEL - - -class CP949Prober(MultiByteCharSetProber): - def __init__(self): - super(CP949Prober, self).__init__() - self.coding_sm = CodingStateMachine(CP949_SM_MODEL) - # NOTE: CP949 is a superset of EUC-KR, so the distribution should be - # not different. - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "CP949" - - @property - def language(self): - return "Korean" diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/enums.py b/venv/Lib/site-packages/pip/_vendor/chardet/enums.py deleted file mode 100644 index 0451207..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/enums.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -All of the Enums that are used throughout the chardet package. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - - -class InputState(object): - """ - This enum represents the different states a universal detector can be in. - """ - PURE_ASCII = 0 - ESC_ASCII = 1 - HIGH_BYTE = 2 - - -class LanguageFilter(object): - """ - This enum represents the different language filters we can apply to a - ``UniversalDetector``. - """ - CHINESE_SIMPLIFIED = 0x01 - CHINESE_TRADITIONAL = 0x02 - JAPANESE = 0x04 - KOREAN = 0x08 - NON_CJK = 0x10 - ALL = 0x1F - CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL - CJK = CHINESE | JAPANESE | KOREAN - - -class ProbingState(object): - """ - This enum represents the different states a prober can be in. - """ - DETECTING = 0 - FOUND_IT = 1 - NOT_ME = 2 - - -class MachineState(object): - """ - This enum represents the different states a state machine can be in. - """ - START = 0 - ERROR = 1 - ITS_ME = 2 - - -class SequenceLikelihood(object): - """ - This enum represents the likelihood of a character following the previous one. - """ - NEGATIVE = 0 - UNLIKELY = 1 - LIKELY = 2 - POSITIVE = 3 - - @classmethod - def get_num_categories(cls): - """:returns: The number of likelihood categories in the enum.""" - return 4 - - -class CharacterCategory(object): - """ - 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 - DIGIT = 252 - CONTROL = 251 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py deleted file mode 100644 index c70493f..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py +++ /dev/null @@ -1,101 +0,0 @@ -######################## 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): -# 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 ######################### - -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) - - -class EscCharSetProber(CharSetProber): - """ - This CharSetProber uses a "code scheme" approach for detecting encodings, - whereby easily recognizable escape or shift sequences are relied on to - identify these encodings. - """ - - def __init__(self, lang_filter=None): - super(EscCharSetProber, self).__init__(lang_filter=lang_filter) - self.coding_sm = [] - if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: - self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) - self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) - if self.lang_filter & LanguageFilter.JAPANESE: - self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) - if self.lang_filter & LanguageFilter.KOREAN: - self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) - self.active_sm_count = None - self._detected_charset = None - self._detected_language = None - self._state = None - self.reset() - - def reset(self): - super(EscCharSetProber, self).reset() - for coding_sm in self.coding_sm: - if not coding_sm: - continue - coding_sm.active = True - coding_sm.reset() - self.active_sm_count = len(self.coding_sm) - self._detected_charset = None - self._detected_language = None - - @property - def charset_name(self): - return self._detected_charset - - @property - def language(self): - return self._detected_language - - def get_confidence(self): - if self._detected_charset: - return 0.99 - else: - return 0.00 - - def feed(self, byte_str): - for c in byte_str: - for coding_sm in self.coding_sm: - if not coding_sm or not coding_sm.active: - continue - coding_state = coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - coding_sm.active = False - self.active_sm_count -= 1 - if self.active_sm_count <= 0: - self._state = ProbingState.NOT_ME - return self.state - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - self._detected_charset = coding_sm.get_coding_state_machine() - self._detected_language = coding_sm.language - return self.state - - return self.state diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py b/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py deleted file mode 100644 index 0069523..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py +++ /dev/null @@ -1,246 +0,0 @@ -######################## 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): -# 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 ######################### - -from .enums import MachineState - -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 -) - -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 -) - -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'} - -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 -) - -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 -) - -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'} - -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 -) - -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 -) - -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'} - -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 -) - -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 -) - -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'} - - diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py deleted file mode 100644 index 20ce8f7..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## 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): -# 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 ######################### - -from .enums import ProbingState, MachineState -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJP_SM_MODEL - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - super(EUCJPProber, self).__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() - self.context_analyzer.reset() - - @property - def charset_name(self): - return "EUC-JP" - - @property - def language(self): - 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]) - if coding_state == MachineState.ERROR: - 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: - self._state = ProbingState.FOUND_IT - break - elif 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, 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._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)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py b/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py deleted file mode 100644 index b68078c..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py +++ /dev/null @@ -1,195 +0,0 @@ -######################## 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 ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -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, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -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 -) - diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py deleted file mode 100644 index 345a060..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## 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): -# 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 ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKR_SM_MODEL - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - super(EUCKRProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-KR" - - @property - def language(self): - return "Korean" diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py b/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py deleted file mode 100644 index ed7a995..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py +++ /dev/null @@ -1,387 +0,0 @@ -######################## 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 ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table , -EUCTW_TABLE_SIZE = 5376 - -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 -) - diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py deleted file mode 100644 index 35669cc..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## 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): -# 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 ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTW_SM_MODEL - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - super(EUCTWProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) - self.distribution_analyzer = EUCTWDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-TW" - - @property - def language(self): - return "Taiwan" diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py b/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py deleted file mode 100644 index 697837b..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## 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 ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -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, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 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 -) - diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py deleted file mode 100644 index 8446d2d..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## 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): -# 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 ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312_SM_MODEL - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - super(GB2312Prober, self).__init__() - self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) - self.distribution_analyzer = GB2312DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "GB2312" - - @property - def language(self): - return "Chinese" diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py deleted file mode 100644 index b0e1bf4..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py +++ /dev/null @@ -1,292 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# 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 ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# 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 - - # Minimum Visual vs Logical final letter score difference. - # If the difference is below this, don't rely solely on the final letter score - # distance. - MIN_FINAL_CHAR_DISTANCE = 5 - - # Minimum Visual vs Logical model score difference. - # If the difference is below this, don't rely at all on the model score - # distance. - MIN_MODEL_DISTANCE = 0.01 - - VISUAL_HEBREW_NAME = "ISO-8859-8" - LOGICAL_HEBREW_NAME = "windows-1255" - - def __init__(self): - super(HebrewProber, self).__init__() - self._final_char_logical_score = None - self._final_char_visual_score = None - self._prev = None - self._before_prev = None - self._logical_prober = None - self._visual_prober = None - self.reset() - - def reset(self): - self._final_char_logical_score = 0 - self._final_char_visual_score = 0 - # 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 = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._logical_prober = logicalProber - self._visual_prober = visualProber - - def is_final(self, c): - 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 - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # 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] - - def feed(self, byte_str): - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.state == ProbingState.NOT_ME: - # Both model probers say it's not them. No reason to continue. - return ProbingState.NOT_ME - - byte_str = self.filter_high_byte_only(byte_str) - - for cur in byte_str: - if cur == ' ': - # We stand on a space - a word just ended - 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): - # case (1) [-2:not space][-1:final letter][cur:space] - self._final_char_logical_score += 1 - elif self.is_non_final(self._prev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._final_char_visual_score += 1 - else: - # Not standing on a space - 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 - self._prev = cur - - # Forever detecting, till the end or until both model probers return - # ProbingState.NOT_ME (handled above) - return ProbingState.DETECTING - - @property - def charset_name(self): - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._final_char_logical_score - self._final_char_visual_score - if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: - 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()) - if modelsub > self.MIN_MODEL_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if modelsub < -self.MIN_MODEL_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return self.VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return self.LOGICAL_HEBREW_NAME - - @property - def language(self): - 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): - return ProbingState.NOT_ME - return ProbingState.DETECTING diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py b/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py deleted file mode 100644 index 83fc082..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py +++ /dev/null @@ -1,325 +0,0 @@ -######################## 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 ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -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 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -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 -) - - diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py b/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py deleted file mode 100644 index 20044e4..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## 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 ######################### - - -# 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), -) - -class JapaneseContextAnalysis(object): - NUM_OF_CATEGORY = 6 - DONT_KNOW = -1 - ENOUGH_REL_THRESHOLD = 100 - MAX_REL_THRESHOLD = 1000 - MINIMUM_DATA_THRESHOLD = 4 - - def __init__(self): - self._total_rel = None - self._rel_sample = None - self._need_to_skip_char_num = None - self._last_char_order = None - self._done = None - self.reset() - - def reset(self): - self._total_rel = 0 # total sequence received - # category counters, each integer counts sequence in its category - self._rel_sample = [0] * self.NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._need_to_skip_char_num = 0 - self._last_char_order = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - - def feed(self, byte_str, num_bytes): - if self._done: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # 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]) - i += char_len - if i > num_bytes: - self._need_to_skip_char_num = i - num_bytes - self._last_char_order = -1 - else: - if (order != -1) and (self._last_char_order != -1): - self._total_rel += 1 - if self._total_rel > self.MAX_REL_THRESHOLD: - self._done = True - break - self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 - self._last_char_order = order - - def got_enough_data(self): - return self._total_rel > self.ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # 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 - - def get_order(self, byte_str): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self): - super(SJISContextAnalysis, self).__init__() - self._charset_name = "SHIFT_JIS" - - @property - def charset_name(self): - return self._charset_name - - def get_order(self, byte_str): - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): - char_len = 2 - if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): - self._charset_name = "CP932" - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, char_len - - return -1, char_len - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, byte_str): - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - char_len = 2 - elif first_char == 0x8F: - char_len = 3 - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, char_len - - return -1, char_len - - diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py deleted file mode 100644 index e963a50..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,4650 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -BULGARIAN_LANG_MODEL = { - 63: { # 'e' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 1, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 1, # 'о' - 13: 1, # 'п' - 7: 1, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 0, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 45: { # '\xad' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 1, # 'М' - 36: 0, # 'Ð' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 0, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 0, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 31: { # 'Ð' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 1, # 'Ð' - 32: 1, # 'Б' - 35: 2, # 'Ð’' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 2, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 1, # 'К' - 46: 2, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Ð' - 41: 1, # 'О' - 30: 2, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 2, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 1, # 'е' - 23: 1, # 'ж' - 15: 2, # 'з' - 2: 0, # 'и' - 26: 2, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 0, # 'о' - 13: 2, # 'п' - 7: 2, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 1, # 'у' - 29: 2, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 32: { # 'Б' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 2, # 'Б' - 35: 1, # 'Ð’' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 1, # 'Е' - 55: 1, # 'Ж' - 47: 2, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Ð' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 1, # 'Щ' - 61: 2, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 2, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 35: { # 'Ð’' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 0, # 'Ð¥' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 2, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 2, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 1, # 'у' - 29: 0, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 2, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 43: { # 'Г' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Ð' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 1, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 2, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 1, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 37: { # 'Д' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 2, # 'Ð’' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 2, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 44: { # 'Е' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'Ð' - 32: 1, # 'Б' - 35: 2, # 'Ð’' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 2, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Ð' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 2, # 'Ф' - 49: 1, # 'Ð¥' - 53: 2, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 0, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 0, # 'о' - 13: 1, # 'п' - 7: 2, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 1, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 55: { # 'Ж' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'Ð' - 32: 0, # 'Б' - 35: 1, # 'Ð’' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Ð' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 1, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 47: { # 'З' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 2, # 'Ð' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 1, # 'о' - 13: 0, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 1, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 40: { # 'И' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 1, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 2, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 2, # 'Л' - 38: 2, # 'М' - 36: 2, # 'Ð' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 2, # 'Я' - 1: 1, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 1, # 'е' - 23: 0, # 'ж' - 15: 3, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 0, # 'о' - 13: 1, # 'п' - 7: 2, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 0, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 59: { # 'Й' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 1, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 0, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 0, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 33: { # 'К' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 2, # 'Ð' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 3, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 46: { # 'Л' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 2, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Ð' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 0, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 38: { # 'М' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 2, # 'Ð’' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Ð¥' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 0, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 36: { # 'Ð' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 2, # 'Б' - 35: 1, # 'Ð’' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 1, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 0, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 1, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 2, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 41: { # 'О' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'Ð' - 32: 1, # 'Б' - 35: 2, # 'Ð’' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 1, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 1, # 'Й' - 33: 2, # 'К' - 46: 2, # 'Л' - 38: 2, # 'М' - 36: 2, # 'Ð' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Ð¥' - 53: 0, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 1, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 0, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 0, # 'о' - 13: 2, # 'п' - 7: 2, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 1, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 1, # 'ц' - 21: 2, # 'ч' - 27: 0, # 'ш' - 24: 2, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 30: { # 'П' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 2, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 3, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 2, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 39: { # 'Р' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 2, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 0, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 3, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 28: { # 'С' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 3, # 'Ð' - 32: 2, # 'Б' - 35: 2, # 'Ð’' - 43: 1, # 'Г' - 37: 2, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 2, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 2, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 1, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 2, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 2, # 'у' - 29: 2, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 34: { # 'Т' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 2, # 'Б' - 35: 1, # 'Ð’' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 2, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Ð¥' - 53: 1, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 1, # 'Ъ' - 60: 0, # 'Ю' - 56: 1, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 3, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 2, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 51: { # 'У' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 1, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 2, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 0, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 2, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 2, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 2, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 1, # 'у' - 29: 0, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 48: { # 'Ф' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Ð' - 41: 1, # 'О' - 30: 2, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 1, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 2, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 2, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 1, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 49: { # 'Ð¥' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'Ð' - 32: 0, # 'Б' - 35: 1, # 'Ð’' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 1, # 'О' - 30: 1, # 'П' - 39: 1, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 2, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 53: { # 'Ц' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'Ð' - 32: 0, # 'Б' - 35: 1, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 2, # 'И' - 59: 0, # 'Й' - 33: 2, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 2, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 1, # 'о' - 13: 0, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 1, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 50: { # 'Ч' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 2, # 'Ð' - 32: 1, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Ð' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 2, # 'о' - 13: 0, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 54: { # 'Ш' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 1, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Ð' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 1, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 2, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 57: { # 'Щ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 1, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 1, # 'о' - 13: 0, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 1, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 61: { # 'Ъ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 0, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 1, # 'Ж' - 47: 1, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 2, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 0, # 'О' - 30: 1, # 'П' - 39: 2, # 'Р' - 28: 1, # 'С' - 34: 1, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 1, # 'Ð¥' - 53: 1, # 'Ц' - 50: 1, # 'Ч' - 54: 1, # 'Ш' - 57: 1, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 1, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 0, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 60: { # 'Ю' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 1, # 'Ð' - 32: 1, # 'Б' - 35: 0, # 'Ð’' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 1, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 0, # 'М' - 36: 1, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 0, # 'е' - 23: 2, # 'ж' - 15: 1, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 0, # 'о' - 13: 1, # 'п' - 7: 1, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 0, # 'у' - 29: 0, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 56: { # 'Я' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 1, # 'Б' - 35: 1, # 'Ð’' - 43: 1, # 'Г' - 37: 1, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 1, # 'Л' - 38: 1, # 'М' - 36: 1, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 2, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 1, # 'и' - 26: 1, # 'й' - 12: 1, # 'к' - 10: 1, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 0, # 'о' - 13: 2, # 'п' - 7: 1, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 0, # 'у' - 29: 0, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 1: { # 'а' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 1, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 1, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 3, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 3, # 'у' - 29: 3, # 'Ñ„' - 25: 3, # 'Ñ…' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 18: { # 'б' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 3, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 3, # 'у' - 29: 0, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 3, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 9: { # 'в' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 0, # 'Ð' - 32: 1, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 0, # 'в' - 20: 2, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 20: { # 'г' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 3, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 11: { # 'д' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 2, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 3, # 'у' - 29: 1, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 3: { # 'е' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 2, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 2, # 'у' - 29: 3, # 'Ñ„' - 25: 3, # 'Ñ…' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 23: { # 'ж' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 15: { # 'з' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 3, # 'у' - 29: 1, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 2, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 2: { # 'и' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 1, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 1, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 1, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 1, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 2, # 'у' - 29: 3, # 'Ñ„' - 25: 3, # 'Ñ…' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 2, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 26: { # 'й' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 2, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 2, # 'з' - 2: 1, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 2, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 1, # 'у' - 29: 2, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 12: { # 'к' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 1, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 1, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 3, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 3, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 10: { # 'л' - 63: 1, # 'e' - 45: 1, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 1, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 1, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 2, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 3, # 'у' - 29: 2, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ÑŠ' - 52: 2, # 'ÑŒ' - 42: 3, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 14: { # 'м' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 1, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 2, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 3, # 'у' - 29: 2, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 6: { # 'н' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 1, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 2, # 'б' - 9: 2, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 2, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 2, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 3, # 'у' - 29: 3, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 2, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ÑŠ' - 52: 2, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 4: { # 'о' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 2, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 3, # 'и' - 26: 3, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 3, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 2, # 'у' - 29: 3, # 'Ñ„' - 25: 3, # 'Ñ…' - 22: 3, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 3, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 13: { # 'п' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 3, # 'л' - 14: 1, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 3, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 2, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 7: { # 'Ñ€' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 3, # 'е' - 23: 3, # 'ж' - 15: 2, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 1, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 3, # 'у' - 29: 2, # 'Ñ„' - 25: 3, # 'Ñ…' - 22: 3, # 'ц' - 21: 2, # 'ч' - 27: 3, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 8: { # 'Ñ' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 2, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 3, # 'у' - 29: 2, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 2, # 'ш' - 24: 0, # 'щ' - 17: 3, # 'ÑŠ' - 52: 2, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 5: { # 'Ñ‚' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 2, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 3, # 'у' - 29: 1, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 2, # 'ц' - 21: 2, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 3, # 'ÑŠ' - 52: 2, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 19: { # 'у' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 2, # 'и' - 26: 2, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 3, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 1, # 'у' - 29: 2, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 3, # 'ш' - 24: 2, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 29: { # 'Ñ„' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 1, # 'в' - 20: 1, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 2, # 'у' - 29: 0, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 2, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 25: { # 'Ñ…' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 2, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 1, # 'п' - 7: 3, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 3, # 'у' - 29: 0, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 22: { # 'ц' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 2, # 'в' - 20: 1, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 1, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 2, # 'к' - 10: 1, # 'л' - 14: 1, # 'м' - 6: 1, # 'н' - 4: 2, # 'о' - 13: 1, # 'п' - 7: 1, # 'Ñ€' - 8: 1, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 2, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 1, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 2, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 21: { # 'ч' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 1, # 'б' - 9: 3, # 'в' - 20: 1, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 1, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 2, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 3, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 1, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 27: { # 'ш' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 2, # 'в' - 20: 0, # 'г' - 11: 1, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 3, # 'к' - 10: 2, # 'л' - 14: 1, # 'м' - 6: 3, # 'н' - 4: 2, # 'о' - 13: 2, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 2, # 'у' - 29: 1, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 1, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 2, # 'ÑŠ' - 52: 1, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 24: { # 'щ' - 63: 1, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 3, # 'а' - 18: 0, # 'б' - 9: 1, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 3, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 3, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 2, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 1, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 3, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 1, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 2, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 17: { # 'ÑŠ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 3, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 3, # 'ж' - 15: 3, # 'з' - 2: 1, # 'и' - 26: 2, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 3, # 'о' - 13: 3, # 'п' - 7: 3, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 1, # 'у' - 29: 1, # 'Ñ„' - 25: 2, # 'Ñ…' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 2, # 'ш' - 24: 3, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 2, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 52: { # 'ÑŒ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 1, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 1, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 1, # 'н' - 4: 3, # 'о' - 13: 0, # 'п' - 7: 0, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 1, # 'Ñ‚' - 19: 0, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 1, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 42: { # 'ÑŽ' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 1, # 'а' - 18: 2, # 'б' - 9: 1, # 'в' - 20: 2, # 'г' - 11: 2, # 'д' - 3: 1, # 'е' - 23: 2, # 'ж' - 15: 2, # 'з' - 2: 1, # 'и' - 26: 1, # 'й' - 12: 2, # 'к' - 10: 2, # 'л' - 14: 2, # 'м' - 6: 2, # 'н' - 4: 1, # 'о' - 13: 1, # 'п' - 7: 2, # 'Ñ€' - 8: 2, # 'Ñ' - 5: 2, # 'Ñ‚' - 19: 1, # 'у' - 29: 1, # 'Ñ„' - 25: 1, # 'Ñ…' - 22: 2, # 'ц' - 21: 3, # 'ч' - 27: 1, # 'ш' - 24: 1, # 'щ' - 17: 1, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 16: { # 'Ñ' - 63: 0, # 'e' - 45: 1, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 3, # 'б' - 9: 3, # 'в' - 20: 2, # 'г' - 11: 3, # 'д' - 3: 2, # 'е' - 23: 1, # 'ж' - 15: 2, # 'з' - 2: 1, # 'и' - 26: 2, # 'й' - 12: 3, # 'к' - 10: 3, # 'л' - 14: 3, # 'м' - 6: 3, # 'н' - 4: 1, # 'о' - 13: 2, # 'п' - 7: 2, # 'Ñ€' - 8: 3, # 'Ñ' - 5: 3, # 'Ñ‚' - 19: 1, # 'у' - 29: 1, # 'Ñ„' - 25: 3, # 'Ñ…' - 22: 2, # 'ц' - 21: 1, # 'ч' - 27: 1, # 'ш' - 24: 2, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 58: { # 'Ñ”' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 0, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 0, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, - 62: { # 'â„–' - 63: 0, # 'e' - 45: 0, # '\xad' - 31: 0, # 'Ð' - 32: 0, # 'Б' - 35: 0, # 'Ð’' - 43: 0, # 'Г' - 37: 0, # 'Д' - 44: 0, # 'Е' - 55: 0, # 'Ж' - 47: 0, # 'З' - 40: 0, # 'И' - 59: 0, # 'Й' - 33: 0, # 'К' - 46: 0, # 'Л' - 38: 0, # 'М' - 36: 0, # 'Ð' - 41: 0, # 'О' - 30: 0, # 'П' - 39: 0, # 'Р' - 28: 0, # 'С' - 34: 0, # 'Т' - 51: 0, # 'У' - 48: 0, # 'Ф' - 49: 0, # 'Ð¥' - 53: 0, # 'Ц' - 50: 0, # 'Ч' - 54: 0, # 'Ш' - 57: 0, # 'Щ' - 61: 0, # 'Ъ' - 60: 0, # 'Ю' - 56: 0, # 'Я' - 1: 0, # 'а' - 18: 0, # 'б' - 9: 0, # 'в' - 20: 0, # 'г' - 11: 0, # 'д' - 3: 0, # 'е' - 23: 0, # 'ж' - 15: 0, # 'з' - 2: 0, # 'и' - 26: 0, # 'й' - 12: 0, # 'к' - 10: 0, # 'л' - 14: 0, # 'м' - 6: 0, # 'н' - 4: 0, # 'о' - 13: 0, # 'п' - 7: 0, # 'Ñ€' - 8: 0, # 'Ñ' - 5: 0, # 'Ñ‚' - 19: 0, # 'у' - 29: 0, # 'Ñ„' - 25: 0, # 'Ñ…' - 22: 0, # 'ц' - 21: 0, # 'ч' - 27: 0, # 'ш' - 24: 0, # 'щ' - 17: 0, # 'ÑŠ' - 52: 0, # 'ÑŒ' - 42: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - 58: 0, # 'Ñ”' - 62: 0, # 'â„–' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# 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, # 'ÑŸ' -} - -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, # 'Ñ' -} - -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/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py deleted file mode 100644 index d99528e..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py +++ /dev/null @@ -1,4398 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -GREEK_LANG_MODEL = { - 60: { # 'e' - 60: 2, # 'e' - 55: 1, # 'o' - 58: 2, # 't' - 36: 1, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 55: { # 'o' - 60: 0, # 'e' - 55: 2, # 'o' - 58: 2, # 't' - 36: 1, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 1, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 58: { # 't' - 60: 2, # 'e' - 55: 1, # 'o' - 58: 1, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 1, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 36: { # '·' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 61: { # 'Ά' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 1, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 1, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 46: { # 'Έ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 2, # 'β' - 20: 2, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 2, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 1, # 'σ' - 2: 2, # 'Ï„' - 12: 0, # 'Ï…' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 54: { # 'ÎŒ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 2, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 2, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 31: { # 'Α' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 2, # 'Î’' - 43: 2, # 'Γ' - 41: 1, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 2, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Î' - 59: 1, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Î¥' - 56: 2, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 2, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 1, # 'θ' - 5: 0, # 'ι' - 11: 2, # 'κ' - 16: 3, # 'λ' - 10: 2, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 2, # 'Ï‚' - 7: 2, # 'σ' - 2: 0, # 'Ï„' - 12: 3, # 'Ï…' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 51: { # 'Î’' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 1, # 'Ι' - 44: 0, # 'Κ' - 53: 1, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 2, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 43: { # 'Γ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 1, # 'Α' - 51: 0, # 'Î’' - 43: 2, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 1, # 'Κ' - 53: 1, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 1, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 2, # 'Î¥' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 41: { # 'Δ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 1, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 34: { # 'Ε' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 2, # 'Γ' - 41: 2, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Î' - 59: 1, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Î¥' - 56: 0, # 'Φ' - 50: 2, # 'Χ' - 57: 2, # 'Ω' - 17: 3, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 3, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 1, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 1, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 2, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 2, # 'σ' - 2: 2, # 'Ï„' - 12: 2, # 'Ï…' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 1, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 40: { # 'Η' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 1, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 2, # 'Θ' - 47: 0, # 'Ι' - 44: 2, # 'Κ' - 53: 0, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 1, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 52: { # 'Θ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 1, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 1, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 47: { # 'Ι' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 1, # 'Î’' - 43: 1, # 'Γ' - 41: 2, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Î¥' - 56: 2, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 2, # 'σ' - 2: 1, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 1, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 44: { # 'Κ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 1, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 1, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 2, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 1, # 'Ω' - 17: 3, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 53: { # 'Λ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 2, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 2, # 'Σ' - 33: 0, # 'Τ' - 45: 2, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 1, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 38: { # 'Μ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 2, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 2, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 2, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 49: { # 'Î' - 60: 2, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 1, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 1, # 'ω' - 19: 2, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 59: { # 'Ξ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 1, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 39: { # 'Ο' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 1, # 'Î’' - 43: 2, # 'Γ' - 41: 2, # 'Δ' - 34: 2, # 'Ε' - 40: 1, # 'Η' - 52: 2, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 2, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Î¥' - 56: 2, # 'Φ' - 50: 2, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 2, # 'κ' - 16: 2, # 'λ' - 10: 2, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 2, # 'Ï„' - 12: 2, # 'Ï…' - 28: 1, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 35: { # 'Π' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 2, # 'Λ' - 38: 1, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 2, # 'Ω' - 17: 2, # 'ά' - 18: 1, # 'έ' - 22: 1, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 2, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 48: { # 'Ρ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 1, # 'Γ' - 41: 1, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 2, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 1, # 'Î¥' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 1, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 1, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 3, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 37: { # 'Σ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 1, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 0, # 'Λ' - 38: 2, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 2, # 'Î¥' - 56: 0, # 'Φ' - 50: 2, # 'Χ' - 57: 2, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 2, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 2, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 2, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 33: { # 'Τ' - 60: 0, # 'e' - 55: 1, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 2, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 2, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 1, # 'Τ' - 45: 1, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 2, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 2, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 2, # 'σ' - 2: 0, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 45: { # 'Î¥' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 2, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 2, # 'Η' - 52: 2, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 1, # 'Λ' - 38: 2, # 'Μ' - 49: 2, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 2, # 'Π' - 48: 1, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 56: { # 'Φ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 1, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 1, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 2, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 2, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 1, # 'Ï' - 27: 1, # 'ÏŽ' - }, - 50: { # 'Χ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 1, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 2, # 'Ε' - 40: 2, # 'Η' - 52: 0, # 'Θ' - 47: 2, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 1, # 'Î' - 59: 0, # 'Ξ' - 39: 1, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 1, # 'Χ' - 57: 1, # 'Ω' - 17: 2, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 2, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 2, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 57: { # 'Ω' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 1, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 1, # 'Λ' - 38: 0, # 'Μ' - 49: 2, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 2, # 'Ρ' - 37: 2, # 'Σ' - 33: 2, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'Ï€' - 8: 2, # 'Ï' - 14: 2, # 'Ï‚' - 7: 2, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 17: { # 'ά' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 3, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 3, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 18: { # 'έ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 3, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 22: { # 'ή' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 1, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 15: { # 'ί' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 3, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 1, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 1: { # 'α' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 0, # 'ή' - 15: 3, # 'ί' - 1: 0, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 2, # 'ε' - 32: 3, # 'ζ' - 13: 1, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 2, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 29: { # 'β' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 2, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 3, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 2, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 20: { # 'γ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 21: { # 'δ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 3, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 3: { # 'ε' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 3, # 'ί' - 1: 2, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 2, # 'ε' - 32: 2, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 2, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 32: { # 'ζ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 2, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 1, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 2, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 13: { # 'η' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 25: { # 'θ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 1, # 'λ' - 10: 3, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 3, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 5: { # 'ι' - 60: 0, # 'e' - 55: 1, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 0, # 'ί' - 1: 3, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 11: { # 'κ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 2, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 2, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 16: { # 'λ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 1, # 'β' - 20: 2, # 'γ' - 21: 1, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 2, # 'κ' - 16: 3, # 'λ' - 10: 2, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 10: { # 'μ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 1, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 3, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 2, # 'Ï…' - 28: 3, # 'φ' - 23: 0, # 'χ' - 42: 2, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 6: { # 'ν' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 1, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 30: { # 'ξ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 3, # 'Ï„' - 12: 2, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 2, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 1, # 'ÏŽ' - }, - 4: { # 'ο' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 2, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 2, # 'ω' - 19: 1, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 9: { # 'Ï€' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 3, # 'λ' - 10: 0, # 'μ' - 6: 2, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 2, # 'Ï‚' - 7: 0, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 8: { # 'Ï' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 1, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 3, # 'ο' - 9: 2, # 'Ï€' - 8: 2, # 'Ï' - 14: 0, # 'Ï‚' - 7: 2, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 14: { # 'Ï‚' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 2, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 0, # 'θ' - 5: 0, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 0, # 'Ï„' - 12: 0, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 7: { # 'σ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 3, # 'β' - 20: 0, # 'γ' - 21: 2, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 3, # 'θ' - 5: 3, # 'ι' - 11: 3, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 3, # 'φ' - 23: 3, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 2: { # 'Ï„' - 60: 0, # 'e' - 55: 2, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 2, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 3, # 'ι' - 11: 2, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 2, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 12: { # 'Ï…' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 2, # 'ί' - 1: 3, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 2, # 'ε' - 32: 2, # 'ζ' - 13: 2, # 'η' - 25: 3, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 3, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 2, # 'ω' - 19: 2, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 28: { # 'φ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 3, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 0, # 'μ' - 6: 1, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 1, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 2, # 'Ï' - 27: 2, # 'ÏŽ' - }, - 23: { # 'χ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 3, # 'ά' - 18: 2, # 'έ' - 22: 3, # 'ή' - 15: 3, # 'ί' - 1: 3, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 2, # 'θ' - 5: 3, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 2, # 'μ' - 6: 3, # 'ν' - 30: 0, # 'ξ' - 4: 3, # 'ο' - 9: 0, # 'Ï€' - 8: 3, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 3, # 'Ï„' - 12: 3, # 'Ï…' - 28: 0, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 3, # 'ω' - 19: 3, # 'ÏŒ' - 26: 3, # 'Ï' - 27: 3, # 'ÏŽ' - }, - 42: { # 'ψ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 2, # 'ά' - 18: 2, # 'έ' - 22: 1, # 'ή' - 15: 2, # 'ί' - 1: 2, # 'α' - 29: 0, # 'β' - 20: 0, # 'γ' - 21: 0, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 3, # 'η' - 25: 0, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 0, # 'λ' - 10: 0, # 'μ' - 6: 0, # 'ν' - 30: 0, # 'ξ' - 4: 2, # 'ο' - 9: 0, # 'Ï€' - 8: 0, # 'Ï' - 14: 0, # 'Ï‚' - 7: 0, # 'σ' - 2: 2, # 'Ï„' - 12: 1, # 'Ï…' - 28: 0, # 'φ' - 23: 0, # 'χ' - 42: 0, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 24: { # 'ω' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 1, # 'ά' - 18: 0, # 'έ' - 22: 2, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 2, # 'β' - 20: 3, # 'γ' - 21: 2, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 0, # 'η' - 25: 3, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 0, # 'ξ' - 4: 0, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 2, # 'φ' - 23: 2, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 19: { # 'ÏŒ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 3, # 'β' - 20: 3, # 'γ' - 21: 3, # 'δ' - 3: 1, # 'ε' - 32: 2, # 'ζ' - 13: 2, # 'η' - 25: 2, # 'θ' - 5: 2, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 1, # 'ξ' - 4: 2, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 2, # 'φ' - 23: 3, # 'χ' - 42: 2, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 26: { # 'Ï' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 2, # 'α' - 29: 2, # 'β' - 20: 2, # 'γ' - 21: 1, # 'δ' - 3: 3, # 'ε' - 32: 0, # 'ζ' - 13: 2, # 'η' - 25: 3, # 'θ' - 5: 0, # 'ι' - 11: 3, # 'κ' - 16: 3, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 2, # 'ξ' - 4: 3, # 'ο' - 9: 3, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 2, # 'φ' - 23: 2, # 'χ' - 42: 2, # 'ψ' - 24: 2, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, - 27: { # 'ÏŽ' - 60: 0, # 'e' - 55: 0, # 'o' - 58: 0, # 't' - 36: 0, # '·' - 61: 0, # 'Ά' - 46: 0, # 'Έ' - 54: 0, # 'ÎŒ' - 31: 0, # 'Α' - 51: 0, # 'Î’' - 43: 0, # 'Γ' - 41: 0, # 'Δ' - 34: 0, # 'Ε' - 40: 0, # 'Η' - 52: 0, # 'Θ' - 47: 0, # 'Ι' - 44: 0, # 'Κ' - 53: 0, # 'Λ' - 38: 0, # 'Μ' - 49: 0, # 'Î' - 59: 0, # 'Ξ' - 39: 0, # 'Ο' - 35: 0, # 'Π' - 48: 0, # 'Ρ' - 37: 0, # 'Σ' - 33: 0, # 'Τ' - 45: 0, # 'Î¥' - 56: 0, # 'Φ' - 50: 0, # 'Χ' - 57: 0, # 'Ω' - 17: 0, # 'ά' - 18: 0, # 'έ' - 22: 0, # 'ή' - 15: 0, # 'ί' - 1: 0, # 'α' - 29: 1, # 'β' - 20: 0, # 'γ' - 21: 3, # 'δ' - 3: 0, # 'ε' - 32: 0, # 'ζ' - 13: 1, # 'η' - 25: 2, # 'θ' - 5: 2, # 'ι' - 11: 0, # 'κ' - 16: 2, # 'λ' - 10: 3, # 'μ' - 6: 3, # 'ν' - 30: 1, # 'ξ' - 4: 0, # 'ο' - 9: 2, # 'Ï€' - 8: 3, # 'Ï' - 14: 3, # 'Ï‚' - 7: 3, # 'σ' - 2: 3, # 'Ï„' - 12: 0, # 'Ï…' - 28: 1, # 'φ' - 23: 1, # 'χ' - 42: 0, # 'ψ' - 24: 0, # 'ω' - 19: 0, # 'ÏŒ' - 26: 0, # 'Ï' - 27: 0, # 'ÏŽ' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# 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 -} - -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 -} - -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/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py deleted file mode 100644 index 484c652..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py +++ /dev/null @@ -1,4383 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -HEBREW_LANG_MODEL = { - 50: { # 'a' - 50: 0, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 2, # 'l' - 54: 2, # 'n' - 49: 0, # 'o' - 51: 2, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 1, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 1, # '×§' - 7: 0, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 60: { # 'c' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 0, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 0, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 1, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 61: { # 'd' - 50: 1, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 2, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 0, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 1, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 1, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 42: { # 'e' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 2, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 2, # 'l' - 54: 2, # 'n' - 49: 1, # 'o' - 51: 2, # 'r' - 43: 2, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 1, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 53: { # 'i' - 50: 1, # 'a' - 60: 2, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 0, # 'i' - 56: 1, # 'l' - 54: 2, # 'n' - 49: 2, # 'o' - 51: 1, # 'r' - 43: 2, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 56: { # 'l' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 2, # 'e' - 53: 2, # 'i' - 56: 2, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 54: { # 'n' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 1, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 49: { # 'o' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 2, # 'n' - 49: 1, # 'o' - 51: 2, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 51: { # 'r' - 50: 2, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 2, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 2, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 43: { # 's' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 0, # 'd' - 42: 2, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 2, # 'â€' - 58: 0, # '†' - 40: 2, # '…' - }, - 44: { # 't' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 0, # 'd' - 42: 2, # 'e' - 53: 2, # 'i' - 56: 1, # 'l' - 54: 0, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 2, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 63: { # 'u' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 0, # 'o' - 51: 1, # 'r' - 43: 2, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 34: { # '\xa0' - 50: 1, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 0, # 'e' - 53: 1, # 'i' - 56: 0, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 2, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 1, # 'ב' - 20: 1, # '×’' - 16: 1, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 1, # '×–' - 14: 1, # '×—' - 22: 1, # 'ט' - 1: 2, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 1, # '× ' - 19: 1, # 'ס' - 13: 1, # '×¢' - 26: 0, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 1, # 'צ' - 17: 1, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 55: { # '´' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 1, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 2, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 1, # 'ן' - 12: 1, # '× ' - 19: 1, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 48: { # '¼' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 1, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 39: { # '½' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 1, # 'צ' - 17: 1, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 57: { # '¾' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 30: { # 'Ö°' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 2, # 'ב' - 20: 2, # '×’' - 16: 2, # 'ד' - 3: 2, # '×”' - 2: 2, # 'ו' - 24: 2, # '×–' - 14: 2, # '×—' - 22: 2, # 'ט' - 1: 2, # '×™' - 25: 2, # 'ך' - 15: 2, # '×›' - 4: 2, # 'ל' - 11: 1, # '×' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 2, # '× ' - 19: 2, # 'ס' - 13: 2, # '×¢' - 26: 0, # '×£' - 18: 2, # 'פ' - 27: 0, # '×¥' - 21: 2, # 'צ' - 17: 2, # '×§' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 59: { # 'Ö±' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 1, # 'ב' - 20: 1, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 1, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 2, # 'ל' - 11: 0, # '×' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 1, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 41: { # 'Ö²' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 2, # 'ב' - 20: 1, # '×’' - 16: 2, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 1, # '×–' - 14: 1, # '×—' - 22: 1, # 'ט' - 1: 1, # '×™' - 25: 1, # 'ך' - 15: 1, # '×›' - 4: 2, # 'ל' - 11: 0, # '×' - 6: 2, # 'מ' - 23: 0, # 'ן' - 12: 2, # '× ' - 19: 1, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 2, # 'צ' - 17: 1, # '×§' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 33: { # 'Ö´' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 1, # 'Ö´' - 37: 0, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 1, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 1, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 2, # 'ב' - 20: 2, # '×’' - 16: 2, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 2, # '×–' - 14: 1, # '×—' - 22: 1, # 'ט' - 1: 3, # '×™' - 25: 1, # 'ך' - 15: 2, # '×›' - 4: 2, # 'ל' - 11: 2, # '×' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # '× ' - 19: 2, # 'ס' - 13: 1, # '×¢' - 26: 0, # '×£' - 18: 2, # 'פ' - 27: 1, # '×¥' - 21: 2, # 'צ' - 17: 2, # '×§' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 37: { # 'Öµ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 1, # 'Ö·' - 29: 1, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 2, # 'ב' - 20: 1, # '×’' - 16: 2, # 'ד' - 3: 2, # '×”' - 2: 1, # 'ו' - 24: 1, # '×–' - 14: 2, # '×—' - 22: 1, # 'ט' - 1: 3, # '×™' - 25: 2, # 'ך' - 15: 1, # '×›' - 4: 2, # 'ל' - 11: 2, # '×' - 6: 1, # 'מ' - 23: 2, # 'ן' - 12: 2, # '× ' - 19: 1, # 'ס' - 13: 2, # '×¢' - 26: 1, # '×£' - 18: 1, # 'פ' - 27: 1, # '×¥' - 21: 1, # 'צ' - 17: 1, # '×§' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 36: { # 'Ö¶' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 1, # 'Ö·' - 29: 1, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 2, # 'ב' - 20: 1, # '×’' - 16: 2, # 'ד' - 3: 2, # '×”' - 2: 1, # 'ו' - 24: 1, # '×–' - 14: 2, # '×—' - 22: 1, # 'ט' - 1: 2, # '×™' - 25: 2, # 'ך' - 15: 1, # '×›' - 4: 2, # 'ל' - 11: 2, # '×' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # '× ' - 19: 2, # 'ס' - 13: 1, # '×¢' - 26: 1, # '×£' - 18: 1, # 'פ' - 27: 2, # '×¥' - 21: 1, # 'צ' - 17: 1, # '×§' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 31: { # 'Ö·' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 2, # 'ב' - 20: 2, # '×’' - 16: 2, # 'ד' - 3: 2, # '×”' - 2: 1, # 'ו' - 24: 2, # '×–' - 14: 2, # '×—' - 22: 2, # 'ט' - 1: 3, # '×™' - 25: 1, # 'ך' - 15: 2, # '×›' - 4: 2, # 'ל' - 11: 2, # '×' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # '× ' - 19: 2, # 'ס' - 13: 2, # '×¢' - 26: 2, # '×£' - 18: 2, # 'פ' - 27: 1, # '×¥' - 21: 2, # 'צ' - 17: 2, # '×§' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 29: { # 'Ö¸' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 1, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 1, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 2, # 'ב' - 20: 2, # '×’' - 16: 2, # 'ד' - 3: 3, # '×”' - 2: 2, # 'ו' - 24: 2, # '×–' - 14: 2, # '×—' - 22: 1, # 'ט' - 1: 2, # '×™' - 25: 2, # 'ך' - 15: 2, # '×›' - 4: 2, # 'ל' - 11: 2, # '×' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # '× ' - 19: 1, # 'ס' - 13: 2, # '×¢' - 26: 1, # '×£' - 18: 2, # 'פ' - 27: 1, # '×¥' - 21: 2, # 'צ' - 17: 2, # '×§' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 35: { # 'Ö¹' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 2, # 'ב' - 20: 1, # '×’' - 16: 2, # 'ד' - 3: 2, # '×”' - 2: 1, # 'ו' - 24: 1, # '×–' - 14: 1, # '×—' - 22: 1, # 'ט' - 1: 1, # '×™' - 25: 1, # 'ך' - 15: 2, # '×›' - 4: 2, # 'ל' - 11: 2, # '×' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 2, # '× ' - 19: 2, # 'ס' - 13: 2, # '×¢' - 26: 1, # '×£' - 18: 2, # 'פ' - 27: 1, # '×¥' - 21: 2, # 'צ' - 17: 2, # '×§' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 62: { # 'Ö»' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 1, # 'ב' - 20: 1, # '×’' - 16: 1, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 1, # '×–' - 14: 1, # '×—' - 22: 0, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 2, # 'ל' - 11: 1, # '×' - 6: 1, # 'מ' - 23: 1, # 'ן' - 12: 1, # '× ' - 19: 1, # 'ס' - 13: 1, # '×¢' - 26: 0, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 1, # 'צ' - 17: 1, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 28: { # 'Ö¼' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 3, # 'Ö°' - 59: 0, # 'Ö±' - 41: 1, # 'Ö²' - 33: 3, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 3, # 'Ö·' - 29: 3, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 2, # '×' - 45: 1, # 'ׂ' - 9: 2, # '×' - 8: 2, # 'ב' - 20: 1, # '×’' - 16: 2, # 'ד' - 3: 1, # '×”' - 2: 2, # 'ו' - 24: 1, # '×–' - 14: 1, # '×—' - 22: 1, # 'ט' - 1: 2, # '×™' - 25: 2, # 'ך' - 15: 2, # '×›' - 4: 2, # 'ל' - 11: 1, # '×' - 6: 2, # 'מ' - 23: 1, # 'ן' - 12: 2, # '× ' - 19: 1, # 'ס' - 13: 2, # '×¢' - 26: 1, # '×£' - 18: 1, # 'פ' - 27: 1, # '×¥' - 21: 1, # 'צ' - 17: 1, # '×§' - 7: 2, # 'ר' - 10: 2, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 38: { # '×' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 2, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 1, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 45: { # 'ׂ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 1, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 1, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 0, # 'ב' - 20: 1, # '×’' - 16: 0, # 'ד' - 3: 1, # '×”' - 2: 2, # 'ו' - 24: 0, # '×–' - 14: 1, # '×—' - 22: 0, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 1, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # '× ' - 19: 0, # 'ס' - 13: 1, # '×¢' - 26: 0, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 1, # 'ר' - 10: 0, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 9: { # '×' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 2, # 'Ö±' - 41: 2, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 3, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 2, # '×¢' - 26: 3, # '×£' - 18: 3, # 'פ' - 27: 1, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 8: { # 'ב' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 3, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 2, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 2, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 1, # '×£' - 18: 3, # 'פ' - 27: 2, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 20: { # '×’' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 2, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 1, # 'Ö´' - 37: 1, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 3, # 'ב' - 20: 2, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 2, # '×—' - 22: 2, # 'ט' - 1: 3, # '×™' - 25: 1, # 'ך' - 15: 1, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 2, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 2, # 'פ' - 27: 1, # '×¥' - 21: 1, # 'צ' - 17: 1, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 16: { # 'ד' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 1, # '×–' - 14: 2, # '×—' - 22: 2, # 'ט' - 1: 3, # '×™' - 25: 2, # 'ך' - 15: 2, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # '× ' - 19: 2, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 3, # 'פ' - 27: 0, # '×¥' - 21: 2, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 3: { # '×”' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'Ö°' - 59: 1, # 'Ö±' - 41: 2, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 3, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 1, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 0, # '×£' - 18: 3, # 'פ' - 27: 1, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 2, # '…' - }, - 2: { # 'ו' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 1, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 3, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 3, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 3, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 3, # '×£' - 18: 3, # 'פ' - 27: 3, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 2, # '…' - }, - 24: { # '×–' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 1, # 'Ö²' - 33: 1, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 2, # 'ב' - 20: 2, # '×’' - 16: 2, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 2, # '×–' - 14: 2, # '×—' - 22: 1, # 'ט' - 1: 3, # '×™' - 25: 1, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 2, # '×' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 2, # '× ' - 19: 1, # 'ס' - 13: 2, # '×¢' - 26: 1, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 2, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 1, # 'ש' - 5: 2, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 14: { # '×—' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 1, # 'Ö±' - 41: 2, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 3, # 'ב' - 20: 2, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 2, # '×—' - 22: 2, # 'ט' - 1: 3, # '×™' - 25: 1, # 'ך' - 15: 2, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 1, # '×¢' - 26: 2, # '×£' - 18: 2, # 'פ' - 27: 2, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 22: { # 'ט' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 1, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 1, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 1, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 1, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 2, # '×–' - 14: 3, # '×—' - 22: 2, # 'ט' - 1: 3, # '×™' - 25: 1, # 'ך' - 15: 2, # '×›' - 4: 3, # 'ל' - 11: 2, # '×' - 6: 2, # 'מ' - 23: 2, # 'ן' - 12: 3, # '× ' - 19: 2, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 3, # 'פ' - 27: 1, # '×¥' - 21: 2, # 'צ' - 17: 2, # '×§' - 7: 3, # 'ר' - 10: 2, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 1: { # '×™' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 3, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 3, # '×£' - 18: 3, # 'פ' - 27: 3, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 2, # '…' - }, - 25: { # 'ך' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 1, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 1, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 1, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 15: { # '×›' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 3, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 2, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 2, # 'ט' - 1: 3, # '×™' - 25: 3, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 2, # '×¢' - 26: 3, # '×£' - 18: 3, # 'פ' - 27: 1, # '×¥' - 21: 2, # 'צ' - 17: 2, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 4: { # 'ל' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 3, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 3, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 3, # 'פ' - 27: 2, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 11: { # '×' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 1, # 'ב' - 20: 1, # '×’' - 16: 0, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 1, # '×–' - 14: 1, # '×—' - 22: 0, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 1, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # '× ' - 19: 0, # 'ס' - 13: 1, # '×¢' - 26: 0, # '×£' - 18: 1, # 'פ' - 27: 1, # '×¥' - 21: 1, # 'צ' - 17: 1, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 2, # '…' - }, - 6: { # 'מ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 2, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 0, # '×£' - 18: 3, # 'פ' - 27: 2, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 23: { # 'ן' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 1, # 'ב' - 20: 1, # '×’' - 16: 1, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 0, # '×–' - 14: 1, # '×—' - 22: 1, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 1, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # '× ' - 19: 1, # 'ס' - 13: 1, # '×¢' - 26: 1, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 1, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 1, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 2, # '…' - }, - 12: { # '× ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 2, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 3, # 'פ' - 27: 2, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 19: { # 'ס' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 1, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 1, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 2, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 1, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 2, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 2, # '×' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # '× ' - 19: 2, # 'ס' - 13: 3, # '×¢' - 26: 3, # '×£' - 18: 3, # 'פ' - 27: 0, # '×¥' - 21: 2, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 1, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 13: { # '×¢' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'Ö°' - 59: 1, # 'Ö±' - 41: 2, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 1, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 2, # 'ך' - 15: 2, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 2, # '×¢' - 26: 1, # '×£' - 18: 2, # 'פ' - 27: 2, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 26: { # '×£' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 1, # 'ו' - 24: 0, # '×–' - 14: 1, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 1, # 'ס' - 13: 0, # '×¢' - 26: 1, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 1, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 18: { # 'פ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 1, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 1, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 2, # 'ב' - 20: 3, # '×’' - 16: 2, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 2, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 2, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 2, # '×' - 6: 2, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 2, # 'פ' - 27: 2, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 27: { # '×¥' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 1, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 1, # 'ר' - 10: 0, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 21: { # 'צ' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 2, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 1, # '×–' - 14: 3, # '×—' - 22: 2, # 'ט' - 1: 3, # '×™' - 25: 1, # 'ך' - 15: 1, # '×›' - 4: 3, # 'ל' - 11: 2, # '×' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # '× ' - 19: 1, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 3, # 'פ' - 27: 2, # '×¥' - 21: 2, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 0, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 17: { # '×§' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 1, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 2, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 2, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 1, # 'ך' - 15: 1, # '×›' - 4: 3, # 'ל' - 11: 2, # '×' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 3, # 'פ' - 27: 2, # '×¥' - 21: 3, # 'צ' - 17: 2, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 7: { # 'ר' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 2, # '´' - 48: 1, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 1, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 2, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 3, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 3, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 3, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 3, # 'פ' - 27: 3, # '×¥' - 21: 3, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 2, # '…' - }, - 10: { # 'ש' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 1, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 1, # 'Ö´' - 37: 1, # 'Öµ' - 36: 1, # 'Ö¶' - 31: 1, # 'Ö·' - 29: 1, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 3, # '×' - 45: 2, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 3, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 2, # '×–' - 14: 3, # '×—' - 22: 3, # 'ט' - 1: 3, # '×™' - 25: 3, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 2, # 'ן' - 12: 3, # '× ' - 19: 2, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 3, # 'פ' - 27: 1, # '×¥' - 21: 2, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 1, # '…' - }, - 5: { # 'ת' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 1, # '\xa0' - 55: 0, # '´' - 48: 1, # '¼' - 39: 1, # '½' - 57: 0, # '¾' - 30: 2, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 2, # 'Ö´' - 37: 2, # 'Öµ' - 36: 2, # 'Ö¶' - 31: 2, # 'Ö·' - 29: 2, # 'Ö¸' - 35: 1, # 'Ö¹' - 62: 1, # 'Ö»' - 28: 2, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 3, # '×' - 8: 3, # 'ב' - 20: 3, # '×’' - 16: 2, # 'ד' - 3: 3, # '×”' - 2: 3, # 'ו' - 24: 2, # '×–' - 14: 3, # '×—' - 22: 2, # 'ט' - 1: 3, # '×™' - 25: 2, # 'ך' - 15: 3, # '×›' - 4: 3, # 'ל' - 11: 3, # '×' - 6: 3, # 'מ' - 23: 3, # 'ן' - 12: 3, # '× ' - 19: 2, # 'ס' - 13: 3, # '×¢' - 26: 2, # '×£' - 18: 3, # 'פ' - 27: 1, # '×¥' - 21: 2, # 'צ' - 17: 3, # '×§' - 7: 3, # 'ר' - 10: 3, # 'ש' - 5: 3, # 'ת' - 32: 1, # '–' - 52: 1, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 2, # '…' - }, - 32: { # '–' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 1, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 1, # 'ב' - 20: 1, # '×’' - 16: 1, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 0, # '×–' - 14: 1, # '×—' - 22: 0, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 1, # 'ס' - 13: 1, # '×¢' - 26: 0, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 1, # 'צ' - 17: 0, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 52: { # '’' - 50: 1, # 'a' - 60: 0, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 1, # 'r' - 43: 2, # 's' - 44: 2, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 1, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 47: { # '“' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 1, # 'l' - 54: 1, # 'n' - 49: 1, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 1, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 2, # '×' - 8: 1, # 'ב' - 20: 1, # '×’' - 16: 1, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 1, # '×–' - 14: 1, # '×—' - 22: 1, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # '× ' - 19: 1, # 'ס' - 13: 1, # '×¢' - 26: 0, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 1, # 'צ' - 17: 1, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 46: { # 'â€' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 1, # 'ב' - 20: 1, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 1, # 'צ' - 17: 0, # '×§' - 7: 1, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 0, # '†' - 40: 0, # '…' - }, - 58: { # '†' - 50: 0, # 'a' - 60: 0, # 'c' - 61: 0, # 'd' - 42: 0, # 'e' - 53: 0, # 'i' - 56: 0, # 'l' - 54: 0, # 'n' - 49: 0, # 'o' - 51: 0, # 'r' - 43: 0, # 's' - 44: 0, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 0, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 0, # '×”' - 2: 0, # 'ו' - 24: 0, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 0, # '×™' - 25: 0, # 'ך' - 15: 0, # '×›' - 4: 0, # 'ל' - 11: 0, # '×' - 6: 0, # 'מ' - 23: 0, # 'ן' - 12: 0, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 0, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 0, # 'ר' - 10: 0, # 'ש' - 5: 0, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 0, # 'â€' - 58: 2, # '†' - 40: 0, # '…' - }, - 40: { # '…' - 50: 1, # 'a' - 60: 1, # 'c' - 61: 1, # 'd' - 42: 1, # 'e' - 53: 1, # 'i' - 56: 0, # 'l' - 54: 1, # 'n' - 49: 0, # 'o' - 51: 1, # 'r' - 43: 1, # 's' - 44: 1, # 't' - 63: 0, # 'u' - 34: 0, # '\xa0' - 55: 0, # '´' - 48: 0, # '¼' - 39: 0, # '½' - 57: 0, # '¾' - 30: 0, # 'Ö°' - 59: 0, # 'Ö±' - 41: 0, # 'Ö²' - 33: 0, # 'Ö´' - 37: 0, # 'Öµ' - 36: 0, # 'Ö¶' - 31: 0, # 'Ö·' - 29: 0, # 'Ö¸' - 35: 0, # 'Ö¹' - 62: 0, # 'Ö»' - 28: 0, # 'Ö¼' - 38: 0, # '×' - 45: 0, # 'ׂ' - 9: 1, # '×' - 8: 0, # 'ב' - 20: 0, # '×’' - 16: 0, # 'ד' - 3: 1, # '×”' - 2: 1, # 'ו' - 24: 1, # '×–' - 14: 0, # '×—' - 22: 0, # 'ט' - 1: 1, # '×™' - 25: 0, # 'ך' - 15: 1, # '×›' - 4: 1, # 'ל' - 11: 0, # '×' - 6: 1, # 'מ' - 23: 0, # 'ן' - 12: 1, # '× ' - 19: 0, # 'ס' - 13: 0, # '×¢' - 26: 0, # '×£' - 18: 1, # 'פ' - 27: 0, # '×¥' - 21: 0, # 'צ' - 17: 0, # '×§' - 7: 1, # 'ר' - 10: 1, # 'ש' - 5: 1, # 'ת' - 32: 0, # '–' - 52: 0, # '’' - 47: 0, # '“' - 46: 1, # 'â€' - 58: 0, # '†' - 40: 2, # '…' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# 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 -} - -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/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py deleted file mode 100644 index bbc5cda..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py +++ /dev/null @@ -1,4650 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -HUNGARIAN_LANG_MODEL = { - 28: { # 'A' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 2, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 2, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 2, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 1, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 1, # 'Ã' - 44: 0, # 'É' - 61: 1, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 40: { # 'B' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 0, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 3, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 54: { # 'C' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 0, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 3, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 45: { # 'D' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 0, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 1, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'Å‘' - 56: 0, # 'ű' - }, - 32: { # 'E' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 2, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 1, # 't' - 21: 2, # 'u' - 19: 1, # 'v' - 62: 1, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 0, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 50: { # 'F' - 28: 1, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 0, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 0, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 49: { # 'G' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 2, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 0, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'Å‘' - 56: 0, # 'ű' - }, - 38: { # 'H' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 0, # 'D' - 32: 1, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 1, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 1, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 0, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Ã' - 44: 2, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 2, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 39: { # 'I' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 2, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 0, # 'e' - 27: 1, # 'f' - 12: 2, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 0, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 53: { # 'J' - 28: 2, # 'A' - 40: 0, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 1, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 0, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 0, # 'ü' - 42: 1, # 'Å‘' - 56: 0, # 'ű' - }, - 36: { # 'K' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 2, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'Å‘' - 56: 0, # 'ű' - }, - 41: { # 'L' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 1, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 34: { # 'M' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 3, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 1, # 'ű' - }, - 35: { # 'N' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 2, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 2, # 'Y' - 52: 1, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 0, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 1, # 'Å‘' - 56: 0, # 'ű' - }, - 47: { # 'O' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 2, # 'K' - 41: 2, # 'L' - 34: 2, # 'M' - 35: 2, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 2, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 1, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 0, # 'Ã' - 58: 1, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 46: { # 'P' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 0, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 3, # 'á' - 15: 2, # 'é' - 30: 0, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'Å‘' - 56: 0, # 'ű' - }, - 43: { # 'R' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 2, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 2, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 2, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 33: { # 'S' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 3, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 1, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 1, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 2, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 37: { # 'T' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 1, # 'S' - 37: 2, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 2, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 1, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 0, # 't' - 21: 2, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 2, # 'Ã' - 44: 2, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 57: { # 'U' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 2, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 1, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 48: { # 'V' - 28: 2, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 0, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 2, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 2, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 2, # 'o' - 23: 0, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 2, # 'Ã' - 44: 2, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 0, # 'Ú' - 63: 1, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 55: { # 'Y' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 1, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 2, # 'Z' - 2: 1, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 0, # 'r' - 5: 0, # 's' - 3: 0, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 1, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 52: { # 'Z' - 28: 2, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 2, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 2, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 2, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 1, # 'U' - 48: 1, # 'V' - 55: 1, # 'Y' - 52: 1, # 'Z' - 2: 1, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 1, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 1, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 2, # 's' - 3: 0, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 2, # 'Ã' - 44: 1, # 'É' - 61: 1, # 'Ã' - 58: 1, # 'Ó' - 59: 1, # 'Ö' - 60: 1, # 'Ú' - 63: 1, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 2: { # 'a' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 2, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 2, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 18: { # 'b' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 2, # 's' - 3: 1, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 2, # 'Å‘' - 56: 1, # 'ű' - }, - 26: { # 'c' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 1, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 1, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 2, # 't' - 21: 2, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 2, # 'á' - 15: 2, # 'é' - 30: 2, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 17: { # 'd' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 2, # 'k' - 6: 1, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 2, # 'Å‘' - 56: 1, # 'ű' - }, - 1: { # 'e' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 3, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 2, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 2, # 'u' - 19: 3, # 'v' - 62: 2, # 'x' - 16: 2, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 27: { # 'f' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 3, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 2, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 0, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 3, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 12: { # 'g' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 2, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 2, # 'k' - 6: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 3, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 2, # 'Å‘' - 56: 1, # 'ű' - }, - 20: { # 'h' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 3, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 2, # 's' - 3: 1, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 0, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 1, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 9: { # 'i' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 3, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 2, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 3, # 'ó' - 24: 1, # 'ö' - 31: 2, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 1, # 'ű' - }, - 22: { # 'j' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 1, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 1, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 7: { # 'k' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 2, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 2, # 'ó' - 24: 3, # 'ö' - 31: 1, # 'ú' - 29: 3, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 6: { # 'l' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 1, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 3, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 3, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 3, # 'Å‘' - 56: 1, # 'ű' - }, - 13: { # 'm' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 1, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 3, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 3, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'Å‘' - 56: 2, # 'ű' - }, - 4: { # 'n' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 1, # 'x' - 16: 3, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'Å‘' - 56: 1, # 'ű' - }, - 8: { # 'o' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 1, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 2, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 23: { # 'p' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 3, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 10: { # 'r' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 2, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'Å‘' - 56: 2, # 'ű' - }, - 5: { # 's' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 2, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'Å‘' - 56: 1, # 'ű' - }, - 3: { # 't' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 1, # 'g' - 20: 3, # 'h' - 9: 3, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 3, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 3, # 'ú' - 29: 3, # 'ü' - 42: 3, # 'Å‘' - 56: 2, # 'ű' - }, - 21: { # 'u' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 2, # 'b' - 26: 2, # 'c' - 17: 3, # 'd' - 1: 2, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 1, # 'u' - 19: 3, # 'v' - 62: 1, # 'x' - 16: 1, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 2, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 0, # 'ö' - 31: 1, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 19: { # 'v' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 2, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 2, # 'ö' - 31: 1, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'Å‘' - 56: 1, # 'ű' - }, - 62: { # 'x' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 0, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 1, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 1, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 1, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 16: { # 'y' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 3, # 'e' - 27: 2, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 2, # 'j' - 7: 2, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 2, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 2, # 'í' - 25: 2, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 2, # 'ü' - 42: 1, # 'Å‘' - 56: 2, # 'ű' - }, - 11: { # 'z' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 3, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 3, # 'd' - 1: 3, # 'e' - 27: 1, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 3, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 3, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 3, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 3, # 'á' - 15: 3, # 'é' - 30: 3, # 'í' - 25: 3, # 'ó' - 24: 3, # 'ö' - 31: 2, # 'ú' - 29: 3, # 'ü' - 42: 2, # 'Å‘' - 56: 1, # 'ű' - }, - 51: { # 'Ã' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 1, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 44: { # 'É' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 1, # 'E' - 50: 0, # 'F' - 49: 2, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 2, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 2, # 'R' - 33: 2, # 'S' - 37: 2, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 3, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 0, # 'Ã' - 44: 1, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 61: { # 'Ã' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 0, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 2, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 1, # 'm' - 4: 0, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 0, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 58: { # 'Ó' - 28: 1, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 1, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 2, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 2, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 0, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 1, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 59: { # 'Ö' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 1, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 0, # 'b' - 26: 1, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 0, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 2, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 60: { # 'Ú' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 1, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 1, # 'F' - 49: 1, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 0, # 'b' - 26: 0, # 'c' - 17: 0, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 2, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 2, # 'j' - 7: 0, # 'k' - 6: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 0, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 0, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 63: { # 'Ü' - 28: 0, # 'A' - 40: 1, # 'B' - 54: 0, # 'C' - 45: 1, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 1, # 'G' - 38: 1, # 'H' - 39: 0, # 'I' - 53: 1, # 'J' - 36: 1, # 'K' - 41: 1, # 'L' - 34: 1, # 'M' - 35: 1, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 1, # 'R' - 33: 1, # 'S' - 37: 1, # 'T' - 57: 0, # 'U' - 48: 1, # 'V' - 55: 0, # 'Y' - 52: 1, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 0, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 0, # 'f' - 12: 1, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 0, # 'j' - 7: 0, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 1, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 14: { # 'á' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 3, # 'b' - 26: 3, # 'c' - 17: 3, # 'd' - 1: 1, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 2, # 'i' - 22: 3, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 2, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 1, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 2, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 15: { # 'é' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 3, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 3, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 3, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 0, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 30: { # 'í' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 0, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 0, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 0, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 2, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 2, # 's' - 3: 3, # 't' - 21: 0, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 25: { # 'ó' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 2, # 'a' - 18: 3, # 'b' - 26: 2, # 'c' - 17: 3, # 'd' - 1: 1, # 'e' - 27: 2, # 'f' - 12: 2, # 'g' - 20: 2, # 'h' - 9: 2, # 'i' - 22: 2, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 8: 1, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 1, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 1, # 'ö' - 31: 1, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 24: { # 'ö' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 0, # 'a' - 18: 3, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 0, # 'e' - 27: 1, # 'f' - 12: 2, # 'g' - 20: 1, # 'h' - 9: 0, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 8: 0, # 'o' - 23: 2, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 3, # 't' - 21: 0, # 'u' - 19: 3, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 3, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 31: { # 'ú' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 2, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 2, # 'f' - 12: 3, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 3, # 'j' - 7: 1, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 3, # 'r' - 5: 3, # 's' - 3: 2, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 1, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 29: { # 'ü' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 3, # 'g' - 20: 2, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 3, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 8: 0, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 0, # 'u' - 19: 2, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 1, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 42: { # 'Å‘' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 2, # 'b' - 26: 1, # 'c' - 17: 2, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 2, # 'k' - 6: 3, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 8: 1, # 'o' - 23: 1, # 'p' - 10: 2, # 'r' - 5: 2, # 's' - 3: 2, # 't' - 21: 1, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 1, # 'é' - 30: 1, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 1, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, - 56: { # 'ű' - 28: 0, # 'A' - 40: 0, # 'B' - 54: 0, # 'C' - 45: 0, # 'D' - 32: 0, # 'E' - 50: 0, # 'F' - 49: 0, # 'G' - 38: 0, # 'H' - 39: 0, # 'I' - 53: 0, # 'J' - 36: 0, # 'K' - 41: 0, # 'L' - 34: 0, # 'M' - 35: 0, # 'N' - 47: 0, # 'O' - 46: 0, # 'P' - 43: 0, # 'R' - 33: 0, # 'S' - 37: 0, # 'T' - 57: 0, # 'U' - 48: 0, # 'V' - 55: 0, # 'Y' - 52: 0, # 'Z' - 2: 1, # 'a' - 18: 1, # 'b' - 26: 0, # 'c' - 17: 1, # 'd' - 1: 1, # 'e' - 27: 1, # 'f' - 12: 1, # 'g' - 20: 1, # 'h' - 9: 1, # 'i' - 22: 1, # 'j' - 7: 1, # 'k' - 6: 1, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 8: 0, # 'o' - 23: 0, # 'p' - 10: 1, # 'r' - 5: 1, # 's' - 3: 1, # 't' - 21: 0, # 'u' - 19: 1, # 'v' - 62: 0, # 'x' - 16: 0, # 'y' - 11: 2, # 'z' - 51: 0, # 'Ã' - 44: 0, # 'É' - 61: 0, # 'Ã' - 58: 0, # 'Ó' - 59: 0, # 'Ö' - 60: 0, # 'Ú' - 63: 0, # 'Ü' - 14: 0, # 'á' - 15: 0, # 'é' - 30: 0, # 'í' - 25: 0, # 'ó' - 24: 0, # 'ö' - 31: 0, # 'ú' - 29: 0, # 'ü' - 42: 0, # 'Å‘' - 56: 0, # 'ű' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# 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, # 'Ë™' -} - -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, # 'Ë™' -} - -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/venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py deleted file mode 100644 index 5594452..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py +++ /dev/null @@ -1,5718 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -RUSSIAN_LANG_MODEL = { - 37: { # 'Ð' - 37: 0, # 'Ð' - 44: 1, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 2, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Ð¥' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 1, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 2, # 'у' - 39: 2, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 0, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 44: { # 'Б' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 2, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 33: { # 'Ð’' - 37: 2, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 2, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 1, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 46: { # 'Г' - 37: 1, # 'Ð' - 44: 1, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 41: { # 'Д' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 2, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 3, # 'ж' - 20: 1, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 48: { # 'Е' - 37: 1, # 'Ð' - 44: 1, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 2, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 2, # 'Р' - 32: 2, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Ð¥' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 2, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 1, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 1, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 0, # 'у' - 39: 1, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 56: { # 'Ж' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 1, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 1, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 2, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 51: { # 'З' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 1, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 1, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 42: { # 'И' - 37: 1, # 'Ð' - 44: 1, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 2, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 2, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Ð¥' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 2, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 1, # 'о' - 15: 1, # 'п' - 9: 2, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 1, # 'у' - 39: 1, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 60: { # 'Й' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Ð¥' - 58: 1, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 1, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 0, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 0, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 36: { # 'К' - 37: 2, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 2, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 1, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 49: { # 'Л' - 37: 2, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 0, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 0, # 'м' - 5: 1, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 0, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 2, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 38: { # 'М' - 37: 1, # 'Ð' - 44: 1, # 'Б' - 33: 1, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 0, # 'Ь' - 47: 1, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'Ñ€' - 7: 1, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 31: { # 'Ð' - 37: 2, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 2, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Ð¥' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 3, # 'у' - 39: 0, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 2, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 34: { # 'О' - 37: 0, # 'Ð' - 44: 1, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 2, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 1, # 'З' - 42: 1, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 2, # 'Л' - 38: 1, # 'М' - 31: 2, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 2, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 1, # 'Ф' - 55: 1, # 'Ð¥' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 1, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 1, # 'у' - 39: 1, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 35: { # 'П' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 2, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'Ñ€' - 7: 1, # 'Ñ' - 6: 1, # 'Ñ‚' - 14: 2, # 'у' - 39: 1, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 2, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 2, # 'Ñ' - }, - 45: { # 'Р' - 37: 2, # 'Ð' - 44: 1, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 2, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 2, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 2, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Ð¥' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 2, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 2, # 'Ñ' - }, - 32: { # 'С' - 37: 1, # 'Ð' - 44: 1, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 2, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Ð¥' - 58: 1, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 2, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 2, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 1, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 2, # 'у' - 39: 1, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 1, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 40: { # 'Т' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 2, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 1, # 'Ь' - 47: 1, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 1, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 2, # 'Ñ€' - 7: 1, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 52: { # 'У' - 37: 1, # 'Ð' - 44: 1, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 1, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Ð¥' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 1, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 1, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 2, # 'и' - 23: 1, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 1, # 'н' - 1: 2, # 'о' - 15: 1, # 'п' - 9: 2, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 0, # 'у' - 39: 1, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 53: { # 'Ф' - 37: 1, # 'Ð' - 44: 1, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 2, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 1, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 55: { # 'Ð¥' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 2, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 0, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 2, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 1, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 58: { # 'Ц' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 1, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 1, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 50: { # 'Ч' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 0, # 'О' - 35: 1, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 1, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 1, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 1, # 'о' - 15: 0, # 'п' - 9: 1, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 57: { # 'Ш' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 1, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 2, # 'о' - 15: 2, # 'п' - 9: 1, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 63: { # 'Щ' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 1, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 1, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 1, # 'о' - 15: 0, # 'п' - 9: 0, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 1, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 62: { # 'Ы' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 0, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Ð¥' - 58: 1, # 'Ц' - 50: 0, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 0, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 0, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 61: { # 'Ь' - 37: 0, # 'Ð' - 44: 1, # 'Б' - 33: 1, # 'Ð’' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 1, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 1, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 1, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 0, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 0, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 47: { # 'Э' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 1, # 'Й' - 36: 1, # 'К' - 49: 1, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 0, # 'О' - 35: 1, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 2, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 2, # 'Ñ€' - 7: 1, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 1, # 'у' - 39: 1, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 59: { # 'Ю' - 37: 1, # 'Ð' - 44: 1, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 1, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 0, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 0, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 1, # 'Ñ€' - 7: 1, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 0, # 'у' - 39: 0, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 43: { # 'Я' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 1, # 'Ð’' - 46: 1, # 'Г' - 41: 0, # 'Д' - 48: 1, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 1, # 'С' - 40: 1, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 1, # 'Ð¥' - 58: 0, # 'Ц' - 50: 1, # 'Ч' - 57: 0, # 'Ш' - 63: 1, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 1, # 'Ю' - 43: 1, # 'Я' - 3: 0, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 0, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 1, # 'й' - 11: 1, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 1, # 'п' - 9: 1, # 'Ñ€' - 7: 1, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 0, # 'у' - 39: 0, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 3: { # 'а' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 1, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 3, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 3, # 'у' - 39: 2, # 'Ñ„' - 26: 3, # 'Ñ…' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 3, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 21: { # 'б' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 1, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 3, # 'у' - 39: 0, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 3, # 'щ' - 54: 2, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 2, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 10: { # 'в' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 3, # 'у' - 39: 1, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 2, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 3, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 19: { # 'г' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 3, # 'у' - 39: 1, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 13: { # 'д' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 3, # 'у' - 39: 1, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 3, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 2, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 3, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 2: { # 'е' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 2, # 'у' - 39: 2, # 'Ñ„' - 26: 3, # 'Ñ…' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 24: { # 'ж' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 1, # 'п' - 9: 2, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 1, # 'Ñ‚' - 14: 3, # 'у' - 39: 1, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 2, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 20: { # 'з' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 3, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 1, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 2, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 2, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 4: { # 'и' - 37: 1, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 1, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 2, # 'у' - 39: 2, # 'Ñ„' - 26: 3, # 'Ñ…' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 3, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 23: { # 'й' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 1, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 2, # 'з' - 4: 1, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 1, # 'п' - 9: 2, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 1, # 'у' - 39: 2, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 2, # 'Ñ' - }, - 11: { # 'к' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 3, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 3, # 'у' - 39: 1, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 2, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 1, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 8: { # 'л' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 3, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 1, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 3, # 'у' - 39: 2, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 1, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 3, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 3, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 12: { # 'м' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 3, # 'у' - 39: 2, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 2, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 5: { # 'н' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 2, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 3, # 'у' - 39: 2, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 3, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 2, # 'щ' - 54: 1, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 3, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 3, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 1: { # 'о' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 3, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 2, # 'у' - 39: 2, # 'Ñ„' - 26: 3, # 'Ñ…' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 3, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 15: { # 'п' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 3, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 3, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 3, # 'у' - 39: 1, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 1, # 'ш' - 29: 1, # 'щ' - 54: 0, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 2, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 9: { # 'Ñ€' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 2, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 3, # 'у' - 39: 2, # 'Ñ„' - 26: 3, # 'Ñ…' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 3, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 7: { # 'Ñ' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 1, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 3, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 3, # 'у' - 39: 2, # 'Ñ„' - 26: 3, # 'Ñ…' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 2, # 'ш' - 29: 1, # 'щ' - 54: 2, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 3, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 3, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 6: { # 'Ñ‚' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 3, # 'у' - 39: 2, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 2, # 'щ' - 54: 2, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 3, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 2, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 14: { # 'у' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 3, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 2, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 3, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 1, # 'у' - 39: 2, # 'Ñ„' - 26: 3, # 'Ñ…' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 3, # 'ÑŽ' - 16: 2, # 'Ñ' - }, - 39: { # 'Ñ„' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 0, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 2, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 2, # 'у' - 39: 2, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 1, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 2, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 2, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 26: { # 'Ñ…' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 3, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 1, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 1, # 'п' - 9: 3, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 2, # 'у' - 39: 1, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 1, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 28: { # 'ц' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 1, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 2, # 'к' - 8: 1, # 'л' - 12: 1, # 'м' - 5: 1, # 'н' - 1: 3, # 'о' - 15: 0, # 'п' - 9: 1, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 1, # 'Ñ‚' - 14: 3, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 1, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 3, # 'Ñ‹' - 17: 1, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 22: { # 'ч' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 2, # 'л' - 12: 1, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 0, # 'п' - 9: 2, # 'Ñ€' - 7: 1, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 3, # 'у' - 39: 1, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 1, # 'ч' - 25: 2, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 3, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 25: { # 'ш' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 1, # 'б' - 10: 2, # 'в' - 19: 1, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 2, # 'м' - 5: 3, # 'н' - 1: 3, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 1, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 3, # 'у' - 39: 2, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 1, # 'ц' - 22: 1, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 3, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 29: { # 'щ' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 3, # 'а' - 21: 0, # 'б' - 10: 1, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 3, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 3, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 1, # 'м' - 5: 2, # 'н' - 1: 1, # 'о' - 15: 0, # 'п' - 9: 2, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 2, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 2, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 0, # 'Ñ' - }, - 54: { # 'ÑŠ' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 0, # 'б' - 10: 0, # 'в' - 19: 0, # 'г' - 13: 0, # 'д' - 2: 2, # 'е' - 24: 0, # 'ж' - 20: 0, # 'з' - 4: 0, # 'и' - 23: 0, # 'й' - 11: 0, # 'к' - 8: 0, # 'л' - 12: 0, # 'м' - 5: 0, # 'н' - 1: 0, # 'о' - 15: 0, # 'п' - 9: 0, # 'Ñ€' - 7: 0, # 'Ñ' - 6: 0, # 'Ñ‚' - 14: 0, # 'у' - 39: 0, # 'Ñ„' - 26: 0, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 0, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 2, # 'Ñ' - }, - 18: { # 'Ñ‹' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 3, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 2, # 'и' - 23: 3, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 1, # 'о' - 15: 3, # 'п' - 9: 3, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 1, # 'у' - 39: 0, # 'Ñ„' - 26: 3, # 'Ñ…' - 28: 2, # 'ц' - 22: 3, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 0, # 'ÑŽ' - 16: 2, # 'Ñ' - }, - 17: { # 'ÑŒ' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 2, # 'б' - 10: 2, # 'в' - 19: 2, # 'г' - 13: 2, # 'д' - 2: 3, # 'е' - 24: 1, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 0, # 'й' - 11: 3, # 'к' - 8: 0, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 2, # 'о' - 15: 2, # 'п' - 9: 1, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 2, # 'Ñ‚' - 14: 0, # 'у' - 39: 2, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 3, # 'ш' - 29: 2, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 3, # 'ÑŽ' - 16: 3, # 'Ñ' - }, - 30: { # 'Ñ' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 1, # 'М' - 31: 1, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 1, # 'Р' - 32: 1, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 1, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 1, # 'б' - 10: 1, # 'в' - 19: 1, # 'г' - 13: 2, # 'д' - 2: 1, # 'е' - 24: 0, # 'ж' - 20: 1, # 'з' - 4: 0, # 'и' - 23: 2, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 2, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 1, # 'у' - 39: 2, # 'Ñ„' - 26: 1, # 'Ñ…' - 28: 0, # 'ц' - 22: 0, # 'ч' - 25: 1, # 'ш' - 29: 0, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 1, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 27: { # 'ÑŽ' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 2, # 'а' - 21: 3, # 'б' - 10: 1, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 1, # 'е' - 24: 2, # 'ж' - 20: 2, # 'з' - 4: 1, # 'и' - 23: 1, # 'й' - 11: 2, # 'к' - 8: 2, # 'л' - 12: 2, # 'м' - 5: 2, # 'н' - 1: 1, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 0, # 'у' - 39: 1, # 'Ñ„' - 26: 2, # 'Ñ…' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 1, # 'Ñ' - 27: 2, # 'ÑŽ' - 16: 1, # 'Ñ' - }, - 16: { # 'Ñ' - 37: 0, # 'Ð' - 44: 0, # 'Б' - 33: 0, # 'Ð’' - 46: 0, # 'Г' - 41: 0, # 'Д' - 48: 0, # 'Е' - 56: 0, # 'Ж' - 51: 0, # 'З' - 42: 0, # 'И' - 60: 0, # 'Й' - 36: 0, # 'К' - 49: 0, # 'Л' - 38: 0, # 'М' - 31: 0, # 'Ð' - 34: 0, # 'О' - 35: 0, # 'П' - 45: 0, # 'Р' - 32: 0, # 'С' - 40: 0, # 'Т' - 52: 0, # 'У' - 53: 0, # 'Ф' - 55: 0, # 'Ð¥' - 58: 0, # 'Ц' - 50: 0, # 'Ч' - 57: 0, # 'Ш' - 63: 0, # 'Щ' - 62: 0, # 'Ы' - 61: 0, # 'Ь' - 47: 0, # 'Э' - 59: 0, # 'Ю' - 43: 0, # 'Я' - 3: 0, # 'а' - 21: 2, # 'б' - 10: 3, # 'в' - 19: 2, # 'г' - 13: 3, # 'д' - 2: 3, # 'е' - 24: 3, # 'ж' - 20: 3, # 'з' - 4: 2, # 'и' - 23: 2, # 'й' - 11: 3, # 'к' - 8: 3, # 'л' - 12: 3, # 'м' - 5: 3, # 'н' - 1: 0, # 'о' - 15: 2, # 'п' - 9: 2, # 'Ñ€' - 7: 3, # 'Ñ' - 6: 3, # 'Ñ‚' - 14: 1, # 'у' - 39: 1, # 'Ñ„' - 26: 3, # 'Ñ…' - 28: 2, # 'ц' - 22: 2, # 'ч' - 25: 2, # 'ш' - 29: 3, # 'щ' - 54: 0, # 'ÑŠ' - 18: 0, # 'Ñ‹' - 17: 0, # 'ÑŒ' - 30: 0, # 'Ñ' - 27: 2, # 'ÑŽ' - 16: 2, # 'Ñ' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# 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' -} - -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, # 'Ñ' -} - -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' -} - -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, # 'Ъ' -} - -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, # '€' -} - -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, # 'ÑŸ' -} - -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/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py deleted file mode 100644 index 9a37db5..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py +++ /dev/null @@ -1,4383 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -THAI_LANG_MODEL = { - 5: { # 'à¸' - 5: 2, # 'à¸' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 3, # 'ฎ' - 57: 2, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 2, # 'ณ' - 20: 2, # 'ด' - 19: 3, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 1, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 1, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 2, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 3, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 2, # 'ื' - 32: 2, # 'ุ' - 35: 1, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 3, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 30: { # 'ข' - 5: 1, # 'à¸' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 2, # 'ณ' - 20: 0, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 2, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 2, # 'ี' - 40: 3, # 'ึ' - 27: 1, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 2, # '่' - 7: 3, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 24: { # 'ค' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 2, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 0, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 2, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'à¹' - 41: 3, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 8: { # 'ง' - 5: 3, # 'à¸' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 2, # 'ง' - 26: 2, # 'จ' - 52: 1, # 'ฉ' - 34: 2, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'à¸' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 2, # 'ศ' - 46: 1, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 1, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 1, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 3, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 26: { # 'จ' - 5: 2, # 'à¸' - 30: 1, # 'ข' - 24: 0, # 'ค' - 8: 2, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 3, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 2, # 'ิ' - 13: 1, # 'ี' - 40: 3, # 'ึ' - 27: 1, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'à¹' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 52: { # 'ฉ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 3, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 3, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 1, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 1, # 'ั' - 1: 1, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 34: { # 'ช' - 5: 1, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 1, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 1, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 1, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 51: { # 'ซ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 1, # 'ั' - 1: 1, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 2, # 'ี' - 40: 3, # 'ึ' - 27: 2, # 'ื' - 32: 1, # 'ุ' - 35: 1, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 1, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 47: { # 'à¸' - 5: 1, # 'à¸' - 30: 1, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 3, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 2, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'à¹' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 58: { # 'ฎ' - 5: 2, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 1, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 57: { # 'à¸' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 49: { # 'à¸' - 5: 1, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 53: { # 'ฑ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 55: { # 'ฒ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 43: { # 'ณ' - 5: 1, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 3, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 3, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 3, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'à¹' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 20: { # 'ด' - 5: 2, # 'à¸' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 3, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 2, # 'า' - 36: 2, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 1, # 'ึ' - 27: 2, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 2, # 'ๆ' - 37: 2, # '็' - 6: 1, # '่' - 7: 3, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 19: { # 'ต' - 5: 2, # 'à¸' - 30: 1, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 2, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 2, # 'ภ' - 9: 1, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 0, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 1, # 'ึ' - 27: 1, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'à¹' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 2, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 44: { # 'ถ' - 5: 1, # 'à¸' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 1, # 'ี' - 40: 3, # 'ึ' - 27: 2, # 'ื' - 32: 2, # 'ุ' - 35: 3, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'à¹' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 14: { # 'ท' - 5: 1, # 'à¸' - 30: 1, # 'ข' - 24: 3, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 3, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 1, # 'ฤ' - 15: 1, # 'ล' - 12: 2, # 'ว' - 42: 3, # 'ศ' - 46: 1, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 1, # 'ื' - 32: 3, # 'ุ' - 35: 1, # 'ู' - 11: 0, # 'เ' - 28: 1, # 'à¹' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 48: { # 'ธ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 2, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 2, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 3: { # 'น' - 5: 3, # 'à¸' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 1, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 1, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 2, # 'ถ' - 14: 3, # 'ท' - 48: 3, # 'ธ' - 3: 2, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'à¸' - 31: 2, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 1, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 3, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'à¹' - 41: 3, # 'โ' - 29: 3, # 'ใ' - 33: 3, # 'ไ' - 50: 2, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 17: { # 'บ' - 5: 3, # 'à¸' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 1, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 2, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 2, # 'ื' - 32: 3, # 'ุ' - 35: 2, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 2, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 25: { # 'ป' - 5: 2, # 'à¸' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 1, # 'ฎ' - 57: 3, # 'à¸' - 49: 1, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 1, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 1, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 3, # 'ั' - 1: 1, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 2, # 'à¹' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 3, # '็' - 6: 1, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 39: { # 'ผ' - 5: 1, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 1, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 1, # 'ื' - 32: 0, # 'ุ' - 35: 3, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 1, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 62: { # 'à¸' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 1, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 1, # 'ี' - 40: 2, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 2, # '่' - 7: 1, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 31: { # 'พ' - 5: 1, # 'à¸' - 30: 1, # 'ข' - 24: 1, # 'ค' - 8: 1, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 2, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 1, # 'ึ' - 27: 3, # 'ื' - 32: 1, # 'ุ' - 35: 2, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'à¹' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 1, # '็' - 6: 0, # '่' - 7: 1, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 54: { # 'ฟ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 2, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 1, # 'ื' - 32: 1, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 1, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 45: { # 'ภ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 2, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 9: { # 'ม' - 5: 2, # 'à¸' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 3, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 2, # 'ร' - 61: 2, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 1, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'à¹' - 41: 2, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 16: { # 'ย' - 5: 3, # 'à¸' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 2, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 3, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 1, # 'ึ' - 27: 2, # 'ื' - 32: 2, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 1, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 2, # 'ๆ' - 37: 1, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 2: { # 'ร' - 5: 3, # 'à¸' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 2, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 3, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 3, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 3, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 2, # 'น' - 17: 2, # 'บ' - 25: 3, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'à¸' - 31: 2, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 2, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 1, # 'ฯ' - 22: 3, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 3, # 'ู' - 11: 3, # 'เ' - 28: 3, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 3, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 3, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 61: { # 'ฤ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 2, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 15: { # 'ล' - 5: 2, # 'à¸' - 30: 3, # 'ข' - 24: 1, # 'ค' - 8: 3, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 3, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 3, # 'อ' - 63: 2, # 'ฯ' - 22: 3, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 3, # 'ื' - 32: 2, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 1, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 2, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 12: { # 'ว' - 5: 3, # 'à¸' - 30: 2, # 'ข' - 24: 1, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 3, # 'ิ' - 13: 2, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 2, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 42: { # 'ศ' - 5: 1, # 'à¸' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 1, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 2, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 2, # 'ิ' - 13: 0, # 'ี' - 40: 3, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 2, # 'ู' - 11: 0, # 'เ' - 28: 1, # 'à¹' - 41: 0, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 46: { # 'ษ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 2, # 'ฎ' - 57: 1, # 'à¸' - 49: 2, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 3, # 'ณ' - 20: 0, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 2, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 18: { # 'ส' - 5: 2, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 2, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 3, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 2, # 'ภ' - 9: 3, # 'ม' - 16: 1, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 3, # 'ำ' - 23: 3, # 'ิ' - 13: 3, # 'ี' - 40: 2, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 3, # 'ู' - 11: 2, # 'เ' - 28: 0, # 'à¹' - 41: 1, # 'โ' - 29: 0, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 1, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 21: { # 'ห' - 5: 3, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 1, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 3, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 0, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 0, # 'ำ' - 23: 1, # 'ิ' - 13: 1, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 1, # 'ุ' - 35: 1, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 3, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 4: { # 'อ' - 5: 3, # 'à¸' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 2, # 'ะ' - 10: 3, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 2, # 'ิ' - 13: 3, # 'ี' - 40: 0, # 'ึ' - 27: 3, # 'ื' - 32: 3, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 1, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 1, # '็' - 6: 2, # '่' - 7: 2, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 63: { # 'ฯ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 22: { # 'ะ' - 5: 3, # 'à¸' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 1, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 2, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 1, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 10: { # 'ั' - 5: 3, # 'à¸' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 3, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 3, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 2, # 'à¸' - 53: 0, # 'ฑ' - 55: 3, # 'ฒ' - 43: 3, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 1: { # 'า' - 5: 3, # 'à¸' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 3, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 1, # 'ซ' - 47: 2, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 3, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 2, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 1, # 'à¸' - 31: 3, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 3, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 3, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 36: { # 'ำ' - 5: 2, # 'à¸' - 30: 1, # 'ข' - 24: 3, # 'ค' - 8: 2, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 1, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 3, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 23: { # 'ิ' - 5: 3, # 'à¸' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 3, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'à¸' - 31: 3, # 'พ' - 54: 1, # 'ฟ' - 45: 2, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 3, # 'ศ' - 46: 2, # 'ษ' - 18: 2, # 'ส' - 21: 3, # 'ห' - 4: 1, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 1, # 'à¹' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 2, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 13: { # 'ี' - 5: 3, # 'à¸' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 1, # 'ผ' - 62: 0, # 'à¸' - 31: 2, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 3, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 2, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 40: { # 'ึ' - 5: 3, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 3, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 1, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 27: { # 'ื' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 3, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 32: { # 'ุ' - 5: 3, # 'à¸' - 30: 2, # 'ข' - 24: 3, # 'ค' - 8: 3, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 1, # 'ฒ' - 43: 3, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 2, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 1, # 'ภ' - 9: 3, # 'ม' - 16: 1, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 1, # 'ว' - 42: 1, # 'ศ' - 46: 2, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'à¹' - 41: 1, # 'โ' - 29: 0, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 2, # '้' - 38: 1, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 35: { # 'ู' - 5: 3, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 2, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 2, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 2, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 2, # 'น' - 17: 0, # 'บ' - 25: 3, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 1, # 'à¹' - 41: 1, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 3, # '่' - 7: 3, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 11: { # 'เ' - 5: 3, # 'à¸' - 30: 3, # 'ข' - 24: 3, # 'ค' - 8: 2, # 'ง' - 26: 3, # 'จ' - 52: 3, # 'ฉ' - 34: 3, # 'ช' - 51: 2, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 1, # 'ณ' - 20: 3, # 'ด' - 19: 3, # 'ต' - 44: 1, # 'ถ' - 14: 3, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 3, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'à¸' - 31: 3, # 'พ' - 54: 1, # 'ฟ' - 45: 3, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 3, # 'ว' - 42: 2, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 28: { # 'à¹' - 5: 3, # 'à¸' - 30: 2, # 'ข' - 24: 2, # 'ค' - 8: 1, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 3, # 'ต' - 44: 2, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 2, # 'ป' - 39: 3, # 'ผ' - 62: 0, # 'à¸' - 31: 2, # 'พ' - 54: 2, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 41: { # 'โ' - 5: 2, # 'à¸' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 1, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 3, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 1, # 'ภ' - 9: 1, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 3, # 'ล' - 12: 0, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 0, # 'ห' - 4: 2, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 29: { # 'ใ' - 5: 2, # 'à¸' - 30: 0, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 3, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 1, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 3, # 'ส' - 21: 3, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 33: { # 'ไ' - 5: 1, # 'à¸' - 30: 2, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 3, # 'ด' - 19: 1, # 'ต' - 44: 0, # 'ถ' - 14: 3, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 1, # 'บ' - 25: 3, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 2, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 0, # 'ย' - 2: 3, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 2, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 50: { # 'ๆ' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 37: { # '็' - 5: 2, # 'à¸' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 2, # 'ง' - 26: 3, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 1, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 0, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 3, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 1, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 2, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 0, # 'ห' - 4: 1, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 1, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 6: { # '่' - 5: 2, # 'à¸' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 1, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 1, # 'ธ' - 3: 3, # 'น' - 17: 1, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 1, # 'à¸' - 31: 1, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 3, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 2, # 'ล' - 12: 3, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 1, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 1, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 3, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 1, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 7: { # '้' - 5: 2, # 'à¸' - 30: 1, # 'ข' - 24: 2, # 'ค' - 8: 3, # 'ง' - 26: 2, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 1, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 1, # 'ด' - 19: 2, # 'ต' - 44: 1, # 'ถ' - 14: 2, # 'ท' - 48: 0, # 'ธ' - 3: 3, # 'น' - 17: 2, # 'บ' - 25: 2, # 'ป' - 39: 2, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 0, # 'ภ' - 9: 3, # 'ม' - 16: 2, # 'ย' - 2: 2, # 'ร' - 61: 0, # 'ฤ' - 15: 1, # 'ล' - 12: 3, # 'ว' - 42: 1, # 'ศ' - 46: 0, # 'ษ' - 18: 2, # 'ส' - 21: 2, # 'ห' - 4: 3, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 3, # 'า' - 36: 2, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 2, # 'ใ' - 33: 2, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 38: { # '์' - 5: 2, # 'à¸' - 30: 1, # 'ข' - 24: 1, # 'ค' - 8: 0, # 'ง' - 26: 1, # 'จ' - 52: 0, # 'ฉ' - 34: 1, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 2, # 'ด' - 19: 1, # 'ต' - 44: 1, # 'ถ' - 14: 1, # 'ท' - 48: 0, # 'ธ' - 3: 1, # 'น' - 17: 1, # 'บ' - 25: 1, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 1, # 'พ' - 54: 1, # 'ฟ' - 45: 0, # 'ภ' - 9: 2, # 'ม' - 16: 0, # 'ย' - 2: 1, # 'ร' - 61: 1, # 'ฤ' - 15: 1, # 'ล' - 12: 1, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 1, # 'ส' - 21: 1, # 'ห' - 4: 2, # 'อ' - 63: 1, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 2, # 'เ' - 28: 2, # 'à¹' - 41: 1, # 'โ' - 29: 1, # 'ใ' - 33: 1, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 0, # '๑' - 59: 0, # '๒' - 60: 0, # '๕' - }, - 56: { # '๑' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 2, # '๑' - 59: 1, # '๒' - 60: 1, # '๕' - }, - 59: { # '๒' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 1, # '๑' - 59: 1, # '๒' - 60: 3, # '๕' - }, - 60: { # '๕' - 5: 0, # 'à¸' - 30: 0, # 'ข' - 24: 0, # 'ค' - 8: 0, # 'ง' - 26: 0, # 'จ' - 52: 0, # 'ฉ' - 34: 0, # 'ช' - 51: 0, # 'ซ' - 47: 0, # 'à¸' - 58: 0, # 'ฎ' - 57: 0, # 'à¸' - 49: 0, # 'à¸' - 53: 0, # 'ฑ' - 55: 0, # 'ฒ' - 43: 0, # 'ณ' - 20: 0, # 'ด' - 19: 0, # 'ต' - 44: 0, # 'ถ' - 14: 0, # 'ท' - 48: 0, # 'ธ' - 3: 0, # 'น' - 17: 0, # 'บ' - 25: 0, # 'ป' - 39: 0, # 'ผ' - 62: 0, # 'à¸' - 31: 0, # 'พ' - 54: 0, # 'ฟ' - 45: 0, # 'ภ' - 9: 0, # 'ม' - 16: 0, # 'ย' - 2: 0, # 'ร' - 61: 0, # 'ฤ' - 15: 0, # 'ล' - 12: 0, # 'ว' - 42: 0, # 'ศ' - 46: 0, # 'ษ' - 18: 0, # 'ส' - 21: 0, # 'ห' - 4: 0, # 'อ' - 63: 0, # 'ฯ' - 22: 0, # 'ะ' - 10: 0, # 'ั' - 1: 0, # 'า' - 36: 0, # 'ำ' - 23: 0, # 'ิ' - 13: 0, # 'ี' - 40: 0, # 'ึ' - 27: 0, # 'ื' - 32: 0, # 'ุ' - 35: 0, # 'ู' - 11: 0, # 'เ' - 28: 0, # 'à¹' - 41: 0, # 'โ' - 29: 0, # 'ใ' - 33: 0, # 'ไ' - 50: 0, # 'ๆ' - 37: 0, # '็' - 6: 0, # '่' - 7: 0, # '้' - 38: 0, # '์' - 56: 2, # '๑' - 59: 1, # '๒' - 60: 0, # '๕' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# 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 -} - -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/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py deleted file mode 100644 index 43f4230..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py +++ /dev/null @@ -1,4383 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel - - -# 3: Positive -# 2: Likely -# 1: Unlikely -# 0: Negative - -TURKISH_LANG_MODEL = { - 23: { # 'A' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 1, # 'i' - 24: 0, # 'j' - 10: 2, # 'k' - 5: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 37: { # 'B' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 2, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 1, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 47: { # 'C' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 2, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 39: { # 'D' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 29: { # 'E' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 1, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 52: { # 'F' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 1, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 1, # 'c' - 12: 1, # 'd' - 2: 0, # 'e' - 18: 1, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 2, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 2, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 2, # 'ÅŸ' - }, - 36: { # 'G' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 2, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 2, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 1, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 1, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 2, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 45: { # 'H' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 2, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 2, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 2, # 'ÄŸ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 2, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 53: { # 'I' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 1, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 60: { # 'J' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 0, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 16: { # 'K' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 1, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 0, # 'u' - 32: 3, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ÄŸ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 49: { # 'L' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 2, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 2, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 2, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 1, # 'ü' - 30: 1, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 20: { # 'M' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 0, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 46: { # 'N' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 1, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 42: { # 'O' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 2, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 2, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 48: { # 'P' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 2, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 2, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 44: { # 'R' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 1, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 1, # 'ü' - 30: 1, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 1, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 35: { # 'S' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 1, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 2, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 2, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 2, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 31: { # 'T' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 2, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 2, # 'r' - 8: 0, # 's' - 9: 2, # 't' - 14: 2, # 'u' - 32: 1, # 'v' - 57: 1, # 'w' - 58: 1, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 51: { # 'U' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 1, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 38: { # 'V' - 23: 1, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 2, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 1, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 2, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 62: { # 'W' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 43: { # 'Y' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 2, # 'N' - 42: 0, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 1, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 1, # 'Ü' - 59: 1, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 2, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 56: { # 'Z' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 2, # 'Z' - 1: 2, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 1, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 1: { # 'a' - 23: 3, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 2, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 1, # 'î' - 34: 1, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 21: { # 'b' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 3, # 'g' - 25: 1, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 1, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 2, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 28: { # 'c' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 2, # 'E' - 52: 0, # 'F' - 36: 2, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 2, # 'T' - 51: 2, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 3, # 'Y' - 56: 0, # 'Z' - 1: 1, # 'a' - 21: 1, # 'b' - 28: 2, # 'c' - 12: 2, # 'd' - 2: 1, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 1, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 1, # 'î' - 34: 2, # 'ö' - 17: 2, # 'ü' - 30: 2, # 'ÄŸ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 2, # 'ÅŸ' - }, - 12: { # 'd' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 2: { # 'e' - 23: 2, # 'A' - 37: 0, # 'B' - 47: 2, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 18: { # 'f' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 1, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 1, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 27: { # 'g' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 2, # 'r' - 8: 2, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 25: { # 'h' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 3: { # 'i' - 23: 2, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 1, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 3, # 'g' - 25: 1, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 1, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 1, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ÄŸ' - 41: 1, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 24: { # 'j' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 2, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 2, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 10: { # 'k' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 2, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 3, # 'ü' - 30: 1, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 5: { # 'l' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 1, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 1, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 2, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 13: { # 'm' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 2, # 'u' - 32: 2, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 4: { # 'n' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 3, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 3, # 'p' - 7: 2, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 15: { # 'o' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 2, # 'L' - 20: 0, # 'M' - 46: 2, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 2, # 'ÄŸ' - 41: 2, # 'İ' - 6: 3, # 'ı' - 40: 2, # 'Åž' - 19: 2, # 'ÅŸ' - }, - 26: { # 'p' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 2, # 'r' - 8: 1, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 1, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 7: { # 'r' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 1, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 1, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 3, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 8: { # 's' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 2, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 9: { # 't' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 2, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 0, # 'w' - 58: 2, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 14: { # 'u' - 23: 3, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 2, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 3, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 2, # 'Z' - 1: 2, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 2, # 'e' - 18: 2, # 'f' - 27: 3, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 2, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 1, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 32: { # 'v' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 1, # 'k' - 5: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 1, # 'r' - 8: 2, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 57: { # 'w' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 1, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 1, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 1, # 's' - 9: 0, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 2, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 58: { # 'x' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 1, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 2, # 's' - 9: 1, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 11: { # 'y' - 23: 1, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 2, # 'r' - 8: 1, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 3, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 22: { # 'z' - 23: 2, # 'A' - 37: 2, # 'B' - 47: 1, # 'C' - 39: 2, # 'D' - 29: 3, # 'E' - 52: 1, # 'F' - 36: 2, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 2, # 'N' - 42: 2, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 3, # 'T' - 51: 2, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 1, # 'Z' - 1: 1, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 2, # 'd' - 2: 2, # 'e' - 18: 3, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 0, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 3, # 'y' - 22: 2, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 2, # 'Ü' - 59: 1, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 2, # 'ü' - 30: 2, # 'ÄŸ' - 41: 1, # 'İ' - 6: 3, # 'ı' - 40: 1, # 'Åž' - 19: 2, # 'ÅŸ' - }, - 63: { # '·' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 1, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 54: { # 'Ç' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 1, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 0, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 3, # 'i' - 24: 0, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 2, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 2, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 0, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 2, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 50: { # 'Ö' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 2, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 2, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 1, # 'N' - 42: 2, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 1, # 'f' - 27: 1, # 'g' - 25: 1, # 'h' - 3: 2, # 'i' - 24: 0, # 'j' - 10: 2, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 2, # 'p' - 7: 3, # 'r' - 8: 1, # 's' - 9: 2, # 't' - 14: 0, # 'u' - 32: 1, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 2, # 'ü' - 30: 1, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 55: { # 'Ü' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 1, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 1, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 1, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 1, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 1, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 1, # 'İ' - 6: 0, # 'ı' - 40: 0, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 59: { # 'â' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 0, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 2, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 2, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 33: { # 'ç' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 3, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 0, # 'Z' - 1: 0, # 'a' - 21: 3, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 2, # 'f' - 27: 1, # 'g' - 25: 3, # 'h' - 3: 3, # 'i' - 24: 0, # 'j' - 10: 3, # 'k' - 5: 0, # 'l' - 13: 0, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 2, # 's' - 9: 3, # 't' - 14: 0, # 'u' - 32: 2, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 1, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 61: { # 'î' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 0, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 0, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 2, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 1, # 'j' - 10: 0, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 1, # 'n' - 15: 0, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 1, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 1, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 1, # 'î' - 34: 0, # 'ö' - 17: 0, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 1, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 34: { # 'ö' - 23: 0, # 'A' - 37: 1, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 1, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 1, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 2, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 2, # 'h' - 3: 1, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 2, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 0, # 'r' - 8: 3, # 's' - 9: 1, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 1, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 2, # 'ÄŸ' - 41: 1, # 'İ' - 6: 1, # 'ı' - 40: 2, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 17: { # 'ü' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 0, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 1, # 'J' - 16: 1, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 0, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 0, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 0, # 'c' - 12: 1, # 'd' - 2: 3, # 'e' - 18: 1, # 'f' - 27: 2, # 'g' - 25: 0, # 'h' - 3: 1, # 'i' - 24: 1, # 'j' - 10: 2, # 'k' - 5: 3, # 'l' - 13: 2, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 2, # 'p' - 7: 2, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 3, # 'u' - 32: 1, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 2, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 30: { # 'ÄŸ' - 23: 0, # 'A' - 37: 2, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 1, # 'M' - 46: 2, # 'N' - 42: 2, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 0, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 2, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 0, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 2, # 'e' - 18: 0, # 'f' - 27: 0, # 'g' - 25: 0, # 'h' - 3: 0, # 'i' - 24: 3, # 'j' - 10: 1, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 1, # 'o' - 26: 0, # 'p' - 7: 1, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 2, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 2, # 'İ' - 6: 2, # 'ı' - 40: 2, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 41: { # 'İ' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 2, # 'G' - 45: 2, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 0, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 0, # 'Z' - 1: 1, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 2, # 'd' - 2: 1, # 'e' - 18: 0, # 'f' - 27: 3, # 'g' - 25: 2, # 'h' - 3: 2, # 'i' - 24: 2, # 'j' - 10: 2, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 15: 1, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 2, # 't' - 14: 0, # 'u' - 32: 0, # 'v' - 57: 1, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 1, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 1, # 'ö' - 17: 1, # 'ü' - 30: 2, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 1, # 'ÅŸ' - }, - 6: { # 'ı' - 23: 2, # 'A' - 37: 0, # 'B' - 47: 0, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 2, # 'J' - 16: 3, # 'K' - 49: 0, # 'L' - 20: 3, # 'M' - 46: 1, # 'N' - 42: 0, # 'O' - 48: 0, # 'P' - 44: 0, # 'R' - 35: 0, # 'S' - 31: 2, # 'T' - 51: 0, # 'U' - 38: 0, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 1, # 'Z' - 1: 3, # 'a' - 21: 2, # 'b' - 28: 1, # 'c' - 12: 3, # 'd' - 2: 3, # 'e' - 18: 3, # 'f' - 27: 3, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 3, # 'j' - 10: 3, # 'k' - 5: 3, # 'l' - 13: 3, # 'm' - 4: 3, # 'n' - 15: 0, # 'o' - 26: 3, # 'p' - 7: 3, # 'r' - 8: 3, # 's' - 9: 3, # 't' - 14: 3, # 'u' - 32: 3, # 'v' - 57: 1, # 'w' - 58: 1, # 'x' - 11: 3, # 'y' - 22: 0, # 'z' - 63: 1, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 2, # 'ç' - 61: 0, # 'î' - 34: 0, # 'ö' - 17: 3, # 'ü' - 30: 0, # 'ÄŸ' - 41: 0, # 'İ' - 6: 3, # 'ı' - 40: 0, # 'Åž' - 19: 0, # 'ÅŸ' - }, - 40: { # 'Åž' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 1, # 'D' - 29: 1, # 'E' - 52: 0, # 'F' - 36: 1, # 'G' - 45: 2, # 'H' - 53: 1, # 'I' - 60: 0, # 'J' - 16: 0, # 'K' - 49: 0, # 'L' - 20: 2, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 2, # 'P' - 44: 2, # 'R' - 35: 1, # 'S' - 31: 1, # 'T' - 51: 0, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 2, # 'Y' - 56: 1, # 'Z' - 1: 0, # 'a' - 21: 2, # 'b' - 28: 0, # 'c' - 12: 2, # 'd' - 2: 0, # 'e' - 18: 3, # 'f' - 27: 0, # 'g' - 25: 2, # 'h' - 3: 3, # 'i' - 24: 2, # 'j' - 10: 1, # 'k' - 5: 0, # 'l' - 13: 1, # 'm' - 4: 3, # 'n' - 15: 2, # 'o' - 26: 0, # 'p' - 7: 3, # 'r' - 8: 2, # 's' - 9: 2, # 't' - 14: 1, # 'u' - 32: 3, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 2, # 'y' - 22: 0, # 'z' - 63: 0, # '·' - 54: 0, # 'Ç' - 50: 0, # 'Ö' - 55: 1, # 'Ü' - 59: 0, # 'â' - 33: 0, # 'ç' - 61: 0, # 'î' - 34: 2, # 'ö' - 17: 1, # 'ü' - 30: 2, # 'ÄŸ' - 41: 0, # 'İ' - 6: 2, # 'ı' - 40: 1, # 'Åž' - 19: 2, # 'ÅŸ' - }, - 19: { # 'ÅŸ' - 23: 0, # 'A' - 37: 0, # 'B' - 47: 1, # 'C' - 39: 0, # 'D' - 29: 0, # 'E' - 52: 2, # 'F' - 36: 1, # 'G' - 45: 0, # 'H' - 53: 0, # 'I' - 60: 0, # 'J' - 16: 3, # 'K' - 49: 2, # 'L' - 20: 0, # 'M' - 46: 1, # 'N' - 42: 1, # 'O' - 48: 1, # 'P' - 44: 1, # 'R' - 35: 1, # 'S' - 31: 0, # 'T' - 51: 1, # 'U' - 38: 1, # 'V' - 62: 0, # 'W' - 43: 1, # 'Y' - 56: 0, # 'Z' - 1: 3, # 'a' - 21: 1, # 'b' - 28: 2, # 'c' - 12: 0, # 'd' - 2: 3, # 'e' - 18: 0, # 'f' - 27: 2, # 'g' - 25: 1, # 'h' - 3: 1, # 'i' - 24: 0, # 'j' - 10: 2, # 'k' - 5: 2, # 'l' - 13: 3, # 'm' - 4: 0, # 'n' - 15: 0, # 'o' - 26: 1, # 'p' - 7: 3, # 'r' - 8: 0, # 's' - 9: 0, # 't' - 14: 3, # 'u' - 32: 0, # 'v' - 57: 0, # 'w' - 58: 0, # 'x' - 11: 0, # 'y' - 22: 2, # 'z' - 63: 0, # '·' - 54: 1, # 'Ç' - 50: 2, # 'Ö' - 55: 0, # 'Ü' - 59: 0, # 'â' - 33: 1, # 'ç' - 61: 1, # 'î' - 34: 2, # 'ö' - 17: 0, # 'ü' - 30: 1, # 'ÄŸ' - 41: 1, # 'İ' - 6: 1, # 'ı' - 40: 1, # 'Åž' - 19: 1, # 'ÅŸ' - }, -} - -# 255: Undefined characters that did not exist in training text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 -# 251: Control characters - -# 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, # 'ÿ' -} - -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/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py deleted file mode 100644 index 7d1e8c2..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# 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 - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( -# UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - super(Latin1Prober, self).__init__() - self._last_char_class = None - self._freq_counter = None - self.reset() - - def reset(self): - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - @property - def charset_name(self): - return "ISO-8859-1" - - @property - def language(self): - return "" - - def feed(self, byte_str): - byte_str = self.filter_with_english_letters(byte_str) - for c in byte_str: - char_class = Latin1_CharToClass[c] - freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) - + char_class] - if freq == 0: - self._state = ProbingState.NOT_ME - break - self._freq_counter[freq] += 1 - self._last_char_class = char_class - - return self.state - - def get_confidence(self): - if self.state == ProbingState.NOT_ME: - 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 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.73 - return confidence diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py deleted file mode 100644 index 6256ecf..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# 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, MachineState - - -class MultiByteCharSetProber(CharSetProber): - """ - MultiByteCharSetProber - """ - - def __init__(self, lang_filter=None): - super(MultiByteCharSetProber, self).__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() - if self.coding_sm: - self.coding_sm.reset() - if self.distribution_analyzer: - self.distribution_analyzer.reset() - self._last_char = [0, 0] - - @property - def charset_name(self): - raise NotImplementedError - - @property - def language(self): - raise NotImplementedError - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - 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: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.distribution_analyzer.feed(self._last_char, char_len) - else: - 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)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - return self.distribution_analyzer.get_confidence() diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py deleted file mode 100644 index 530abe7..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,54 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# 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 .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 .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self, lang_filter=None): - super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) - self.probers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py b/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py deleted file mode 100644 index 8360d0f..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py +++ /dev/null @@ -1,572 +0,0 @@ -######################## 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): -# 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 ######################### - -from .enums import MachineState - -# BIG5 - -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 -) - -BIG5_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - 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 -) - -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'} - -# CP949 - -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 -) - -CP949_ST = ( -#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR - 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.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 - 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 -) - -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'} - -# EUC-JP - -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 -) - -EUCJP_ST = ( - 3, 4, 3, 5,MachineState.START,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.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - 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 -) - -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'} - -# EUC-KR - -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 -) - -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 -) - -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'} - -# EUC-TW - -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 -) - -EUCTW_ST = ( - MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 - MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - 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 -) - -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'} - -# GB2312 - -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 -) - -GB2312_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 - 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - 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 -) - -# 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 -# it is used for frequency analysis only, and we are validating -# each code range there as well. So it is safe to set it to be -# 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'} - -# Shift_JIS - -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 - #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 - - -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 -) - -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'} - -# UCS2-BE - -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 -) - -UCS2BE_ST = ( - 5, 7, 7,MachineState.ERROR, 4, 3,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, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 - 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 - 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 -) - -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'} - -# UCS2-LE - -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 -) - -UCS2LE_ST = ( - 6, 6, 7, 6, 4, 3,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, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 - 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 -) - -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'} - -# UTF-8 - -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 -) - -UTF8_ST = ( - MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f - MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f - MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f - MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f - MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af - MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf - 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 -) - -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'} diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py b/venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py b/venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py deleted file mode 100644 index 3237d5a..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py +++ /dev/null @@ -1,310 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -Metadata about languages used by our model training code for our -SingleByteCharSetProbers. Could be used for other things in the future. - -This code is based on the language metadata from the uchardet project. -""" -from __future__ import absolute_import, print_function - -from string import ascii_letters - - -# TODO: Add Ukranian (KOI8-U) - -class Language(object): - """Metadata about a language useful for training models - - :ivar name: The human name for the language, in English. - :type name: str - :ivar iso_code: 2-letter ISO 639-1 if possible, 3-letter ISO code otherwise, - or use another catalog as a last resort. - :type iso_code: str - :ivar use_ascii: Whether or not ASCII letters should be included in trained - models. - :type use_ascii: bool - :ivar charsets: The charsets we want to support and create data for. - :type charsets: list of str - :ivar alphabet: The characters in the language's alphabet. If `use_ascii` is - `True`, you only need to add those not in the ASCII set. - :type alphabet: str - :ivar wiki_start_pages: The Wikipedia pages to start from if we're crawling - Wikipedia for training data. - :type wiki_start_pages: list of str - """ - def __init__(self, name=None, iso_code=None, use_ascii=True, charsets=None, - alphabet=None, wiki_start_pages=None): - super(Language, self).__init__() - self.name = name - self.iso_code = iso_code - self.use_ascii = use_ascii - self.charsets = charsets - if self.use_ascii: - if alphabet: - alphabet += ascii_letters - else: - alphabet = ascii_letters - elif not alphabet: - raise ValueError('Must supply alphabet if use_ascii is False') - self.alphabet = ''.join(sorted(set(alphabet))) if alphabet else None - self.wiki_start_pages = wiki_start_pages - - def __repr__(self): - return '{}({})'.format(self.__class__.__name__, - ', '.join('{}={!r}'.format(k, v) - for k, v in self.__dict__.items() - if not k.startswith('_'))) - - -LANGUAGES = {'Arabic': Language(name='Arabic', - iso_code='ar', - use_ascii=False, - # We only support encodings that use isolated - # forms, because the current recommendation is - # that the rendering system handles presentation - # forms. This means we purposefully skip IBM864. - charsets=['ISO-8859-6', 'WINDOWS-1256', - 'CP720', 'CP864'], - alphabet=u'ءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـÙقكلمنهوىيًٌÙÙŽÙÙÙ‘', - wiki_start_pages=[u'Ø§Ù„ØµÙØ­Ø©_الرئيسية']), - 'Belarusian': Language(name='Belarusian', - iso_code='be', - use_ascii=False, - charsets=['ISO-8859-5', 'WINDOWS-1251', - 'IBM866', 'MacCyrillic'], - alphabet=(u'ÐБВГДЕÐЖЗІЙКЛМÐОПРСТУЎФХЦЧШЫЬЭЮЯ' - u'абвгдеёжзійклмнопрÑтуўфхцчшыьÑÑŽÑʼ'), - wiki_start_pages=[u'ГалоўнаÑ_Ñтаронка']), - 'Bulgarian': Language(name='Bulgarian', - iso_code='bg', - use_ascii=False, - charsets=['ISO-8859-5', 'WINDOWS-1251', - 'IBM855'], - alphabet=(u'ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯ' - u'абвгдежзийклмнопрÑтуфхцчшщъьюÑ'), - wiki_start_pages=[u'Ðачална_Ñтраница']), - 'Czech': Language(name='Czech', - iso_code='cz', - use_ascii=True, - charsets=['ISO-8859-2', 'WINDOWS-1250'], - alphabet=u'áÄÄéěíňóřšťúůýžÃČĎÉĚÃŇÓŘŠŤÚŮÃŽ', - wiki_start_pages=[u'Hlavní_strana']), - 'Danish': Language(name='Danish', - iso_code='da', - use_ascii=True, - charsets=['ISO-8859-1', 'ISO-8859-15', - 'WINDOWS-1252'], - alphabet=u'æøåÆØÅ', - wiki_start_pages=[u'Forside']), - 'German': Language(name='German', - iso_code='de', - use_ascii=True, - charsets=['ISO-8859-1', 'WINDOWS-1252'], - alphabet=u'äöüßÄÖÜ', - wiki_start_pages=[u'Wikipedia:Hauptseite']), - 'Greek': Language(name='Greek', - iso_code='el', - use_ascii=False, - charsets=['ISO-8859-7', 'WINDOWS-1253'], - alphabet=(u'αβγδεζηθικλμνξοπÏσςτυφχψωάέήίόÏÏŽ' - u'ΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΌΎÎ'), - wiki_start_pages=[u'ΠÏλη:ΚÏÏια']), - 'English': Language(name='English', - iso_code='en', - use_ascii=True, - charsets=['ISO-8859-1', 'WINDOWS-1252'], - wiki_start_pages=[u'Main_Page']), - 'Esperanto': Language(name='Esperanto', - iso_code='eo', - # Q, W, X, and Y not used at all - use_ascii=False, - charsets=['ISO-8859-3'], - alphabet=(u'abcĉdefgÄhÄ¥ijĵklmnoprsÅtuÅ­vz' - u'ABCĈDEFGÄœHĤIJÄ´KLMNOPRSÅœTUŬVZ'), - wiki_start_pages=[u'Vikipedio:ĈefpaÄo']), - 'Spanish': Language(name='Spanish', - iso_code='es', - use_ascii=True, - charsets=['ISO-8859-1', 'ISO-8859-15', - 'WINDOWS-1252'], - alphabet=u'ñáéíóúüÑÃÉÃÓÚÜ', - wiki_start_pages=[u'Wikipedia:Portada']), - 'Estonian': Language(name='Estonian', - iso_code='et', - use_ascii=False, - charsets=['ISO-8859-4', 'ISO-8859-13', - 'WINDOWS-1257'], - # C, F, Å , Q, W, X, Y, Z, Ž are only for - # loanwords - alphabet=(u'ABDEGHIJKLMNOPRSTUVÕÄÖÜ' - u'abdeghijklmnoprstuvõäöü'), - wiki_start_pages=[u'Esileht']), - 'Finnish': Language(name='Finnish', - iso_code='fi', - use_ascii=True, - charsets=['ISO-8859-1', 'ISO-8859-15', - 'WINDOWS-1252'], - alphabet=u'ÅÄÖŠŽåäöšž', - wiki_start_pages=[u'Wikipedia:Etusivu']), - 'French': Language(name='French', - iso_code='fr', - use_ascii=True, - charsets=['ISO-8859-1', 'ISO-8859-15', - 'WINDOWS-1252'], - alphabet=u'œàâçèéîïùûêŒÀÂÇÈÉÎÃÙÛÊ', - wiki_start_pages=[u'Wikipédia:Accueil_principal', - u'BÅ“uf (animal)']), - 'Hebrew': Language(name='Hebrew', - iso_code='he', - use_ascii=False, - charsets=['ISO-8859-8', 'WINDOWS-1255'], - alphabet=u'×בגדהוזחטיךכל×מןנסעףפץצקרשתװױײ', - wiki_start_pages=[u'עמוד_ר×שי']), - 'Croatian': Language(name='Croatian', - iso_code='hr', - # Q, W, X, Y are only used for foreign words. - use_ascii=False, - charsets=['ISO-8859-2', 'WINDOWS-1250'], - alphabet=(u'abcÄćdÄ‘efghijklmnoprsÅ¡tuvzž' - u'ABCČĆDÄEFGHIJKLMNOPRSÅ TUVZŽ'), - wiki_start_pages=[u'Glavna_stranica']), - 'Hungarian': Language(name='Hungarian', - iso_code='hu', - # Q, W, X, Y are only used for foreign words. - use_ascii=False, - charsets=['ISO-8859-2', 'WINDOWS-1250'], - alphabet=(u'abcdefghijklmnoprstuvzáéíóöőúüű' - u'ABCDEFGHIJKLMNOPRSTUVZÃÉÃÓÖÅÚÜŰ'), - wiki_start_pages=[u'KezdÅ‘lap']), - 'Italian': Language(name='Italian', - iso_code='it', - use_ascii=True, - charsets=['ISO-8859-1', 'ISO-8859-15', - 'WINDOWS-1252'], - alphabet=u'ÀÈÉÌÒÓÙàèéìòóù', - wiki_start_pages=[u'Pagina_principale']), - 'Lithuanian': Language(name='Lithuanian', - iso_code='lt', - use_ascii=False, - charsets=['ISO-8859-13', 'WINDOWS-1257', - 'ISO-8859-4'], - # Q, W, and X not used at all - alphabet=(u'AÄ„BCÄŒDEĘĖFGHIÄ®YJKLMNOPRSÅ TUŲŪVZŽ' - u'aÄ…bcÄdeęėfghiįyjklmnoprsÅ¡tuųūvzž'), - wiki_start_pages=[u'Pagrindinis_puslapis']), - 'Latvian': Language(name='Latvian', - iso_code='lv', - use_ascii=False, - charsets=['ISO-8859-13', 'WINDOWS-1257', - 'ISO-8859-4'], - # Q, W, X, Y are only for loanwords - alphabet=(u'AÄ€BCÄŒDEÄ’FGÄ¢HIĪJKĶLÄ»MNÅ…OPRSÅ TUŪVZŽ' - u'aÄbcÄdeÄ“fgÄ£hiÄ«jkÄ·lļmnņoprsÅ¡tuÅ«vzž'), - wiki_start_pages=[u'SÄkumlapa']), - 'Macedonian': Language(name='Macedonian', - iso_code='mk', - use_ascii=False, - charsets=['ISO-8859-5', 'WINDOWS-1251', - 'MacCyrillic', 'IBM855'], - alphabet=(u'ÐБВГДЃЕЖЗЅИЈКЛЉМÐЊОПРСТЌУФХЦЧÐШ' - u'абвгдѓежзѕијклљмнњопрÑтќуфхцчџш'), - wiki_start_pages=[u'Главна_Ñтраница']), - 'Dutch': Language(name='Dutch', - iso_code='nl', - use_ascii=True, - charsets=['ISO-8859-1', 'WINDOWS-1252'], - wiki_start_pages=[u'Hoofdpagina']), - 'Polish': Language(name='Polish', - iso_code='pl', - # Q and X are only used for foreign words. - use_ascii=False, - charsets=['ISO-8859-2', 'WINDOWS-1250'], - alphabet=(u'AÄ„BCĆDEĘFGHIJKLÅMNŃOÓPRSÅšTUWYZŹŻ' - u'aÄ…bcćdeÄ™fghijklÅ‚mnÅ„oóprsÅ›tuwyzźż'), - wiki_start_pages=[u'Wikipedia:Strona_główna']), - 'Portuguese': Language(name='Portuguese', - iso_code='pt', - use_ascii=True, - charsets=['ISO-8859-1', 'ISO-8859-15', - 'WINDOWS-1252'], - alphabet=u'ÃÂÃÀÇÉÊÃÓÔÕÚáâãàçéêíóôõú', - wiki_start_pages=[u'Wikipédia:Página_principal']), - 'Romanian': Language(name='Romanian', - iso_code='ro', - use_ascii=True, - charsets=['ISO-8859-2', 'WINDOWS-1250'], - alphabet=u'ăâîșțĂÂÎȘȚ', - wiki_start_pages=[u'Pagina_principală']), - 'Russian': Language(name='Russian', - iso_code='ru', - use_ascii=False, - charsets=['ISO-8859-5', 'WINDOWS-1251', - 'KOI8-R', 'MacCyrillic', 'IBM866', - 'IBM855'], - alphabet=(u'абвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑ' - u'ÐБВГДЕÐЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯ'), - wiki_start_pages=[u'ЗаглавнаÑ_Ñтраница']), - 'Slovak': Language(name='Slovak', - iso_code='sk', - use_ascii=True, - charsets=['ISO-8859-2', 'WINDOWS-1250'], - alphabet=u'áäÄÄéíĺľňóôŕšťúýžÃÄČĎÉÃĹĽŇÓÔŔŠŤÚÃŽ', - wiki_start_pages=[u'Hlavná_stránka']), - 'Slovene': Language(name='Slovene', - iso_code='sl', - # Q, W, X, Y are only used for foreign words. - use_ascii=False, - charsets=['ISO-8859-2', 'WINDOWS-1250'], - alphabet=(u'abcÄdefghijklmnoprsÅ¡tuvzž' - u'ABCÄŒDEFGHIJKLMNOPRSÅ TUVZŽ'), - wiki_start_pages=[u'Glavna_stran']), - # Serbian can be written in both Latin and Cyrillic, but there's no - # simple way to get the Latin alphabet pages from Wikipedia through - # the API, so for now we just support Cyrillic. - 'Serbian': Language(name='Serbian', - iso_code='sr', - alphabet=(u'ÐБВГДЂЕЖЗИЈКЛЉМÐЊОПРСТЋУФХЦЧÐШ' - u'абвгдђежзијклљмнњопрÑтћуфхцчџш'), - charsets=['ISO-8859-5', 'WINDOWS-1251', - 'MacCyrillic', 'IBM855'], - wiki_start_pages=[u'Главна_Ñтрана']), - 'Thai': Language(name='Thai', - iso_code='th', - use_ascii=False, - charsets=['ISO-8859-11', 'TIS-620', 'CP874'], - alphabet=u'à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸ºà¸¸à¸¹à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛', - wiki_start_pages=[u'หน้าหลัà¸']), - 'Turkish': Language(name='Turkish', - iso_code='tr', - # Q, W, and X are not used by Turkish - use_ascii=False, - charsets=['ISO-8859-3', 'ISO-8859-9', - 'WINDOWS-1254'], - alphabet=(u'abcçdefgÄŸhıijklmnoöprsÅŸtuüvyzâîû' - u'ABCÇDEFGÄžHIİJKLMNOÖPRSÅžTUÜVYZÂÎÛ'), - wiki_start_pages=[u'Ana_Sayfa']), - 'Vietnamese': Language(name='Vietnamese', - iso_code='vi', - use_ascii=False, - # Windows-1258 is the only common 8-bit - # Vietnamese encoding supported by Python. - # From Wikipedia: - # For systems that lack support for Unicode, - # dozens of 8-bit Vietnamese code pages are - # available.[1] The most common are VISCII - # (TCVN 5712:1993), VPS, and Windows-1258.[3] - # Where ASCII is required, such as when - # ensuring readability in plain text e-mail, - # Vietnamese letters are often encoded - # according to Vietnamese Quoted-Readable - # (VIQR) or VSCII Mnemonic (VSCII-MNEM),[4] - # though usage of either variable-width - # scheme has declined dramatically following - # the adoption of Unicode on the World Wide - # Web. - charsets=['WINDOWS-1258'], - alphabet=(u'aăâbcdÄ‘eêghiklmnoôơpqrstuưvxy' - u'AĂÂBCDÄEÊGHIKLMNOÔƠPQRSTUƯVXY'), - wiki_start_pages=[u'Chữ_Quốc_ngữ']), - } diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py deleted file mode 100644 index 46ba835..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# 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 collections import namedtuple - -from .charsetprober import CharSetProber -from .enums import CharacterCategory, ProbingState, SequenceLikelihood - - -SingleByteCharSetModel = namedtuple('SingleByteCharSetModel', - ['charset_name', - 'language', - 'char_to_order_map', - 'language_model', - 'typical_positive_ratio', - 'keep_ascii_letters', - 'alphabet']) - - -class SingleByteCharSetProber(CharSetProber): - SAMPLE_SIZE = 64 - SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 - POSITIVE_SHORTCUT_THRESHOLD = 0.95 - NEGATIVE_SHORTCUT_THRESHOLD = 0.05 - - def __init__(self, model, reversed=False, name_prober=None): - super(SingleByteCharSetProber, self).__init__() - self._model = model - # TRUE if we need to reverse every pair in the model lookup - self._reversed = reversed - # Optional auxiliary prober for name decision - self._name_prober = name_prober - self._last_order = None - self._seq_counters = None - self._total_seqs = None - self._total_char = None - self._freq_char = None - self.reset() - - def reset(self): - super(SingleByteCharSetProber, self).reset() - # char order of last character - self._last_order = 255 - self._seq_counters = [0] * SequenceLikelihood.get_num_categories() - self._total_seqs = 0 - self._total_char = 0 - # characters that fall in our sampling range - self._freq_char = 0 - - @property - def charset_name(self): - if self._name_prober: - return self._name_prober.charset_name - else: - return self._model.charset_name - - @property - def language(self): - if self._name_prober: - return self._name_prober.language - else: - return self._model.language - - def feed(self, byte_str): - # TODO: Make filter_international_words keep things in self.alphabet - if not self._model.keep_ascii_letters: - byte_str = self.filter_international_words(byte_str) - if not byte_str: - return self.state - char_to_order_map = self._model.char_to_order_map - language_model = self._model.language_model - for char in byte_str: - order = char_to_order_map.get(char, CharacterCategory.UNDEFINED) - # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but - # CharacterCategory.SYMBOL is actually 253, so we use CONTROL - # to make it closer to the original intent. The only difference - # is whether or not we count digits and control characters for - # _total_char purposes. - if order < CharacterCategory.CONTROL: - self._total_char += 1 - # TODO: Follow uchardet's lead and discount confidence for frequent - # control characters. - # See https://github.com/BYVoid/uchardet/commit/55b4f23971db61 - if order < self.SAMPLE_SIZE: - self._freq_char += 1 - if self._last_order < self.SAMPLE_SIZE: - self._total_seqs += 1 - if not self._reversed: - lm_cat = language_model[self._last_order][order] - else: - lm_cat = language_model[order][self._last_order] - self._seq_counters[lm_cat] += 1 - self._last_order = order - - charset_name = self._model.charset_name - if self.state == ProbingState.DETECTING: - if self._total_seqs > 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._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._state = ProbingState.NOT_ME - - return self.state - - 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 = r * self._freq_char / self._total_char - if r >= 1.0: - r = 0.99 - return r diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py deleted file mode 100644 index bdeef4e..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,83 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# 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 .charsetgroupprober import CharSetGroupProber -from .hebrewprober import HebrewProber -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 .langthaimodel import TIS_620_THAI_MODEL -from .langturkishmodel import ISO_8859_9_TURKISH_MODEL -from .sbcharsetprober import SingleByteCharSetProber - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - super(SBCSGroupProber, self).__init__() - hebrew_prober = HebrewProber() - logical_hebrew_prober = SingleByteCharSetProber(WINDOWS_1255_HEBREW_MODEL, - False, 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) - # 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 - # order not matter here, because that is very counter-intuitive. - self.probers = [ - SingleByteCharSetProber(WINDOWS_1251_RUSSIAN_MODEL), - SingleByteCharSetProber(KOI8_R_RUSSIAN_MODEL), - SingleByteCharSetProber(ISO_8859_5_RUSSIAN_MODEL), - SingleByteCharSetProber(MACCYRILLIC_RUSSIAN_MODEL), - SingleByteCharSetProber(IBM866_RUSSIAN_MODEL), - SingleByteCharSetProber(IBM855_RUSSIAN_MODEL), - SingleByteCharSetProber(ISO_8859_7_GREEK_MODEL), - SingleByteCharSetProber(WINDOWS_1253_GREEK_MODEL), - SingleByteCharSetProber(ISO_8859_5_BULGARIAN_MODEL), - SingleByteCharSetProber(WINDOWS_1251_BULGARIAN_MODEL), - # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) - # after we retrain model. - # SingleByteCharSetProber(ISO_8859_2_HUNGARIAN_MODEL), - # SingleByteCharSetProber(WINDOWS_1250_HUNGARIAN_MODEL), - SingleByteCharSetProber(TIS_620_THAI_MODEL), - SingleByteCharSetProber(ISO_8859_9_TURKISH_MODEL), - hebrew_prober, - logical_hebrew_prober, - visual_hebrew_prober, - ] - self.reset() diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py deleted file mode 100644 index 9e29623..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## 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): -# 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 ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJIS_SM_MODEL -from .enums import ProbingState, MachineState - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - super(SJISProber, self).__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() - self.context_analyzer.reset() - - @property - def charset_name(self): - return self.context_analyzer.charset_name - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - 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: - self._state = ProbingState.FOUND_IT - break - elif 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.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._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)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py b/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py deleted file mode 100644 index 055a8ac..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py +++ /dev/null @@ -1,286 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# 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 ######################### -""" -Module containing the UniversalDetector detector class, which is the primary -class a user of ``chardet`` should use. - -:author: Mark Pilgrim (initial port to Python) -:author: Shy Shalom (original C code) -:author: Dan Blanchard (major refactoring for 3.0) -:author: Ian Cordasco -""" - - -import codecs -import logging -import re - -from .charsetgroupprober import CharSetGroupProber -from .enums import InputState, LanguageFilter, ProbingState -from .escprober import EscCharSetProber -from .latin1prober import Latin1Prober -from .mbcsgroupprober import MBCSGroupProber -from .sbcsgroupprober import SBCSGroupProber - - -class UniversalDetector(object): - """ - The ``UniversalDetector`` class underlies the ``chardet.detect`` function - and coordinates all of the different charset probers. - - To get a ``dict`` containing an encoding and its confidence, you can simply - run: - - .. code:: - - u = UniversalDetector() - u.feed(some_bytes) - u.close() - detected = u.result - - """ - - 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'} - - def __init__(self, lang_filter=LanguageFilter.ALL): - self._esc_charset_prober = None - self._charset_probers = [] - self.result = None - self.done = None - self._got_data = None - self._input_state = None - self._last_char = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - self._has_win_bytes = None - self.reset() - - 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.done = False - self._got_data = False - self._has_win_bytes = False - self._input_state = InputState.PURE_ASCII - self._last_char = b'' - if self._esc_charset_prober: - self._esc_charset_prober.reset() - for prober in self._charset_probers: - prober.reset() - - def feed(self, byte_str): - """ - Takes a chunk of a document and feeds it through all of the relevant - charset probers. - - After calling ``feed``, you can check the value of the ``done`` - attribute to see if you need to continue feeding the - ``UniversalDetector`` more data, or if it has made a prediction - (in the ``result`` attribute). - - .. note:: - You should always call ``close`` when you're done feeding in your - document if ``done`` is not already ``True``. - """ - if self.done: - return - - if not len(byte_str): - return - - if not isinstance(byte_str, bytearray): - byte_str = bytearray(byte_str) - - # First check for known BOMs, since these are guaranteed to be correct - if not self._got_data: - # 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)): - # 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'): - # 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'): - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - 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._got_data = True - if self.result['encoding'] is not None: - self.done = True - return - - # If none of those matched and we've only see ASCII so far, check - # for high bytes and escape sequences - 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): - self._input_state = InputState.ESC_ASCII - - self._last_char = byte_str[-1:] - - # 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 - # use such sequences. - if self._input_state == InputState.ESC_ASCII: - 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.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 - # single-byte probers that are left. The single-byte probers - # use character bigram distributions to determine the encoding, whereas - # the multi-byte probers use a combination of character unigram and - # bigram distributions. - elif self._input_state == InputState.HIGH_BYTE: - if not self._charset_probers: - self._charset_probers = [MBCSGroupProber(self.lang_filter)] - # If we're checking non-CJK encodings, use single-byte prober - if self.lang_filter & LanguageFilter.NON_CJK: - self._charset_probers.append(SBCSGroupProber()) - 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.done = True - break - if self.WIN_BYTE_DETECTOR.search(byte_str): - self._has_win_bytes = True - - def close(self): - """ - Stop analyzing the current document and come up with a final - prediction. - - :returns: The ``result`` attribute, a ``dict`` with the keys - `encoding`, `confidence`, and `language`. - """ - # Don't bother with checks if we're already done - if self.done: - return self.result - self.done = True - - if not self._got_data: - 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': ''} - - # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD - elif self._input_state == InputState.HIGH_BYTE: - prober_confidence = None - max_prober_confidence = 0.0 - max_prober = None - for prober in self._charset_probers: - if not prober: - continue - prober_confidence = prober.get_confidence() - if prober_confidence > max_prober_confidence: - max_prober_confidence = prober_confidence - max_prober = prober - if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): - charset_name = max_prober.charset_name - lower_charset_name = max_prober.charset_name.lower() - 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 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} - - # 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') - 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()) - else: - self.logger.debug('%s %s confidence = %s', - group_prober.charset_name, - group_prober.language, - group_prober.get_confidence()) - return self.result diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py deleted file mode 100644 index 6c3196c..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py +++ /dev/null @@ -1,82 +0,0 @@ -######################## 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): -# 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 ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState, MachineState -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8_SM_MODEL - - - -class UTF8Prober(CharSetProber): - ONE_CHAR_PROB = 0.5 - - def __init__(self): - super(UTF8Prober, self).__init__() - self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) - self._num_mb_chars = None - self.reset() - - def reset(self): - super(UTF8Prober, self).reset() - self.coding_sm.reset() - self._num_mb_chars = 0 - - @property - def charset_name(self): - return "utf-8" - - @property - def language(self): - return "" - - def feed(self, byte_str): - for c in byte_str: - coding_state = self.coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - if self.coding_sm.get_current_charlen() >= 2: - self._num_mb_chars += 1 - - if self.state == ProbingState.DETECTING: - if self.get_confidence() > self.SHORTCUT_THRESHOLD: - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - unlike = 0.99 - if self._num_mb_chars < 6: - unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars - return 1.0 - unlike - else: - return unlike diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/version.py b/venv/Lib/site-packages/pip/_vendor/chardet/version.py deleted file mode 100644 index 70369b9..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/version.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -This module exists only to simplify retrieving the version number of chardet -from within setup.py and from chardet subpackages. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -__version__ = "4.0.0" -VERSION = __version__.split('.') diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py b/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py deleted file mode 100644 index b149ed7..0000000 --- a/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from .initialise import init, deinit, reinit, colorama_text -from .ansi import Fore, Back, Style, Cursor -from .ansitowin32 import AnsiToWin32 - -__version__ = '0.4.4' diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index e0607443cbe4a710520b75283da744bb46eeae1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmYk2Jx{|h5QgK#NzA?Sn<;(KH%5|U-fGPM<~+HtVcLitDhC9h0O>`eHm zkT}WD`9A#W&b+QCNwjCZ&%dJofZ)HSF*uLMUq^^UAe|UQkV#2uGLjigFoJxlb5oGQ zjL688q%>nP{>^84Vk%O_J0??+FOsJCL{X~20jo|8p%8NC-OkrbtF7aPvq8QN&~|H` z4ET~SS0P^vTP;IzwRYaR28HUP^XlF{sP6daEkB&iXY;$JCKHfUTq`dfY~V5g2ILU| z^Z3ja5RU*QU>rdzs0{W61RZ=$s2JNw=auakdrw>qt$=TFb3%pONNs!CJKM&gjp|z3 zZ-=MY+^T`L+(_nozLaz$yA9Rqkw$rW5K}AON>6*$)2QDG>*(L+lrfl}v01+j<*Bh^ Qt>qc);bG)Gw1=kY59lL#l>h($ diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc deleted file mode 100644 index 8a4dba090dba593ac560f6b40765537b36ecfd54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3227 zcmc&$OK;mo5ayDUL{U#Gj@=|htG>{vZDceBdPs`ElB_sx6xon$xM7qsjCLb4ktJoh zc51@`3OGL`J^C;0wI}|CoI10#99g!}!k3cRk2^cdnVl!;Wiqw~*X#c0o=j@m-$+be zCJ>7-g7*Mab2LgELUl){hGS5Z#@=a;N#isD&lvrLCaL|7IB|N7rf3>wiDivuX!e~( zv&=d)oFvdWng=?sXdCDmS^&DhlE6;^eTB{fJ*((6&{ydk&~u8;u+*XEWLX+8$1;F< zW&_U9`LM7!`J&VFwwW7@ye{kPvcYbr??3MZ zzF@at>6O=GL1*NTIxg_&kav{L-nQ5A27zB5?a2(PbH&g_PX%c_st%wL4!NP7u?Kk* z_MjaH+C12GY|p-a`)&ygT5Z>)QLQ(?pqTJQpDBAHut0`P228k$lLKed%tWdE5=UoUuV+LM6^Gq3xm4#xbnZrrD9IzCU1BClt-1A{eJG zv~>|ifLx|Qp=nTPP;O9M1~ni@Oqr}etZHCWaO#|BZ5&1oU;i0EKqwB$lJ@lGTXI0& z6H5LffhF_wLX;7a_I}jch!5d#}$wZF{PY5m( z5G$Ohlqea}3|Rk#GzXA*GPdjWcg}d*a$SGm3)j7lhr@ttW}4V=?-x$2DUUZb!AN)m z<+-l3T{o&_n5SL$^^Vt%IQ%mZGvREk5RS4ry7?Lml|~j(^ch#9zZP-RJ%AHeXDIYF z=voHNs@_JRx8+oKBhcOQ)S^k%-DapwQ`p^T8iG=gwlZUf2SXlWp?5Ko;|u4gPKD;A z^2t=?SE7W~`3=}A$zZ}XRU-Pv+Bd*Cu8sZ7M~&r;wM*!$Mk$Ljr&XCttDDVlCzRzT zlp*gD>S`COOWa>=ZB|-Kr3sBuUMPo_kJ*<{x^%Hpvs$S={C+~?q>aeyV#vl9&QC)4 zDG;i8L*+!x8ya~OPF*!Vqxpf{mE?iaUNVj&`iCTY)1EfgR@=8g+&HS)2}c8~St9%^ zV4wfc6))Og@y}r&FCu(_fZ^llQI1A(RKjl~s5o@tw%S<^)8H4 z7v}dOj9?Amq;jxkbf^{s>coWae++6P?pQS8B&p@tH0h+M?WAeS$V|7!S)y76$CLUFm>&^9wG;5D5 zO&QyKu(Dp4u~xlZUzeH2%JPGCCBm)$CR2(8QAk8QB@)T3;zgp7P9MLzQAaALsAE+h z*{Bk!NS0C!5r&l=c|9`?;g};&TCa4cFMZ@n9Fi*oD5HMN8 zGQt7^niNt5hVTNRhp>gSmz;nH`35;bJ|J6IV|6=c86Sz3}A(7+Jm%1(X z;CBZTmS+LNIRqG5vy_-l#CWxZxg?FHl}9q(Tx~t7G-OhxnOkWz&b127$6QyR)p5)@ zu43~*mE%W2CR~>eyROUer=DZ2^Ati70e`kQ{{C?M`H=D9^OvkE)W=ix0hKKrouZ^m z6H62d1R^P8%1RlpsfK;tIi>YW^claWgM^?6V8&EB8W!BPVVn6>K9iq=J02%^{{sP1 Bc5eUx diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc deleted file mode 100644 index 9207b972792d4a266d80b65a91b638c970a72e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7693 zcmbtZOKcoRdhY7i^gQ^|o09Bl8ylPBNQz=_Hi@msqDbmtQ=^SYo2xdpo#s@NoY748 zsJcfI2g4u$onwq3hn#XCgIu)8B|y#ra>^;lC8xgRkdx0rfMAhBzQ3wxI5V>Mk|C

-D`p2IY(neAey3+=J4_}F9 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 diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc deleted file mode 100644 index 525c0cbbe2648b749365a7cac61e3ef62d44576a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1709 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 LR_VN3a!daO?BRiR diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc deleted file mode 100644 index 36f934ccc3561c149848bf2ef3dddcd7d00dc218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4663 zcmcgwOLH5?5#HGs79dE16m8P7EYY$p8&0B1>?C#+$L2#MrI-R;Bvp=3NNs_bB?Wj1 z(6bB4Vl7jtimrD40(rCYQ*y`;m}^e_3qIxR-d%uzC?5mX^z^)T`|)-6ESr;)B?G^2 z!yC<8Zy3gZX>jppW3Yr45s`)zp>ZhcLKqu{G^O?2kXB&+!>U^t+tR_<;jxXeD+?GG zc%W<(WA~yA{G(Sk_Q)TvzS`UiIC8nUVOobxyAwYP1I1?au>1V)AhoKiCeW)gkx3Bk*0#1EEN^Oe zW&8fdylqB9oR&wDAX!p~%vFZU7~g zw9x~H(nascMd``na{Wg) z$=5Mcmbc`*TmUyI-gTE{sl*qk15vL z-FEEzskwJ7S7Or@Zo8n!pMr2t-9M9x34OUycLaX=@Kk)2r3=)X51YvyQ%rB5G zc_b1Mn;i?yUNLyaVNY5$McG$THbN*3WhDzK(o(%egha2J>KEv=^Q0N}gE8^dO)Swa zjvqsm#MA}h2VSndT6)qNIAoJ%I3$BYpYMT63EsCdnJIlUXi^y3{Brd+2{%EnYNcRg zTjx?2k>;XU21<=du8S&Q`NEKLekOl;ME=2!^%muy{73x2`kNTQ=0@L8Q;^#@fz2Va zNKEx%V%UI3Y<27{xXd@Zv%{Hb;{ng%jFVWIwt&zJvsM-ABRmz3A>*XpVf+le^BY>X zQ^(jGKn{lh9~{$E{SKSyKr{tn0Q9bKOCPjO%aEus>Zxj-CG=EmoPBjORpsI8(!zXr)LR-srq1Il92F;6U@Y!RGw zV#VUrPOLWJcS-rCCE+sz}ScwM8hW(8_*6TI~&=F znbsgGYfz1Hpt=E~EAr`TUqwCjRS!3pcCV|&U$l5sP2HmYNPE1aY;8;vU8W41FFwT9 z%td8uigLkRuFl16ul5w_lX;43CaSGqFI}U$3ojX`)*KE*U8gI)lDyZ{5hk@^FN726jcg7CfO~J^9qADjYU^J-Dw{O zsms`Tl$y1(y0x`^S6^LkhhcVS-0H_i{do0pQ#D)ol(=MVke1Rk#sDa0H4mRm!4Lr2 zZbf_T`gAJ@!w8o>KjI5%{YpBq7f^NcQ;+J>zUm#~vd~jfPo*2;o*$@YG@j;knP;=7 z^`J;ZncuK8yqFbpfiqtTw2YWyYT1~d6P`It9v2@of+7m50gC>G!Ox&5MaLaN4`axo zkRnV0C2sd#hLQ$6S-_>8Ry-gj!yR_q%6$E|OLpK{*fEM4H*sDv-jWy=0Jp3UQYczC2tQAVax#qm7_23F%Tl_sw=aht4beR`O#ciV9o zyo1T2p91*%ThvDYecq)d_`oN$k5Wv(HD!l4nm`dz7sstD|?pbl$_E8{@jx1 zd8JaxD=n7Z;GOtX*Xb2RyS=?m(2DtA0{oH98!mf?_C8DhC-OPDf$!#JyE0L6{s+i; Bv#kIC diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py b/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py deleted file mode 100644 index 11ec695..0000000 --- a/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -''' -This module generates ANSI character codes to printing colors to terminals. -See: http://en.wikipedia.org/wiki/ANSI_escape_code -''' - -CSI = '\033[' -OSC = '\033]' -BEL = '\a' - - -def code_to_chars(code): - return CSI + str(code) + 'm' - -def set_title(title): - return OSC + '2;' + title + BEL - -def clear_screen(mode=2): - return CSI + str(mode) + 'J' - -def clear_line(mode=2): - return CSI + str(mode) + 'K' - - -class AnsiCodes(object): - def __init__(self): - # the subclasses declare class attributes which are numbers. - # Upon instantiation we define instance attributes, which are the same - # as the class attributes but wrapped with the ANSI escape sequence - for name in dir(self): - if not name.startswith('_'): - value = getattr(self, name) - setattr(self, name, code_to_chars(value)) - - -class AnsiCursor(object): - def UP(self, n=1): - return CSI + str(n) + 'A' - def DOWN(self, n=1): - return CSI + str(n) + 'B' - def FORWARD(self, n=1): - return CSI + str(n) + 'C' - def BACK(self, n=1): - return CSI + str(n) + 'D' - def POS(self, x=1, y=1): - return CSI + str(y) + ';' + str(x) + 'H' - - -class AnsiFore(AnsiCodes): - BLACK = 30 - RED = 31 - GREEN = 32 - YELLOW = 33 - BLUE = 34 - MAGENTA = 35 - CYAN = 36 - WHITE = 37 - RESET = 39 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 90 - LIGHTRED_EX = 91 - LIGHTGREEN_EX = 92 - LIGHTYELLOW_EX = 93 - LIGHTBLUE_EX = 94 - LIGHTMAGENTA_EX = 95 - LIGHTCYAN_EX = 96 - LIGHTWHITE_EX = 97 - - -class AnsiBack(AnsiCodes): - BLACK = 40 - RED = 41 - GREEN = 42 - YELLOW = 43 - BLUE = 44 - MAGENTA = 45 - CYAN = 46 - WHITE = 47 - RESET = 49 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 100 - LIGHTRED_EX = 101 - LIGHTGREEN_EX = 102 - LIGHTYELLOW_EX = 103 - LIGHTBLUE_EX = 104 - LIGHTMAGENTA_EX = 105 - LIGHTCYAN_EX = 106 - LIGHTWHITE_EX = 107 - - -class AnsiStyle(AnsiCodes): - BRIGHT = 1 - DIM = 2 - NORMAL = 22 - RESET_ALL = 0 - -Fore = AnsiFore() -Back = AnsiBack() -Style = AnsiStyle() -Cursor = AnsiCursor() diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py b/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py deleted file mode 100644 index 6039a05..0000000 --- a/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py +++ /dev/null @@ -1,258 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import re -import sys -import os - -from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL -from .winterm import WinTerm, WinColor, WinStyle -from .win32 import windll, winapi_test - - -winterm = None -if windll is not None: - winterm = WinTerm() - - -class StreamWrapper(object): - ''' - Wraps a stream (such as stdout), acting as a transparent proxy for all - attribute access apart from method 'write()', which is delegated to our - Converter instance. - ''' - def __init__(self, wrapped, converter): - # double-underscore everything to prevent clashes with names of - # attributes on the wrapped stream object. - self.__wrapped = wrapped - self.__convertor = converter - - def __getattr__(self, name): - return getattr(self.__wrapped, name) - - def __enter__(self, *args, **kwargs): - # special method lookup bypasses __getattr__/__getattribute__, see - # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit - # thus, contextlib magic methods are not proxied via __getattr__ - return self.__wrapped.__enter__(*args, **kwargs) - - def __exit__(self, *args, **kwargs): - return self.__wrapped.__exit__(*args, **kwargs) - - def write(self, text): - self.__convertor.write(text) - - def isatty(self): - stream = self.__wrapped - if 'PYCHARM_HOSTED' in os.environ: - if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): - return True - try: - stream_isatty = stream.isatty - except AttributeError: - return False - else: - return stream_isatty() - - @property - def closed(self): - stream = self.__wrapped - try: - return stream.closed - except AttributeError: - return True - - -class AnsiToWin32(object): - ''' - Implements a 'write()' method which, on Windows, will strip ANSI character - sequences from the text, and if outputting to a tty, will convert them into - win32 function calls. - ''' - ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer - ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command - - def __init__(self, wrapped, convert=None, strip=None, autoreset=False): - # The wrapped stream (normally sys.stdout or sys.stderr) - self.wrapped = wrapped - - # should we reset colors to defaults after every .write() - self.autoreset = autoreset - - # create the proxy wrapping our output stream - self.stream = StreamWrapper(wrapped, self) - - on_windows = os.name == 'nt' - # We test if the WinAPI works, because even if we are on Windows - # we may be using a terminal that doesn't support the WinAPI - # (e.g. Cygwin Terminal). In this case it's up to the terminal - # to support the ANSI codes. - conversion_supported = on_windows and winapi_test() - - # should we strip ANSI sequences from our output? - if strip is None: - strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) - self.strip = strip - - # should we should convert ANSI sequences into win32 calls? - if convert is None: - convert = conversion_supported and not self.stream.closed and self.stream.isatty() - self.convert = convert - - # dict of ansi codes to win32 functions and parameters - self.win32_calls = self.get_win32_calls() - - # are we wrapping stderr? - self.on_stderr = self.wrapped is sys.stderr - - def should_wrap(self): - ''' - True if this class is actually needed. If false, then the output - stream will not be affected, nor will win32 calls be issued, so - wrapping stdout is not actually required. This will generally be - False on non-Windows platforms, unless optional functionality like - autoreset has been requested using kwargs to init() - ''' - return self.convert or self.strip or self.autoreset - - def get_win32_calls(self): - if self.convert and winterm: - return { - AnsiStyle.RESET_ALL: (winterm.reset_all, ), - AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), - AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), - AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), - AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), - AnsiFore.RED: (winterm.fore, WinColor.RED), - AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), - AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), - AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), - AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), - AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), - AnsiFore.WHITE: (winterm.fore, WinColor.GREY), - AnsiFore.RESET: (winterm.fore, ), - AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), - AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), - AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), - AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), - AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), - AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), - AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), - AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), - AnsiBack.BLACK: (winterm.back, WinColor.BLACK), - AnsiBack.RED: (winterm.back, WinColor.RED), - AnsiBack.GREEN: (winterm.back, WinColor.GREEN), - AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), - AnsiBack.BLUE: (winterm.back, WinColor.BLUE), - AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), - AnsiBack.CYAN: (winterm.back, WinColor.CYAN), - AnsiBack.WHITE: (winterm.back, WinColor.GREY), - AnsiBack.RESET: (winterm.back, ), - AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), - AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), - AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), - AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), - AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), - AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), - AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), - AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), - } - return dict() - - def write(self, text): - if self.strip or self.convert: - self.write_and_convert(text) - else: - self.wrapped.write(text) - self.wrapped.flush() - if self.autoreset: - self.reset_all() - - - def reset_all(self): - if self.convert: - self.call_win32('m', (0,)) - elif not self.strip and not self.stream.closed: - self.wrapped.write(Style.RESET_ALL) - - - def write_and_convert(self, text): - ''' - Write the given text to our wrapped stream, stripping any ANSI - sequences from the text, and optionally converting them into win32 - calls. - ''' - cursor = 0 - text = self.convert_osc(text) - for match in self.ANSI_CSI_RE.finditer(text): - start, end = match.span() - self.write_plain_text(text, cursor, start) - self.convert_ansi(*match.groups()) - cursor = end - self.write_plain_text(text, cursor, len(text)) - - - def write_plain_text(self, text, start, end): - if start < end: - self.wrapped.write(text[start:end]) - self.wrapped.flush() - - - def convert_ansi(self, paramstring, command): - if self.convert: - params = self.extract_params(command, paramstring) - self.call_win32(command, params) - - - def extract_params(self, command, paramstring): - if command in 'Hf': - params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) - while len(params) < 2: - # defaults: - params = params + (1,) - else: - params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) - if len(params) == 0: - # defaults: - if command in 'JKm': - params = (0,) - elif command in 'ABCD': - params = (1,) - - return params - - - def call_win32(self, command, params): - if command == 'm': - for param in params: - if param in self.win32_calls: - func_args = self.win32_calls[param] - func = func_args[0] - args = func_args[1:] - kwargs = dict(on_stderr=self.on_stderr) - func(*args, **kwargs) - elif command in 'J': - winterm.erase_screen(params[0], on_stderr=self.on_stderr) - elif command in 'K': - winterm.erase_line(params[0], on_stderr=self.on_stderr) - elif command in 'Hf': # cursor position - absolute - winterm.set_cursor_position(params, on_stderr=self.on_stderr) - elif command in 'ABCD': # cursor position - relative - n = params[0] - # A - up, B - down, C - forward, D - back - x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] - winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) - - - def convert_osc(self, text): - for match in self.ANSI_OSC_RE.finditer(text): - start, end = match.span() - text = text[:start] + text[end:] - paramstring, command = match.groups() - if command == BEL: - if paramstring.count(";") == 1: - params = paramstring.split(";") - # 0 - change title and icon (we will only change title) - # 1 - change icon (we don't support this) - # 2 - change title - if params[0] in '02': - winterm.set_title(params[1]) - return text diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py b/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py deleted file mode 100644 index 430d066..0000000 --- a/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import atexit -import contextlib -import sys - -from .ansitowin32 import AnsiToWin32 - - -orig_stdout = None -orig_stderr = None - -wrapped_stdout = None -wrapped_stderr = None - -atexit_done = False - - -def reset_all(): - if AnsiToWin32 is not None: # Issue #74: objects might become None at exit - AnsiToWin32(orig_stdout).reset_all() - - -def init(autoreset=False, convert=None, strip=None, wrap=True): - - if not wrap and any([autoreset, convert, strip]): - raise ValueError('wrap=False conflicts with any other arg=True') - - global wrapped_stdout, wrapped_stderr - global orig_stdout, orig_stderr - - orig_stdout = sys.stdout - orig_stderr = sys.stderr - - if sys.stdout is None: - wrapped_stdout = None - else: - sys.stdout = wrapped_stdout = \ - wrap_stream(orig_stdout, convert, strip, autoreset, wrap) - if sys.stderr is None: - wrapped_stderr = None - else: - sys.stderr = wrapped_stderr = \ - wrap_stream(orig_stderr, convert, strip, autoreset, wrap) - - global atexit_done - if not atexit_done: - atexit.register(reset_all) - atexit_done = True - - -def deinit(): - if orig_stdout is not None: - sys.stdout = orig_stdout - if orig_stderr is not None: - sys.stderr = orig_stderr - - -@contextlib.contextmanager -def colorama_text(*args, **kwargs): - init(*args, **kwargs) - try: - yield - finally: - deinit() - - -def reinit(): - if wrapped_stdout is not None: - sys.stdout = wrapped_stdout - if wrapped_stderr is not None: - sys.stderr = wrapped_stderr - - -def wrap_stream(stream, convert, strip, autoreset, wrap): - if wrap: - wrapper = AnsiToWin32(stream, - convert=convert, strip=strip, autoreset=autoreset) - if wrapper.should_wrap(): - stream = wrapper.stream - return stream diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/win32.py b/venv/Lib/site-packages/pip/_vendor/colorama/win32.py deleted file mode 100644 index c2d8360..0000000 --- a/venv/Lib/site-packages/pip/_vendor/colorama/win32.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. - -# from winbase.h -STDOUT = -11 -STDERR = -12 - -try: - import ctypes - from ctypes import LibraryLoader - windll = LibraryLoader(ctypes.WinDLL) - from ctypes import wintypes -except (AttributeError, ImportError): - windll = None - SetConsoleTextAttribute = lambda *_: None - winapi_test = lambda *_: None -else: - from ctypes import byref, Structure, c_char, POINTER - - COORD = wintypes._COORD - - class CONSOLE_SCREEN_BUFFER_INFO(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", wintypes.WORD), - ("srWindow", wintypes.SMALL_RECT), - ("dwMaximumWindowSize", COORD), - ] - def __str__(self): - return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( - self.dwSize.Y, self.dwSize.X - , self.dwCursorPosition.Y, self.dwCursorPosition.X - , self.wAttributes - , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right - , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X - ) - - _GetStdHandle = windll.kernel32.GetStdHandle - _GetStdHandle.argtypes = [ - wintypes.DWORD, - ] - _GetStdHandle.restype = wintypes.HANDLE - - _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo - _GetConsoleScreenBufferInfo.argtypes = [ - wintypes.HANDLE, - POINTER(CONSOLE_SCREEN_BUFFER_INFO), - ] - _GetConsoleScreenBufferInfo.restype = wintypes.BOOL - - _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute - _SetConsoleTextAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - ] - _SetConsoleTextAttribute.restype = wintypes.BOOL - - _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition - _SetConsoleCursorPosition.argtypes = [ - wintypes.HANDLE, - COORD, - ] - _SetConsoleCursorPosition.restype = wintypes.BOOL - - _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA - _FillConsoleOutputCharacterA.argtypes = [ - wintypes.HANDLE, - c_char, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputCharacterA.restype = wintypes.BOOL - - _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute - _FillConsoleOutputAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputAttribute.restype = wintypes.BOOL - - _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW - _SetConsoleTitleW.argtypes = [ - wintypes.LPCWSTR - ] - _SetConsoleTitleW.restype = wintypes.BOOL - - def _winapi_test(handle): - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return bool(success) - - def winapi_test(): - return any(_winapi_test(h) for h in - (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) - - def GetConsoleScreenBufferInfo(stream_id=STDOUT): - handle = _GetStdHandle(stream_id) - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return csbi - - def SetConsoleTextAttribute(stream_id, attrs): - handle = _GetStdHandle(stream_id) - return _SetConsoleTextAttribute(handle, attrs) - - def SetConsoleCursorPosition(stream_id, position, adjust=True): - position = COORD(*position) - # If the position is out of range, do nothing. - if position.Y <= 0 or position.X <= 0: - return - # Adjust for Windows' SetConsoleCursorPosition: - # 1. being 0-based, while ANSI is 1-based. - # 2. expecting (x,y), while ANSI uses (y,x). - adjusted_position = COORD(position.Y - 1, position.X - 1) - if adjust: - # Adjust for viewport's scroll position - sr = GetConsoleScreenBufferInfo(STDOUT).srWindow - adjusted_position.Y += sr.Top - adjusted_position.X += sr.Left - # Resume normal processing - handle = _GetStdHandle(stream_id) - return _SetConsoleCursorPosition(handle, adjusted_position) - - def FillConsoleOutputCharacter(stream_id, char, length, start): - handle = _GetStdHandle(stream_id) - char = c_char(char.encode()) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - success = _FillConsoleOutputCharacterA( - handle, char, length, start, byref(num_written)) - return num_written.value - - def FillConsoleOutputAttribute(stream_id, attr, length, start): - ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' - handle = _GetStdHandle(stream_id) - attribute = wintypes.WORD(attr) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - return _FillConsoleOutputAttribute( - handle, attribute, length, start, byref(num_written)) - - def SetConsoleTitle(title): - return _SetConsoleTitleW(title) diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py b/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py deleted file mode 100644 index 0fdb4ec..0000000 --- a/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from . import win32 - - -# from wincon.h -class WinColor(object): - BLACK = 0 - BLUE = 1 - GREEN = 2 - CYAN = 3 - RED = 4 - MAGENTA = 5 - YELLOW = 6 - GREY = 7 - -# from wincon.h -class WinStyle(object): - NORMAL = 0x00 # dim text, dim background - BRIGHT = 0x08 # bright text, dim background - BRIGHT_BACKGROUND = 0x80 # dim text, bright background - -class WinTerm(object): - - def __init__(self): - self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes - self.set_attrs(self._default) - self._default_fore = self._fore - self._default_back = self._back - self._default_style = self._style - # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. - # So that LIGHT_EX colors and BRIGHT style do not clobber each other, - # we track them separately, since LIGHT_EX is overwritten by Fore/Back - # and BRIGHT is overwritten by Style codes. - self._light = 0 - - def get_attrs(self): - return self._fore + self._back * 16 + (self._style | self._light) - - def set_attrs(self, value): - self._fore = value & 7 - self._back = (value >> 4) & 7 - self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) - - def reset_all(self, on_stderr=None): - self.set_attrs(self._default) - self.set_console(attrs=self._default) - self._light = 0 - - def fore(self, fore=None, light=False, on_stderr=False): - if fore is None: - fore = self._default_fore - self._fore = fore - # Emulate LIGHT_EX with BRIGHT Style - if light: - self._light |= WinStyle.BRIGHT - else: - self._light &= ~WinStyle.BRIGHT - self.set_console(on_stderr=on_stderr) - - def back(self, back=None, light=False, on_stderr=False): - if back is None: - back = self._default_back - self._back = back - # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style - if light: - self._light |= WinStyle.BRIGHT_BACKGROUND - else: - self._light &= ~WinStyle.BRIGHT_BACKGROUND - self.set_console(on_stderr=on_stderr) - - def style(self, style=None, on_stderr=False): - if style is None: - style = self._default_style - self._style = style - self.set_console(on_stderr=on_stderr) - - def set_console(self, attrs=None, on_stderr=False): - if attrs is None: - attrs = self.get_attrs() - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleTextAttribute(handle, attrs) - - def get_position(self, handle): - position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition - # Because Windows coordinates are 0-based, - # and win32.SetConsoleCursorPosition expects 1-based. - position.X += 1 - position.Y += 1 - return position - - def set_cursor_position(self, position=None, on_stderr=False): - if position is None: - # I'm not currently tracking the position, so there is no default. - # position = self.get_position() - return - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleCursorPosition(handle, position) - - def cursor_adjust(self, x, y, on_stderr=False): - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - position = self.get_position(handle) - adjusted_position = (position.Y + y, position.X + x) - win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) - - def erase_screen(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the screen. - # 1 should clear from the cursor to the beginning of the screen. - # 2 should clear the entire screen, and move cursor to (1,1) - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - # get the number of character cells in the current buffer - cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y - # get number of character cells before current cursor position - cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = cells_in_screen - cells_before_cursor - elif mode == 1: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_before_cursor - elif mode == 2: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_in_screen - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - if mode == 2: - # put the cursor where needed - win32.SetConsoleCursorPosition(handle, (1, 1)) - - def erase_line(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the line. - # 1 should clear from the cursor to the beginning of the line. - # 2 should clear the entire line. - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X - elif mode == 1: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwCursorPosition.X - elif mode == 2: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwSize.X - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - - def set_title(self, title): - win32.SetConsoleTitle(title) diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py b/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py deleted file mode 100644 index 63d916e..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2019 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import logging - -__version__ = '0.3.1' - -class DistlibException(Exception): - pass - -try: - from logging import NullHandler -except ImportError: # pragma: no cover - class NullHandler(logging.Handler): - def handle(self, record): pass - def emit(self, record): pass - def createLock(self): self.lock = None - -logger = logging.getLogger(__name__) -logger.addHandler(NullHandler()) diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 497cc7e3b6f8659168831c2e0f35f85e6ad3cf55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055 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 diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc deleted file mode 100644 index bed39a57cf6912f473a16fab15c0573cbc283ddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11021 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 diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc deleted file mode 100644 index daf8584d25d3180ca9e795d0eeb78e5b6ce34ac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10929 zcmbVSTWlNId7c}GbTs@uu3zykepS={gC36mS$MdMkN7DPrZK&)HS~(E zQ{Jc>6+?cT6;pm&6-$0+DjE50S8Qf7tDbG-D!E3!l5aQ_2W?H3sSh;@m4eLM^v^~!0M?MxhMl{3E8Im>b=Imhyq^UPsGPqoSg z|3c;B*ECjO#itr8`j-yO%4KFOYvs~2%vvk!Y4)wX*cbQTS$d{ZftlvTo~T9Pda#iW zGe7ogan%oN5eveNG+POpi$UE-J9|9{na|6av_K{AG=1*H5l=@pd^C8{j5xK6`CeK; zZ#zC7n_j$`mehN{){4Egx}Ro)u)5=iJKq0beCPI?Pa1U>wM7txcP3w+y*26fM!z%p z?#klK>yxgCy^wkJDD>}4?)hT!%{QFeo)CUxt-j}?eJJisws<%%YMXw;6ElsV#v>7} z$1}C4G4F}S?9R)RZo>qTv-#llFX3hAHISbY$i{n3WOsw`)mJ9x-f+1uRW*}zWnHic_%v&P9AFfBg;~HO`q*lEyDNns(#Xft;gB={&hA#$+ z7oO0uU?LCv9l!3@DZMl4iTmMBwC(drw-wy0(Yo(Uu6uRi(~{iVbHAb6x#L66^=FU6 zn(Lj`8{#sA?wi-H&faM5#hX#M`{p-p&3t9{qZ`xTaPuF{-YCEMQv2VoxidFrTqT0@ zZYy4&d7Vm}pg~fGz3Sy4xz0L|8t&9|BVsMcsc^fMrlwVqZ4~z~~^$FB6B&Tm~{?zSQR$){X?+u%P#?jn`(pRucK674Us8|)f;2|ZqB zUu0A43&>rOD1S2@T9*6vbr1U6u1c}I=ho^_KsSz{Q_Vd$;%<%mUhKO{xP>cqNJK4O zJ1V1EUcFA3t%SSj*MjvfaEV!2wzRTXv$3PSKgt{UNb&v{83?LY)e-}#o|s5UoVBVc zQ!CDF+058Bn)5PeZW|HhvQ&mzxj4_P1FG*NndYN-C{a%ZSv!Mvyx)#;S%xyyF2<#; zVSEoWQUrTxG0ik15j;t)EpNwzv}>Q4AIyH38ev=>f#}P1S6RSQ2UyyOU;X^=NI)=cy5i)FNz2GZI$PoIpdMke`~!rMVrC2OiLz=dcfHwz>}d zjhd-l4Ma7JQE5-4g|6YN20;0;om#@Luk(v&z%NlkV3}qa->dRgSb+tmE~MV6WSrjT zs%Rd>)#?(S1U1$STkrle#`WBD3z|XNF^XJ!{Fs2u_L|m6L3)1~Wcna=7Y_+Rj}CY; z`0Yg7()sP!*fKj-q95u2DRbXStWJjL&7rYx$#*tRo1XMU#~EanQgfpfET*=Cg-W)I z{^cxQ_%WZxDEumt)FRTrNwd=|_nUQ~2F@)C!g7Xxk!qciuc9WIEs+{5OpW#MvZeZ(!4aO`ZR34t1v4$|>Vc_i??WtK*2Jw_nlAr+i1d9ee96*cBR1EKy>F@V zm^PI*+0eBQHI`Y{ZlM2_VJ9~mzCdmF5c19g2DR*oo!P`c_f_Xx1vK)7C4;|E$# zgRaG}h4lK`Rkx0QlsQwKyY4eubKAIfb*X)7(Sr;!f|97|hwhYEB(bG@Y5`MNntf+^ zfphS}?EQCC#;!*j8_<~SuE#@|hO&9=AdU6U$#b4GL~Q!?`Ub`o1teO=&>j61d0y?) z1EK-_?y}SoX)<}mS zXb(BIj>mgxrXKBLk8-eq(h48nB-!|+giioao>bMy$HZG;Fi}FH>5h>zMu7t*!_wQ6 z1Dp23rUMv|MGyTQBqWca_e|e5`3Qr?hp)#52|7~aKtBVqJflJL%`J;r*vr>gW_kO4}0PL^s!-5Ilod(f+&R zEE$>DbUhelsOyoE-gJqAp>xtnaCV>d`|B-JO%s+G%TY^}2A@ z6iix!*rbu6eMkMZ0_l*sM6K{*)?L~3!fiRy+%@ zru(<-VQT@r6;E_(gba&Db zWEZc4`Co@AB3s2Lk)$S;!poG)!CJ*64p90dQ#Azc5yL_QqMMbH5*mUxl36^fOjYei zWwhZv>Amchr8f6Ps~(>OfKqjh6rfj|Rw$h-ZOGAWa~ybSL-BLE{oF7ueH3|60lj^G z00;)U_!YX)YGnC)e}n==U%rZuc!>RDI&8hRrSS<$q1~|e;WuNwV;pMY3$b~CvT!N3 z4mAFNxLGHQcR4sSI`HL^_>{31Y`kU z?3_Z+;5PeqyOh|SQEDj-vI~Pe_KCiS&H$JuaVPk^+4tbeG5#w}PB=4_jv==_0d zNfxGW%Bkfa^jnT3cB0dYjp#+Z{L5^c6!Bl zk$rFB(K4bp(kOhEkfA&U&;EapaXx0`g;vYCEN8qyS%fzZ6}qnAo*tZhka$DI%z5 z;kj+v$iq{8ZvEP_EWKb9bf*YKH660n&kZA|7iz@Z|1|sNIuFfZm?O zzoZ=`-~o%lK3KnQU;O-vkE#!>n!ukva@7;a5Oe8Z#lQn-`<9tN3zxM|^`)|PBy?$R z4OBt0x?C?%*yUhp7WP2Cv8c|;$rot*drkfe;|YnN@GJ(8>3FpPr z6gf!seOozNbWrgTlz$SAz&rWgaqlF_cbr3Qe<;ZjX-kG^yhMLn z`$Yff(S8AQ9O@J>-(pe#j206ckoY}WT1tx2MJ(+PC&Qg#0($@^-ktX#r+yL40^KG%46tZ%Ea6s)T>tkVf#gr6iu_+djy=8Q%oil4xg6qAgMzZJW4 z!75Sn=V);bHGYoq#$jlRG?T}FJ2)3Sok!jOm8BPw;)XODaG)>JUQvA+wkR#}_aPLi zf%ummr}}Pts28$CNUUvAVowR_bj%-lWxI$bA19RVjEj&w=pFGx;;rCib-0TSAM|!3 zsI`aCN3W=T>mGqWF-hflA7iG9J)UgNYnWp@gFdE2``q$&&}`CJ2!aaYlrGUUIEm#; zGL&)5&CimXDf}j1MF)J5R$7!O(2KZmLN8A6mFDE4L=5)`O0+|;&HIKz21*cop_nC* zLz#o?XjVBTn^h6~^bkOynWXuJCpBM24)`7F{tfEhma`Savl`KkPv6SBWByuegS%9b z&@&yQ2+t8$SHT_|;e0r4M2N}QP=qhTZ&5I*qZ73QN)Vwlh&oF0i5oLGlP0sj zZ^A*;R2ZuJ9?s@g23Thk)&XO*tt?{aP2g89Q5cfzmi>^*fGG5wXU;iI(oI5{p>BBK1InFkfbJJocsno{s|H^ly1uw6?{wyF(Ao> zQj4Z3#Tv3Hk6QLs8Bz~Q>JO;;SU-``$pUQSHp2h1%_Xcs+(ZRpM&Lg9kZg@exwDa@ ze`jS$?s?9DG*awhknJ4nZXjYoL65$#@+0M|m|fcss~;nfc7RaYzTPj($Q*e2A(fL~ zlNGp#*~)eDh+89iDOO^-0wC@HAg3dQ`6z((n+NbiU_LIxd=&ToSQ!trEQu!{quzc7 zCgcJ9gG^@_W)o2i@t5dn1i?Ib8;2B$LKu+xi$^Z%H|5uiUdChiC zli6$j3(N245_lN`o(}&d`kXj~HzMbGM$J<`orO^$ev|8*ORTO@F*@h54v1>_6yslD z4#nfQGBi5X+$y2hr}4!kvo(A`k=#5)H`BSqhNO6Foy!p79QI}iCePl1xySWPalZf| zFTv~+ud=Csn0&2sg-lrjGud&mLIYF)VxMHt=7+sGOC=ayT5MmS5DVQ!kd44y)O4#k z6Gt-uIlr75e65XZsd;)qF-ycW8ckf0N?S55x;CaP3>D5VMuIR%`60Xf&yZJ&bM=T1D($&QuP9io!to8tU7>^wOqvOO#O#zM z`8Jh)g_7Hpkc_7}3W$=OQ+7sPl;c7gT#>0OgW}@-N6RbK2ltm2s*e`ZOv8(7oBS1O zo7vz|tC?nS-5_AMXid_DNlV1Z+2?;u^(?wM;1rpl%L9L#OI;^z=JQC(C8g3opaN3q z)K*)H2(&-e#nYmP*g1YJZpBe@?&U+?0O*9_jacs73lc z4ow~>9Y^pMo)0Vwg1E3IM`fAraGz_So_<h$f>N?*Vt#0 z(>PqRzx`RMK#})by6W8{msRw=M}%L{-P+!7>#A!sS^r2@)Y11gU|`l{sF@NDWed8$DnMAUakJmUi$oWe{%BJN`#jpg`TxiM z9}SB;e|UK~6~=#xg?INI(f5JhG#uObzeBAPkdYQ?N2|E&!L>u(|1q6_3{ly10^=vZ zVxVr>Tv=QK_!B=_DkJcu{=58dP>?$C>*bG^0DgsP^>NFqccCy_t+J?w;^F15KDz&K zrMj~4^@k7ctt{|$njZy@_zWd43W?sO7hj`x}N7(R=lNt0CT8YKj#a%1`5Q|?G$WsckcK7nKb zA3-h!EWAbbA6ELgb1IiD=(z&^U2*Q_GM16Ea<4gObFYCd;NrqDFI%}$XH51`zLFY2 zBtrvfmadhdwQ@2bjXwV?8mNpUwL!C>kuv5i$&m^qPHx09{tp7>8gu{v diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc deleted file mode 100644 index 883e292cc1e5e49cbf6f7876b9f6db4adf996e96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48201 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 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/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg deleted file mode 100644 index 1746bd0..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py deleted file mode 100644 index b470a37..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py deleted file mode 100644 index d66d856..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/distlib/compat.py b/venv/Lib/site-packages/pip/_vendor/distlib/compat.py deleted file mode 100644 index c316fd9..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/compat.py +++ /dev/null @@ -1,1120 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import absolute_import - -import os -import re -import sys - -try: - import ssl -except ImportError: # pragma: no cover - ssl = None - -if sys.version_info[0] < 3: # pragma: no cover - from StringIO import StringIO - string_types = basestring, - text_type = unicode - 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) - - def quote(s): - if isinstance(s, unicode): - s = s.encode('utf-8') - return _quote(s) - - import urllib2 - from urllib2 import (Request, urlopen, URLError, HTTPError, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) - if ssl: - from urllib2 import HTTPSHandler - import httplib - import xmlrpclib - import Queue as queue - from HTMLParser import HTMLParser - import htmlentitydefs - raw_input = raw_input - from itertools import ifilter as filter - from itertools import ifilterfalse as filterfalse - - _userprog = None - def splituser(host): - """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" - global _userprog - if _userprog is None: - import re - _userprog = re.compile('^(.*)@(.*)$') - - match = _userprog.match(host) - if match: return match.group(1, 2) - return None, host - -else: # pragma: no cover - from io import StringIO - string_types = str, - text_type = str - from io import TextIOWrapper as file_type - import builtins - import configparser - import shutil - from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, - unquote, urlsplit, urlunsplit, splittype) - from urllib.request import (urlopen, urlretrieve, Request, url2pathname, - pathname2url, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) - if ssl: - from urllib.request import HTTPSHandler - from urllib.error import HTTPError, URLError, ContentTooShortError - import http.client as httplib - import urllib.request as urllib2 - import xmlrpc.client as xmlrpclib - import queue - from html.parser import HTMLParser - import html.entities as htmlentitydefs - raw_input = input - from itertools import filterfalse - filter = filter - -try: - from ssl import match_hostname, CertificateError -except ImportError: # pragma: no cover - class CertificateError(ValueError): - pass - - - def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - parts = dn.split('.') - leftmost, remainder = parts[0], parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - - def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") - - -try: - from types import SimpleNamespace as Container -except ImportError: # pragma: no cover - class Container(object): - """ - A generic container for when multiple values need to be returned - """ - def __init__(self, **kwargs): - self.__dict__.update(kwargs) - - -try: - from shutil import which -except ImportError: # pragma: no cover - # Implementation from Python 3.3 - def which(cmd, mode=os.F_OK | os.X_OK, path=None): - """Given a command, mode, and a PATH string, return the path which - conforms to the given mode on the PATH, or None if there is no such - file. - - `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result - of os.environ.get("PATH"), or can be overridden with a custom search - path. - - """ - # Check that a given file can be accessed with the correct mode. - # Additionally check that `file` is not a directory, as on Windows - # directories pass the os.access check. - def _access_check(fn, mode): - return (os.path.exists(fn) and os.access(fn, mode) - and not os.path.isdir(fn)) - - # If we're given a path with a directory part, look it up directly rather - # than referring to PATH directories. This includes checking relative to the - # current directory, e.g. ./script - if os.path.dirname(cmd): - if _access_check(cmd, mode): - return cmd - return None - - if path is None: - path = os.environ.get("PATH", os.defpath) - if not path: - return None - path = path.split(os.pathsep) - - if sys.platform == "win32": - # The current directory takes precedence on Windows. - if not os.curdir in path: - path.insert(0, os.curdir) - - # PATHEXT is necessary to check on Windows. - pathext = os.environ.get("PATHEXT", "").split(os.pathsep) - # See if the given file matches any of the expected path extensions. - # This will allow us to short circuit when given "python.exe". - # If it does match, only test that one, otherwise we have to try - # others. - if any(cmd.lower().endswith(ext.lower()) for ext in pathext): - files = [cmd] - else: - files = [cmd + ext for ext in pathext] - else: - # On other platforms you don't have things like PATHEXT to tell you - # what file suffixes are executable, so just pass on cmd as-is. - files = [cmd] - - seen = set() - for dir in path: - normdir = os.path.normcase(dir) - if not normdir in seen: - seen.add(normdir) - for thefile in files: - name = os.path.join(dir, thefile) - if _access_check(name, mode): - return name - return None - - -# ZipFile is a context manager in 2.7, but not in 2.6 - -from zipfile import ZipFile as BaseZipFile - -if hasattr(BaseZipFile, '__enter__'): # pragma: no cover - ZipFile = BaseZipFile -else: # pragma: no cover - from zipfile import ZipExtFile as BaseZipExtFile - - class ZipExtFile(BaseZipExtFile): - def __init__(self, base): - self.__dict__.update(base.__dict__) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - class ZipFile(BaseZipFile): - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - def open(self, *args, **kwargs): - base = BaseZipFile.open(self, *args, **kwargs) - return ZipExtFile(base) - -try: - from platform import python_implementation -except ImportError: # pragma: no cover - def python_implementation(): - """Return a string identifying the Python implementation.""" - if 'PyPy' in sys.version: - return 'PyPy' - if os.name == 'java': - return 'Jython' - if sys.version.startswith('IronPython'): - return 'IronPython' - return 'CPython' - -try: - import sysconfig -except ImportError: # pragma: no cover - from ._backport import sysconfig - -try: - callable = callable -except NameError: # pragma: no cover - from collections.abc import Callable - - def callable(obj): - return isinstance(obj, Callable) - - -try: - fsencode = os.fsencode - fsdecode = os.fsdecode -except AttributeError: # pragma: no cover - # Issue #99: on some systems (e.g. containerised), - # sys.getfilesystemencoding() returns None, and we need a real value, - # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and - # sys.getfilesystemencoding(): the return value is "the user’s preference - # according to the result of nl_langinfo(CODESET), or None if the - # nl_langinfo(CODESET) failed." - _fsencoding = sys.getfilesystemencoding() or 'utf-8' - if _fsencoding == 'mbcs': - _fserrors = 'strict' - else: - _fserrors = 'surrogateescape' - - def fsencode(filename): - if isinstance(filename, bytes): - return filename - elif isinstance(filename, text_type): - return filename.encode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - - def fsdecode(filename): - if isinstance(filename, text_type): - return filename - elif isinstance(filename, bytes): - return filename.decode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - -try: - from tokenize import detect_encoding -except ImportError: # pragma: no cover - from codecs import BOM_UTF8, lookup - import re - - cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") - - def _get_normal_name(orig_enc): - """Imitates get_normal_name in tokenizer.c.""" - # Only care about the first 12 characters. - enc = orig_enc[:12].lower().replace("_", "-") - if enc == "utf-8" or enc.startswith("utf-8-"): - return "utf-8" - if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ - enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): - return "iso-8859-1" - return orig_enc - - def detect_encoding(readline): - """ - The detect_encoding() function is used to detect the encoding that should - be used to decode a Python source file. It requires one argument, readline, - in the same way as the tokenize() generator. - - It will call readline a maximum of twice, and return the encoding used - (as a string) and a list of any lines (left as bytes) it has read in. - - It detects the encoding from the presence of a utf-8 bom or an encoding - cookie as specified in pep-0263. If both a bom and a cookie are present, - but disagree, a SyntaxError will be raised. If the encoding cookie is an - invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, - 'utf-8-sig' is returned. - - If no encoding is specified, then the default of 'utf-8' will be returned. - """ - try: - filename = readline.__self__.name - except AttributeError: - filename = None - bom_found = False - encoding = None - default = 'utf-8' - def read_or_stop(): - try: - return readline() - except StopIteration: - return b'' - - def find_cookie(line): - try: - # Decode as UTF-8. Either the line is an encoding declaration, - # in which case it should be pure ASCII, or it must be UTF-8 - # per default encoding. - line_string = line.decode('utf-8') - except UnicodeDecodeError: - msg = "invalid or missing encoding declaration" - if filename is not None: - msg = '{} for {!r}'.format(msg, filename) - raise SyntaxError(msg) - - matches = cookie_re.findall(line_string) - if not matches: - return None - encoding = _get_normal_name(matches[0]) - try: - codec = lookup(encoding) - except LookupError: - # This behaviour mimics the Python interpreter - if filename is None: - msg = "unknown encoding: " + encoding - else: - msg = "unknown encoding for {!r}: {}".format(filename, - encoding) - raise SyntaxError(msg) - - if bom_found: - if codec.name != 'utf-8': - # This behaviour mimics the Python interpreter - if filename is None: - msg = 'encoding problem: utf-8' - else: - msg = 'encoding problem for {!r}: utf-8'.format(filename) - raise SyntaxError(msg) - encoding += '-sig' - return encoding - - first = read_or_stop() - if first.startswith(BOM_UTF8): - bom_found = True - first = first[3:] - default = 'utf-8-sig' - if not first: - return default, [] - - encoding = find_cookie(first) - if encoding: - return encoding, [first] - - second = read_or_stop() - if not second: - return default, [first] - - encoding = find_cookie(second) - if encoding: - return encoding, [first, second] - - return default, [first, second] - -# For converting & <-> & etc. -try: - from html import escape -except ImportError: - from cgi import escape -if sys.version_info[:2] < (3, 4): - unescape = HTMLParser().unescape -else: - from html import unescape - -try: - from collections import ChainMap -except ImportError: # pragma: no cover - from collections import MutableMapping - - try: - from reprlib import recursive_repr as _recursive_repr - except ImportError: - def _recursive_repr(fillvalue='...'): - ''' - Decorator to make a repr function return fillvalue for a recursive - call - ''' - - def decorating_function(user_function): - repr_running = set() - - def wrapper(self): - key = id(self), get_ident() - if key in repr_running: - return fillvalue - repr_running.add(key) - try: - result = user_function(self) - finally: - repr_running.discard(key) - return result - - # Can't use functools.wraps() here because of bootstrap issues - wrapper.__module__ = getattr(user_function, '__module__') - wrapper.__doc__ = getattr(user_function, '__doc__') - wrapper.__name__ = getattr(user_function, '__name__') - wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) - return wrapper - - return decorating_function - - class ChainMap(MutableMapping): - ''' A ChainMap groups multiple dicts (or other mappings) together - to create a single, updateable view. - - The underlying mappings are stored in a list. That list is public and can - accessed or updated using the *maps* attribute. There is no other state. - - Lookups search the underlying mappings successively until a key is found. - In contrast, writes, updates, and deletions only operate on the first - mapping. - - ''' - - def __init__(self, *maps): - '''Initialize a ChainMap by setting *maps* to the given mappings. - If no mappings are provided, a single empty dictionary is used. - - ''' - self.maps = list(maps) or [{}] # always at least one map - - def __missing__(self, key): - raise KeyError(key) - - def __getitem__(self, key): - for mapping in self.maps: - try: - return mapping[key] # can't use 'key in mapping' with defaultdict - except KeyError: - pass - return self.__missing__(key) # support subclasses that define __missing__ - - def get(self, key, default=None): - return self[key] if key in self else default - - def __len__(self): - return len(set().union(*self.maps)) # reuses stored hash values if possible - - def __iter__(self): - return iter(set().union(*self.maps)) - - def __contains__(self, key): - return any(key in m for m in self.maps) - - def __bool__(self): - return any(self.maps) - - @_recursive_repr() - def __repr__(self): - return '{0.__class__.__name__}({1})'.format( - self, ', '.join(map(repr, self.maps))) - - @classmethod - def fromkeys(cls, iterable, *args): - 'Create a ChainMap with a single dict created from the iterable.' - return cls(dict.fromkeys(iterable, *args)) - - def copy(self): - 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' - return self.__class__(self.maps[0].copy(), *self.maps[1:]) - - __copy__ = copy - - def new_child(self): # like Django's Context.push() - 'New ChainMap with a new dict followed by all previous maps.' - return self.__class__({}, *self.maps) - - @property - def parents(self): # like Django's Context.pop() - 'New ChainMap from maps[1:].' - return self.__class__(*self.maps[1:]) - - def __setitem__(self, key, value): - self.maps[0][key] = value - - def __delitem__(self, key): - try: - del self.maps[0][key] - except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) - - def popitem(self): - 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' - try: - return self.maps[0].popitem() - except KeyError: - raise KeyError('No keys found in the first mapping.') - - def pop(self, key, *args): - 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' - try: - return self.maps[0].pop(key, *args) - except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) - - def clear(self): - 'Clear maps[0], leaving maps[1:] intact.' - self.maps[0].clear() - -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 - -try: - from collections import OrderedDict -except ImportError: # pragma: no cover -## {{{ http://code.activestate.com/recipes/576693/ (r9) -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. - try: - from thread import get_ident as _get_ident - except ImportError: - from dummy_thread import get_ident as _get_ident - - try: - from _abcoll import KeysView, ValuesView, ItemsView - except ImportError: - pass - - - class OrderedDict(dict): - 'Dictionary that remembers insertion order' - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running=None): - 'od.__repr__() <==> repr(od)' - if not _repr_running: _repr_running = {} - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) - -try: - from logging.config import BaseConfigurator, valid_ident -except ImportError: # pragma: no cover - IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) - - - def valid_ident(s): - m = IDENTIFIER.match(s) - if not m: - raise ValueError('Not a valid Python identifier: %r' % s) - return True - - - # The ConvertingXXX classes are wrappers around standard Python containers, - # and they serve to convert any suitable values in the container. The - # conversion converts base dicts, lists and tuples to their wrapped - # equivalents, whereas strings which match a conversion format are converted - # appropriately. - # - # Each wrapper should have a configurator attribute holding the actual - # configurator to use for conversion. - - class ConvertingDict(dict): - """A converting dictionary wrapper.""" - - def __getitem__(self, key): - value = dict.__getitem__(self, key) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def get(self, key, default=None): - value = dict.get(self, key, default) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, key, default=None): - value = dict.pop(self, key, default) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class ConvertingList(list): - """A converting list wrapper.""" - def __getitem__(self, key): - value = list.__getitem__(self, key) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, idx=-1): - value = list.pop(self, idx) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - return result - - class ConvertingTuple(tuple): - """A converting tuple wrapper.""" - def __getitem__(self, key): - value = tuple.__getitem__(self, key) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class BaseConfigurator(object): - """ - The configurator base class which defines some useful defaults. - """ - - CONVERT_PATTERN = re.compile(r'^(?P[a-z]+)://(?P.*)$') - - WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') - DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') - INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') - DIGIT_PATTERN = re.compile(r'^\d+$') - - value_converters = { - 'ext' : 'ext_convert', - 'cfg' : 'cfg_convert', - } - - # We might want to use a different one, e.g. importlib - importer = staticmethod(__import__) - - def __init__(self, config): - self.config = ConvertingDict(config) - self.config.configurator = self - - def resolve(self, s): - """ - Resolve strings to objects using standard import and attribute - syntax. - """ - name = s.split('.') - used = name.pop(0) - try: - found = self.importer(used) - for frag in name: - used += '.' + frag - try: - found = getattr(found, frag) - except AttributeError: - self.importer(used) - found = getattr(found, frag) - return found - except ImportError: - e, tb = sys.exc_info()[1:] - v = ValueError('Cannot resolve %r: %s' % (s, e)) - v.__cause__, v.__traceback__ = e, tb - raise v - - def ext_convert(self, value): - """Default converter for the ext:// protocol.""" - return self.resolve(value) - - def cfg_convert(self, value): - """Default converter for the cfg:// protocol.""" - rest = value - m = self.WORD_PATTERN.match(rest) - if m is None: - raise ValueError("Unable to convert %r" % value) - else: - rest = rest[m.end():] - d = self.config[m.groups()[0]] - #print d, rest - while rest: - m = self.DOT_PATTERN.match(rest) - if m: - d = d[m.groups()[0]] - else: - m = self.INDEX_PATTERN.match(rest) - if m: - idx = m.groups()[0] - if not self.DIGIT_PATTERN.match(idx): - d = d[idx] - else: - try: - n = int(idx) # try as number first (most likely) - d = d[n] - except TypeError: - d = d[idx] - if m: - rest = rest[m.end():] - else: - raise ValueError('Unable to convert ' - '%r at %r' % (value, rest)) - #rest should be empty - return d - - def convert(self, value): - """ - Convert values to an appropriate type. dicts, lists and tuples are - replaced by their converting alternatives. Strings are checked to - see if they have a conversion format and are converted if they do. - """ - if not isinstance(value, ConvertingDict) and isinstance(value, dict): - value = ConvertingDict(value) - value.configurator = self - elif not isinstance(value, ConvertingList) and isinstance(value, list): - value = ConvertingList(value) - value.configurator = self - elif not isinstance(value, ConvertingTuple) and\ - isinstance(value, tuple): - value = ConvertingTuple(value) - value.configurator = self - elif isinstance(value, string_types): - m = self.CONVERT_PATTERN.match(value) - if m: - d = m.groupdict() - prefix = d['prefix'] - converter = self.value_converters.get(prefix, None) - if converter: - suffix = d['suffix'] - converter = getattr(self, converter) - value = converter(suffix) - return value - - def configure_custom(self, config): - """Configure an object with a user-supplied factory.""" - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) - result = c(**kwargs) - if props: - for name, value in props.items(): - setattr(result, name, value) - return result - - def as_tuple(self, value): - """Utility function which converts lists to tuples.""" - if isinstance(value, list): - value = tuple(value) - return value diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/database.py b/venv/Lib/site-packages/pip/_vendor/distlib/database.py deleted file mode 100644 index 0a90c30..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/database.py +++ /dev/null @@ -1,1339 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""PEP 376 implementation.""" - -from __future__ import unicode_literals - -import base64 -import codecs -import contextlib -import hashlib -import logging -import os -import posixpath -import sys -import zipimport - -from . import DistlibException, resources -from .compat import StringIO -from .version import get_scheme, UnsupportedVersionError -from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME) -from .util import (parse_requirement, cached_property, parse_name_and_version, - read_exports, write_exports, CSVReader, CSVWriter) - - -__all__ = ['Distribution', 'BaseInstalledDistribution', - 'InstalledDistribution', 'EggInfoDistribution', - 'DistributionPath'] - - -logger = logging.getLogger(__name__) - -EXPORTS_FILENAME = 'pydist-exports.json' -COMMANDS_FILENAME = 'pydist-commands.json' - -DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', - 'RESOURCES', EXPORTS_FILENAME, 'SHARED') - -DISTINFO_EXT = '.dist-info' - - -class _Cache(object): - """ - A simple cache mapping names and .dist-info paths to distributions - """ - def __init__(self): - """ - Initialise an instance. There is normally one for each DistributionPath. - """ - self.name = {} - self.path = {} - self.generated = False - - def clear(self): - """ - Clear the cache, setting it to its initial state. - """ - self.name.clear() - self.path.clear() - self.generated = False - - def add(self, dist): - """ - Add a distribution to the cache. - :param dist: The distribution to add. - """ - if dist.path not in self.path: - self.path[dist.path] = dist - self.name.setdefault(dist.key, []).append(dist) - - -class DistributionPath(object): - """ - Represents a set of distributions installed on a path (typically sys.path). - """ - def __init__(self, path=None, include_egg=False): - """ - Create an instance from a path, optionally including legacy (distutils/ - setuptools/distribute) distributions. - :param path: The path to use, as a list of directories. If not specified, - sys.path is used. - :param include_egg: If True, this instance will look for and return legacy - distributions as well as those based on PEP 376. - """ - if path is None: - path = sys.path - self.path = path - self._include_dist = True - self._include_egg = include_egg - - self._cache = _Cache() - self._cache_egg = _Cache() - self._cache_enabled = True - self._scheme = get_scheme('default') - - def _get_cache_enabled(self): - return self._cache_enabled - - def _set_cache_enabled(self, value): - self._cache_enabled = value - - cache_enabled = property(_get_cache_enabled, _set_cache_enabled) - - def clear_cache(self): - """ - Clears the internal cache. - """ - self._cache.clear() - self._cache_egg.clear() - - - def _yield_distributions(self): - """ - Yield .dist-info and/or .egg(-info) distributions. - """ - # We need to check if we've seen some resources already, because on - # some Linux systems (e.g. some Debian/Ubuntu variants) there are - # symlinks which alias other files in the environment. - seen = set() - for path in self.path: - finder = resources.finder_for_path(path) - if finder is None: - continue - r = finder.find('') - if not r or not r.is_container: - continue - rset = sorted(r.resources) - for entry in rset: - 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 - - 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) - - def _generate_cache(self): - """ - Scan the path for distributions and populate the cache with - those that are found. - """ - gen_dist = not self._cache.generated - gen_egg = self._include_egg and not self._cache_egg.generated - if gen_dist or gen_egg: - for dist in self._yield_distributions(): - if isinstance(dist, InstalledDistribution): - self._cache.add(dist) - else: - self._cache_egg.add(dist) - - if gen_dist: - self._cache.generated = True - if gen_egg: - self._cache_egg.generated = True - - @classmethod - def distinfo_dirname(cls, name, version): - """ - The *name* and *version* parameters are converted into their - filename-escaped form, i.e. any ``'-'`` characters are replaced - with ``'_'`` other than the one in ``'dist-info'`` and the one - separating the name from the version number. - - :parameter name: is converted to a standard distribution name by replacing - any runs of non- alphanumeric characters with a single - ``'-'``. - :type name: string - :parameter version: is converted to a standard version string. Spaces - become dots, and all other non-alphanumeric characters - (except dots) become dashes, with runs of multiple - dashes condensed to a single dash. - :type version: string - :returns: directory name - :rtype: string""" - name = name.replace('-', '_') - return '-'.join([name, version]) + DISTINFO_EXT - - def get_distributions(self): - """ - Provides an iterator that looks for distributions and returns - :class:`InstalledDistribution` or - :class:`EggInfoDistribution` instances for each one of them. - - :rtype: iterator of :class:`InstalledDistribution` and - :class:`EggInfoDistribution` instances - """ - if not self._cache_enabled: - for dist in self._yield_distributions(): - yield dist - else: - self._generate_cache() - - for dist in self._cache.path.values(): - yield dist - - if self._include_egg: - for dist in self._cache_egg.path.values(): - yield dist - - def get_distribution(self, name): - """ - Looks for a named distribution on the path. - - This function only returns the first result found, as no more than one - value is expected. If nothing is found, ``None`` is returned. - - :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` - or ``None`` - """ - result = None - name = name.lower() - if not self._cache_enabled: - for dist in self._yield_distributions(): - if dist.key == name: - result = dist - break - else: - self._generate_cache() - - if name in self._cache.name: - result = self._cache.name[name][0] - elif self._include_egg and name in self._cache_egg.name: - result = self._cache_egg.name[name][0] - return result - - def provides_distribution(self, name, version=None): - """ - Iterates over all distributions to find which distributions provide *name*. - If a *version* is provided, it will be used to filter the results. - - This function only returns the first result found, since no more than - one values are expected. If the directory is not found, returns ``None``. - - :parameter version: a version specifier that indicates the version - required, conforming to the format in ``PEP-345`` - - :type name: string - :type version: string - """ - matcher = None - if version is not None: - try: - matcher = self._scheme.matcher('%s (%s)' % (name, version)) - except ValueError: - raise DistlibException('invalid name or version: %r, %r' % - (name, version)) - - for dist in self.get_distributions(): - # We hit a problem on Travis where enum34 was installed and doesn't - # have a provides attribute ... - if not hasattr(dist, 'provides'): - logger.debug('No "provides": %s', dist) - else: - provided = dist.provides - - for p in provided: - p_name, p_ver = parse_name_and_version(p) - if matcher is None: - if p_name == name: - yield dist - break - else: - if p_name == name and matcher.match(p_ver): - yield dist - break - - def get_file_path(self, name, relative_path): - """ - Return the path to a resource file. - """ - dist = self.get_distribution(name) - if dist is None: - raise LookupError('no distribution named %r found' % name) - return dist.get_resource_path(relative_path) - - def get_exported_entries(self, category, name=None): - """ - Return all of the exported entries in a particular category. - - :param category: The category to search for entries. - :param name: If specified, only entries with that name are returned. - """ - for dist in self.get_distributions(): - r = dist.exports - if category in r: - d = r[category] - if name is not None: - if name in d: - yield d[name] - else: - for v in d.values(): - yield v - - -class Distribution(object): - """ - A base class for distributions, whether installed or from indexes. - Either way, it must have some metadata, so that's all that's needed - for construction. - """ - - build_time_dependency = False - """ - Set to True if it's known to be only a build-time dependency (i.e. - not needed after installation). - """ - - requested = False - """A boolean that indicates whether the ``REQUESTED`` metadata file is - present (in other words, whether the package was installed by user - request or it was installed as a dependency).""" - - def __init__(self, metadata): - """ - Initialise an instance. - :param metadata: The instance of :class:`Metadata` describing this - distribution. - """ - self.metadata = metadata - self.name = metadata.name - self.key = self.name.lower() # for case-insensitive comparisons - self.version = metadata.version - self.locator = None - self.digest = None - self.extras = None # additional features requested - self.context = None # environment marker overrides - self.download_urls = set() - self.digests = {} - - @property - def source_url(self): - """ - The source archive download URL for this distribution. - """ - return self.metadata.source_url - - download_url = source_url # Backward compatibility - - @property - def name_and_version(self): - """ - A utility property which displays the name and version in parentheses. - """ - return '%s (%s)' % (self.name, self.version) - - @property - def provides(self): - """ - A set of distribution names and versions provided by this distribution. - :return: A set of "name (version)" strings. - """ - plist = self.metadata.provides - s = '%s (%s)' % (self.name, self.version) - if s not in plist: - plist.append(s) - return plist - - def _get_requirements(self, req_attr): - md = self.metadata - logger.debug('Getting requirements from metadata %r', md.todict()) - reqts = getattr(md, req_attr) - return set(md.get_requirements(reqts, extras=self.extras, - env=self.context)) - - @property - def run_requires(self): - return self._get_requirements('run_requires') - - @property - def meta_requires(self): - return self._get_requirements('meta_requires') - - @property - def build_requires(self): - return self._get_requirements('build_requires') - - @property - def test_requires(self): - return self._get_requirements('test_requires') - - @property - def dev_requires(self): - return self._get_requirements('dev_requires') - - def matches_requirement(self, req): - """ - Say if this instance matches (fulfills) a requirement. - :param req: The requirement to match. - :rtype req: str - :return: True if it matches, else False. - """ - # Requirement may contain extras - parse to lose those - # from what's passed to the matcher - r = parse_requirement(req) - scheme = get_scheme(self.metadata.scheme) - try: - matcher = scheme.matcher(r.requirement) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - result = False - for p in self.provides: - p_name, p_ver = parse_name_and_version(p) - if p_name != name: - continue - try: - result = matcher.match(p_ver) - break - except UnsupportedVersionError: - pass - return result - - def __repr__(self): - """ - Return a textual representation of this instance, - """ - if self.source_url: - suffix = ' [%s]' % self.source_url - else: - suffix = '' - return '' % (self.name, self.version, suffix) - - def __eq__(self, other): - """ - See if this distribution is the same as another. - :param other: The distribution to compare with. To be equal to one - another. distributions must have the same type, name, - version and source_url. - :return: True if it is the same, else False. - """ - if type(other) is not type(self): - result = False - else: - result = (self.name == other.name and - self.version == other.version and - self.source_url == other.source_url) - return result - - def __hash__(self): - """ - Compute hash in a way which matches the equality test. - """ - return hash(self.name) + hash(self.version) + hash(self.source_url) - - -class BaseInstalledDistribution(Distribution): - """ - This is the base class for installed distributions (whether PEP 376 or - legacy). - """ - - hasher = None - - def __init__(self, metadata, path, env=None): - """ - Initialise an instance. - :param metadata: An instance of :class:`Metadata` which describes the - distribution. This will normally have been initialised - from a metadata file in the ``path``. - :param path: The path of the ``.dist-info`` or ``.egg-info`` - directory for the distribution. - :param env: This is normally the :class:`DistributionPath` - instance where this distribution was found. - """ - super(BaseInstalledDistribution, self).__init__(metadata) - self.path = path - self.dist_path = env - - def get_hash(self, data, hasher=None): - """ - Get the hash of some data, using a particular hash algorithm, if - specified. - - :param data: The data to be hashed. - :type data: bytes - :param hasher: The name of a hash implementation, supported by hashlib, - or ``None``. Examples of valid values are ``'sha1'``, - ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and - ``'sha512'``. If no hasher is specified, the ``hasher`` - attribute of the :class:`InstalledDistribution` instance - is used. If the hasher is determined to be ``None``, MD5 - is used as the hashing algorithm. - :returns: The hash of the data. If a hasher was explicitly specified, - the returned hash will be prefixed with the specified hasher - followed by '='. - :rtype: str - """ - if hasher is None: - hasher = self.hasher - if hasher is None: - hasher = hashlib.md5 - prefix = '' - else: - hasher = getattr(hashlib, hasher) - prefix = '%s=' % self.hasher - digest = hasher(data).digest() - digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') - return '%s%s' % (prefix, digest) - - -class InstalledDistribution(BaseInstalledDistribution): - """ - Created with the *path* of the ``.dist-info`` directory provided to the - constructor. It reads the metadata contained in ``pydist.json`` when it is - instantiated., or uses a passed in Metadata instance (useful for when - dry-run mode is being used). - """ - - hasher = 'sha256' - - def __init__(self, path, metadata=None, env=None): - self.modules = [] - self.finder = finder = resources.finder_for_path(path) - if finder is None: - raise ValueError('finder unavailable for %s' % path) - if env and env._cache_enabled and path in env._cache.path: - metadata = env._cache.path[path].metadata - elif metadata is None: - r = finder.find(METADATA_FILENAME) - # Temporary - for Wheel 0.23 support - if r is None: - r = finder.find(WHEEL_METADATA_FILENAME) - # Temporary - for legacy support - if r is None: - r = finder.find(LEGACY_METADATA_FILENAME) - if r is None: - raise ValueError('no %s found in %s' % (METADATA_FILENAME, - path)) - with contextlib.closing(r.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') - - super(InstalledDistribution, self).__init__(metadata, path, env) - - if env and env._cache_enabled: - env._cache.add(self) - - r = finder.find('REQUESTED') - self.requested = r is not None - p = os.path.join(path, 'top_level.txt') - if os.path.exists(p): - with open(p, 'rb') as f: - data = f.read().decode('utf-8') - self.modules = data.splitlines() - - def __repr__(self): - return '' % ( - self.name, self.version, self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def _get_records(self): - """ - Get the list of installed files for the distribution - :return: A list of tuples of path, hash and size. Note that hash and - size might be ``None`` for some entries. The path is exactly - as stored in the file (which is as in PEP 376). - """ - results = [] - r = self.get_distinfo_resource('RECORD') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as record_reader: - # Base location is parent dir of .dist-info dir - #base_location = os.path.dirname(self.path) - #base_location = os.path.abspath(base_location) - for row in record_reader: - missing = [None for i in range(len(row), 3)] - path, checksum, size = row + missing - #if not os.path.isabs(path): - # path = path.replace('/', os.sep) - # path = os.path.join(base_location, path) - results.append((path, checksum, size)) - return results - - @cached_property - def exports(self): - """ - Return the information exported by this distribution. - :return: A dictionary of exports, mapping an export category to a dict - of :class:`ExportEntry` instances describing the individual - export entries, and keyed by name. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - result = self.read_exports() - return result - - def read_exports(self): - """ - Read exports data from a file in .ini format. - - :return: A dictionary of exports, mapping an export category to a list - of :class:`ExportEntry` instances describing the individual - export entries. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - with contextlib.closing(r.as_stream()) as stream: - result = read_exports(stream) - return result - - def write_exports(self, exports): - """ - Write a dictionary of exports to a file in .ini format. - :param exports: A dictionary of exports, mapping an export category to - a list of :class:`ExportEntry` instances describing the - individual export entries. - """ - rf = self.get_distinfo_file(EXPORTS_FILENAME) - with open(rf, 'w') as f: - write_exports(exports, f) - - def get_resource_path(self, relative_path): - """ - NOTE: This API may change in the future. - - Return the absolute path to a resource file with the given relative - path. - - :param relative_path: The path, relative to .dist-info, of the resource - of interest. - :return: The absolute path where the resource is to be found. - """ - r = self.get_distinfo_resource('RESOURCES') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as resources_reader: - for relative, destination in resources_reader: - if relative == relative_path: - return destination - raise KeyError('no resource file with relative path %r ' - 'is installed' % relative_path) - - def list_installed_files(self): - """ - Iterates over the ``RECORD`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: iterator of (path, hash, size) - """ - for result in self._get_records(): - yield result - - def write_installed_files(self, paths, prefix, dry_run=False): - """ - Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any - existing ``RECORD`` file is silently overwritten. - - prefix is used to determine when to write absolute paths. - """ - prefix = os.path.join(prefix, '') - base = os.path.dirname(self.path) - base_under_prefix = base.startswith(prefix) - base = os.path.join(base, '') - record_path = self.get_distinfo_file('RECORD') - logger.info('creating %s', record_path) - if dry_run: - return None - with CSVWriter(record_path) as writer: - for path in paths: - if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): - # do not put size and hash, as in PEP-376 - hash_value = size = '' - else: - size = '%d' % os.path.getsize(path) - with open(path, 'rb') as fp: - hash_value = self.get_hash(fp.read()) - if path.startswith(base) or (base_under_prefix and - path.startswith(prefix)): - path = os.path.relpath(path, base) - writer.writerow((path, hash_value, size)) - - # add the RECORD file itself - if record_path.startswith(base): - record_path = os.path.relpath(record_path, base) - writer.writerow((record_path, '', '')) - return record_path - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - base = os.path.dirname(self.path) - record_path = self.get_distinfo_file('RECORD') - for path, hash_value, size in self.list_installed_files(): - if not os.path.isabs(path): - path = os.path.join(base, path) - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - elif os.path.isfile(path): - actual_size = str(os.path.getsize(path)) - if size and actual_size != size: - mismatches.append((path, 'size', size, actual_size)) - elif hash_value: - if '=' in hash_value: - hasher = hash_value.split('=', 1)[0] - else: - hasher = None - - with open(path, 'rb') as f: - actual_hash = self.get_hash(f.read(), hasher) - if actual_hash != hash_value: - mismatches.append((path, 'hash', hash_value, actual_hash)) - return mismatches - - @cached_property - def shared_locations(self): - """ - A dictionary of shared locations whose keys are in the set 'prefix', - 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. - The corresponding value is the absolute path of that category for - this distribution, and takes into account any paths selected by the - user at installation time (e.g. via command-line arguments). In the - case of the 'namespace' key, this would be a list of absolute paths - for the roots of namespace packages in this distribution. - - The first time this property is accessed, the relevant information is - read from the SHARED file in the .dist-info directory. - """ - result = {} - shared_path = os.path.join(self.path, 'SHARED') - if os.path.isfile(shared_path): - with codecs.open(shared_path, 'r', encoding='utf-8') as f: - lines = f.read().splitlines() - for line in lines: - key, value = line.split('=', 1) - if key == 'namespace': - result.setdefault(key, []).append(value) - else: - result[key] = value - return result - - def write_shared_locations(self, paths, dry_run=False): - """ - Write shared location information to the SHARED file in .dist-info. - :param paths: A dictionary as described in the documentation for - :meth:`shared_locations`. - :param dry_run: If True, the action is logged but no file is actually - written. - :return: The path of the file written to. - """ - shared_path = os.path.join(self.path, 'SHARED') - logger.info('creating %s', shared_path) - if dry_run: - return None - lines = [] - for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): - path = paths[key] - if os.path.isdir(paths[key]): - lines.append('%s=%s' % (key, path)) - for ns in paths.get('namespace', ()): - lines.append('namespace=%s' % ns) - - with codecs.open(shared_path, 'w', encoding='utf-8') as f: - f.write('\n'.join(lines)) - return shared_path - - def get_distinfo_resource(self, path): - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - finder = resources.finder_for_path(self.path) - if finder is None: - raise DistlibException('Unable to get a finder for %s' % self.path) - return finder.find(path) - - def get_distinfo_file(self, path): - """ - Returns a path located under the ``.dist-info`` directory. Returns a - string representing the path. - - :parameter path: a ``'/'``-separated path relative to the - ``.dist-info`` directory or an absolute path; - If *path* is an absolute path and doesn't start - with the ``.dist-info`` directory path, - a :class:`DistlibException` is raised - :type path: str - :rtype: str - """ - # Check if it is an absolute path # XXX use relpath, add tests - if path.find(os.sep) >= 0: - # it's an absolute path? - distinfo_dirname, path = path.split(os.sep)[-2:] - if distinfo_dirname != self.path.split(os.sep)[-1]: - raise DistlibException( - 'dist-info file %r does not belong to the %r %s ' - 'distribution' % (path, self.name, self.version)) - - # The file must be relative - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - - return os.path.join(self.path, path) - - def list_distinfo_files(self): - """ - Iterates over the ``RECORD`` entries and returns paths for each line if - the path is pointing to a file located in the ``.dist-info`` directory - or one of its subdirectories. - - :returns: iterator of paths - """ - base = os.path.dirname(self.path) - for path, checksum, size in self._get_records(): - # XXX add separator or use real relpath algo - if not os.path.isabs(path): - path = os.path.join(base, path) - if path.startswith(self.path): - yield path - - def __eq__(self, other): - return (isinstance(other, InstalledDistribution) and - self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - - -class EggInfoDistribution(BaseInstalledDistribution): - """Created with the *path* of the ``.egg-info`` directory or file provided - to the constructor. It reads the metadata contained in the file itself, or - if the given path happens to be a directory, the metadata is read from the - file ``PKG-INFO`` under that directory.""" - - requested = True # as we have no way of knowing, assume it was - shared_locations = {} - - def __init__(self, path, env=None): - def set_name_and_version(s, n, v): - s.name = n - s.key = n.lower() # for case-insensitive comparisons - s.version = v - - self.path = path - self.dist_path = env - if env and env._cache_enabled and path in env._cache_egg.path: - metadata = env._cache_egg.path[path].metadata - set_name_and_version(self, metadata.name, metadata.version) - else: - metadata = self._get_metadata(path) - - # Need to be set before caching - set_name_and_version(self, metadata.name, metadata.version) - - if env and env._cache_enabled: - env._cache_egg.add(self) - super(EggInfoDistribution, self).__init__(metadata, path, env) - - def _get_metadata(self, path): - requires = None - - def parse_requires_data(data): - """Create a list of dependencies from a requires.txt file. - - *data*: the contents of a setuptools-produced requires.txt file. - """ - reqs = [] - lines = data.splitlines() - for line in lines: - line = line.strip() - if line.startswith('['): - logger.warning('Unexpected line: quitting requirement scan: %r', - line) - break - r = parse_requirement(line) - if not r: - logger.warning('Not recognised as a requirement: %r', line) - continue - if r.extras: - logger.warning('extra requirements in requires.txt are ' - 'not supported') - if not r.constraints: - reqs.append(r.name) - else: - cons = ', '.join('%s%s' % c for c in r.constraints) - reqs.append('%s (%s)' % (r.name, cons)) - return reqs - - def parse_requires_path(req_path): - """Create a list of dependencies from a requires.txt file. - - *req_path*: the path to a setuptools-produced requires.txt file. - """ - - reqs = [] - try: - with codecs.open(req_path, 'r', 'utf-8') as fp: - reqs = parse_requires_data(fp.read()) - except IOError: - pass - return reqs - - tl_path = tl_data = None - if path.endswith('.egg'): - if os.path.isdir(path): - p = os.path.join(path, 'EGG-INFO') - meta_path = os.path.join(p, 'PKG-INFO') - metadata = Metadata(path=meta_path, scheme='legacy') - req_path = os.path.join(p, 'requires.txt') - tl_path = os.path.join(p, 'top_level.txt') - requires = parse_requires_path(req_path) - else: - # FIXME handle the case where zipfile is not available - zipf = zipimport.zipimporter(path) - fileobj = StringIO( - zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) - metadata = Metadata(fileobj=fileobj, scheme='legacy') - try: - data = zipf.get_data('EGG-INFO/requires.txt') - tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') - requires = parse_requires_data(data.decode('utf-8')) - except IOError: - requires = None - elif path.endswith('.egg-info'): - if os.path.isdir(path): - req_path = os.path.join(path, 'requires.txt') - requires = parse_requires_path(req_path) - path = os.path.join(path, 'PKG-INFO') - tl_path = os.path.join(path, 'top_level.txt') - metadata = Metadata(path=path, scheme='legacy') - else: - raise DistlibException('path must end with .egg-info or .egg, ' - 'got %r' % path) - - if requires: - metadata.add_requirements(requires) - # look for top-level modules in top_level.txt, if present - if tl_data is None: - if tl_path is not None and os.path.exists(tl_path): - with open(tl_path, 'rb') as f: - tl_data = f.read().decode('utf-8') - if not tl_data: - tl_data = [] - else: - tl_data = tl_data.splitlines() - self.modules = tl_data - return metadata - - def __repr__(self): - return '' % ( - self.name, self.version, self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - for path, _, _ in self.list_installed_files(): - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - return mismatches - - def list_installed_files(self): - """ - Iterates over the ``installed-files.txt`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: a list of (path, hash, size) - """ - - def _md5(path): - f = open(path, 'rb') - try: - content = f.read() - finally: - f.close() - return hashlib.md5(content).hexdigest() - - def _size(path): - return os.stat(path).st_size - - record_path = os.path.join(self.path, 'installed-files.txt') - result = [] - if os.path.exists(record_path): - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - p = os.path.normpath(os.path.join(self.path, line)) - # "./" is present as a marker between installed files - # and installation metadata files - if not os.path.exists(p): - logger.warning('Non-existent file: %s', p) - if p.endswith(('.pyc', '.pyo')): - continue - #otherwise fall through and fail - if not os.path.isdir(p): - result.append((p, _md5(p), _size(p))) - result.append((record_path, None, None)) - return result - - def list_distinfo_files(self, absolute=False): - """ - Iterates over the ``installed-files.txt`` entries and returns paths for - each line if the path is pointing to a file located in the - ``.egg-info`` directory or one of its subdirectories. - - :parameter absolute: If *absolute* is ``True``, each returned path is - transformed into a local absolute path. Otherwise the - raw value from ``installed-files.txt`` is returned. - :type absolute: boolean - :returns: iterator of paths - """ - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - skip = True - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - if line == './': - skip = False - continue - if not skip: - p = os.path.normpath(os.path.join(self.path, line)) - if p.startswith(self.path): - if absolute: - yield p - else: - yield line - - def __eq__(self, other): - return (isinstance(other, EggInfoDistribution) and - self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - -new_dist_class = InstalledDistribution -old_dist_class = EggInfoDistribution - - -class DependencyGraph(object): - """ - Represents a dependency graph between distributions. - - The dependency relationships are stored in an ``adjacency_list`` that maps - distributions to a list of ``(other, label)`` tuples where ``other`` - is a distribution and the edge is labeled with ``label`` (i.e. the version - specifier, if such was provided). Also, for more efficient traversal, for - every distribution ``x``, a list of predecessors is kept in - ``reverse_list[x]``. An edge from distribution ``a`` to - distribution ``b`` means that ``a`` depends on ``b``. If any missing - dependencies are found, they are stored in ``missing``, which is a - dictionary that maps distributions to a list of requirements that were not - provided by any other distributions. - """ - - def __init__(self): - self.adjacency_list = {} - self.reverse_list = {} - self.missing = {} - - def add_distribution(self, distribution): - """Add the *distribution* to the graph. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - """ - self.adjacency_list[distribution] = [] - self.reverse_list[distribution] = [] - #self.missing[distribution] = [] - - def add_edge(self, x, y, label=None): - """Add an edge from distribution *x* to distribution *y* with the given - *label*. - - :type x: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type y: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type label: ``str`` or ``None`` - """ - self.adjacency_list[x].append((y, label)) - # multiple edges are allowed, so be careful - if x not in self.reverse_list[y]: - self.reverse_list[y].append(x) - - def add_missing(self, distribution, requirement): - """ - Add a missing *requirement* for the given *distribution*. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - :type requirement: ``str`` - """ - logger.debug('%s missing %r', distribution, requirement) - self.missing.setdefault(distribution, []).append(requirement) - - def _repr_dist(self, dist): - return '%s %s' % (dist.name, dist.version) - - def repr_node(self, dist, level=1): - """Prints only a subgraph""" - output = [self._repr_dist(dist)] - for other, label in self.adjacency_list[dist]: - dist = self._repr_dist(other) - if label is not None: - dist = '%s [%s]' % (dist, label) - output.append(' ' * level + str(dist)) - suboutput = self.repr_node(other, level + 1) - subs = suboutput.split('\n') - output.extend(subs[1:]) - return '\n'.join(output) - - def to_dot(self, f, skip_disconnected=True): - """Writes a DOT output for the graph to the provided file *f*. - - If *skip_disconnected* is set to ``True``, then all distributions - that are not dependent on any other distribution are skipped. - - :type f: has to support ``file``-like operations - :type skip_disconnected: ``bool`` - """ - disconnected = [] - - f.write("digraph dependencies {\n") - for dist, adjs in self.adjacency_list.items(): - if len(adjs) == 0 and not skip_disconnected: - disconnected.append(dist) - for other, label in adjs: - if not label is None: - f.write('"%s" -> "%s" [label="%s"]\n' % - (dist.name, other.name, label)) - else: - f.write('"%s" -> "%s"\n' % (dist.name, other.name)) - if not skip_disconnected and len(disconnected) > 0: - f.write('subgraph disconnected {\n') - f.write('label = "Disconnected"\n') - f.write('bgcolor = red\n') - - for dist in disconnected: - f.write('"%s"' % dist.name) - f.write('\n') - f.write('}\n') - f.write('}\n') - - def topological_sort(self): - """ - Perform a topological sort of the graph. - :return: A tuple, the first element of which is a topologically sorted - list of distributions, and the second element of which is a - list of distributions that cannot be sorted because they have - circular dependencies and so form a cycle. - """ - result = [] - # Make a shallow copy of the adjacency list - alist = {} - for k, v in self.adjacency_list.items(): - alist[k] = v[:] - while True: - # See what we can remove in this run - to_remove = [] - for k, v in list(alist.items())[:]: - if not v: - to_remove.append(k) - del alist[k] - if not to_remove: - # What's left in alist (if anything) is a cycle. - break - # Remove from the adjacency list of others - for k, v in alist.items(): - alist[k] = [(d, r) for d, r in v if d not in to_remove] - logger.debug('Moving to result: %s', - ['%s (%s)' % (d.name, d.version) for d in to_remove]) - result.extend(to_remove) - return result, list(alist.keys()) - - def __repr__(self): - """Representation of the graph""" - output = [] - for dist, adjs in self.adjacency_list.items(): - output.append(self.repr_node(dist)) - return '\n'.join(output) - - -def make_graph(dists, scheme='default'): - """Makes a dependency graph from the given distributions. - - :parameter dists: a list of distributions - :type dists: list of :class:`distutils2.database.InstalledDistribution` and - :class:`distutils2.database.EggInfoDistribution` instances - :rtype: a :class:`DependencyGraph` instance - """ - scheme = get_scheme(scheme) - graph = DependencyGraph() - provided = {} # maps names to lists of (version, dist) tuples - - # first, build the graph and find out what's provided - for dist in dists: - graph.add_distribution(dist) - - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - provided.setdefault(name, []).append((version, dist)) - - # now make the edges - for dist in dists: - requires = (dist.run_requires | dist.meta_requires | - dist.build_requires | dist.dev_requires) - for req in requires: - try: - matcher = scheme.matcher(req) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - matched = False - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - graph.add_edge(dist, provider, req) - matched = True - break - if not matched: - graph.add_missing(dist, req) - return graph - - -def get_dependent_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - dependent on *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - """ - if dist not in dists: - raise DistlibException('given distribution %r is not a member ' - 'of the list' % dist.name) - graph = make_graph(dists) - - dep = [dist] # dependent distributions - todo = graph.reverse_list[dist] # list of nodes we should inspect - - while todo: - d = todo.pop() - dep.append(d) - for succ in graph.reverse_list[d]: - if succ not in dep: - todo.append(succ) - - dep.pop(0) # remove dist from dep, was there to prevent infinite loops - return dep - - -def get_required_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - required by *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - """ - 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 - todo = graph.adjacency_list[dist] # list of nodes we should inspect - - while todo: - d = todo.pop()[0] - req.append(d) - for pred in graph.adjacency_list[d]: - if pred not in req: - todo.append(pred) - - return req - - -def make_dist(name, version, **kwargs): - """ - A convenience method for making a dist given just a name and version. - """ - summary = kwargs.pop('summary', 'Placeholder for summary') - md = Metadata(**kwargs) - md.name = name - md.version = version - md.summary = summary or 'Placeholder for summary' - return Distribution(md) diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/index.py b/venv/Lib/site-packages/pip/_vendor/distlib/index.py deleted file mode 100644 index 7a87cdc..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/index.py +++ /dev/null @@ -1,516 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import hashlib -import logging -import os -import shutil -import subprocess -import tempfile -try: - from threading import Thread -except ImportError: - from dummy_threading import Thread - -from . import DistlibException -from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, - urlparse, build_opener, string_types) -from .util import cached_property, zip_dir, ServerProxy - -logger = logging.getLogger(__name__) - -DEFAULT_INDEX = 'https://pypi.org/pypi' -DEFAULT_REALM = 'pypi' - -class PackageIndex(object): - """ - This class represents a package index compatible with PyPI, the Python - Package Index. - """ - - boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' - - def __init__(self, url=None): - """ - Initialise an instance. - - :param url: The URL of the index. If not specified, the URL for PyPI is - used. - """ - self.url = url or DEFAULT_INDEX - self.read_configuration() - scheme, netloc, path, params, query, frag = urlparse(self.url) - if params or query or frag or scheme not in ('http', 'https'): - raise DistlibException('invalid repository: %s' % self.url) - self.password_handler = None - self.ssl_verifier = None - self.gpg = None - self.gpg_home = None - with open(os.devnull, 'w') as sink: - # Use gpg by default rather than gpg2, as gpg2 insists on - # prompting for passwords - for s in ('gpg', 'gpg2'): - try: - rc = subprocess.check_call([s, '--version'], stdout=sink, - stderr=sink) - if rc == 0: - self.gpg = s - break - except OSError: - pass - - def _get_pypirc_command(self): - """ - Get the distutils command for interacting with PyPI configurations. - :return: the command. - """ - from distutils.core import Distribution - from distutils.config import PyPIRCCommand - d = Distribution() - return PyPIRCCommand(d) - - def read_configuration(self): - """ - Read the PyPI access configuration as supported by distutils, getting - PyPI to do the actual work. This populates ``username``, ``password``, - ``realm`` and ``url`` attributes from the configuration. - """ - # get distutils to do the work - c = self._get_pypirc_command() - c.repository = self.url - cfg = c._read_pypirc() - self.username = cfg.get('username') - self.password = cfg.get('password') - self.realm = cfg.get('realm', 'pypi') - self.url = cfg.get('repository', self.url) - - def save_configuration(self): - """ - Save the PyPI access configuration. You must have set ``username`` and - ``password`` attributes before calling this method. - - Again, distutils is used to do the actual work. - """ - self.check_credentials() - # get distutils to do the work - c = self._get_pypirc_command() - c._store_pypirc(self.username, self.password) - - def check_credentials(self): - """ - Check that ``username`` and ``password`` have been set, and raise an - exception if not. - """ - if self.username is None or self.password is None: - raise DistlibException('username and password must be set') - pm = HTTPPasswordMgr() - _, netloc, _, _, _, _ = urlparse(self.url) - pm.add_password(self.realm, netloc, self.username, self.password) - self.password_handler = HTTPBasicAuthHandler(pm) - - def register(self, metadata): - """ - Register a distribution on PyPI, using the provided metadata. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the distribution to be - registered. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - metadata.validate() - d = metadata.todict() - d[':action'] = 'verify' - request = self.encode_request(d.items(), []) - response = self.send_request(request) - d[':action'] = 'submit' - request = self.encode_request(d.items(), []) - return self.send_request(request) - - def _reader(self, name, stream, outbuf): - """ - Thread runner for reading lines of from a subprocess into a buffer. - - :param name: The logical name of the stream (used for logging only). - :param stream: The stream to read from. This will typically a pipe - connected to the output stream of a subprocess. - :param outbuf: The list to append the read lines to. - """ - while True: - s = stream.readline() - if not s: - break - s = s.decode('utf-8').rstrip() - outbuf.append(s) - logger.debug('%s: %s' % (name, s)) - stream.close() - - def get_sign_command(self, filename, signer, sign_password, - keystore=None): - """ - Return a suitable command for signing a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The signing command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - if sign_password is not None: - cmd.extend(['--batch', '--passphrase-fd', '0']) - td = tempfile.mkdtemp() - sf = os.path.join(td, os.path.basename(filename) + '.asc') - cmd.extend(['--detach-sign', '--armor', '--local-user', - signer, '--output', sf, filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd, sf - - def run_command(self, cmd, input_data=None): - """ - Run a command in a child process , passing it any input data specified. - - :param cmd: The command to run. - :param input_data: If specified, this must be a byte string containing - data to be sent to the child process. - :return: A tuple consisting of the subprocess' exit code, a list of - lines read from the subprocess' ``stdout``, and a list of - lines read from the subprocess' ``stderr``. - """ - kwargs = { - 'stdout': subprocess.PIPE, - 'stderr': subprocess.PIPE, - } - if input_data is not None: - kwargs['stdin'] = subprocess.PIPE - stdout = [] - stderr = [] - p = subprocess.Popen(cmd, **kwargs) - # We don't use communicate() here because we may need to - # get clever with interacting with the command - t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) - t1.start() - t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) - t2.start() - if input_data is not None: - p.stdin.write(input_data) - p.stdin.close() - - p.wait() - t1.join() - t2.join() - return p.returncode, stdout, stderr - - def sign_file(self, filename, signer, sign_password, keystore=None): - """ - Sign a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The absolute pathname of the file where the signature is - stored. - """ - cmd, sig_file = self.get_sign_command(filename, signer, sign_password, - keystore) - rc, stdout, stderr = self.run_command(cmd, - sign_password.encode('utf-8')) - if rc != 0: - raise DistlibException('sign command failed with error ' - 'code %s' % rc) - return sig_file - - def upload_file(self, metadata, filename, signer=None, sign_password=None, - filetype='sdist', pyversion='source', keystore=None): - """ - Upload a release file to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the file to be uploaded. - :param filename: The pathname of the file to be uploaded. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param filetype: The type of the file being uploaded. This is the - distutils command which produced that file, e.g. - ``sdist`` or ``bdist_wheel``. - :param pyversion: The version of Python which the release relates - to. For code compatible with any Python, this would - be ``source``, otherwise it would be e.g. ``3.2``. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.exists(filename): - raise DistlibException('not found: %s' % filename) - metadata.validate() - d = metadata.todict() - sig_file = None - if signer: - if not self.gpg: - logger.warning('no signing program available - not signed') - else: - sig_file = self.sign_file(filename, signer, sign_password, - keystore) - with open(filename, 'rb') as f: - file_data = f.read() - md5_digest = hashlib.md5(file_data).hexdigest() - sha256_digest = hashlib.sha256(file_data).hexdigest() - d.update({ - ':action': 'file_upload', - 'protocol_version': '1', - 'filetype': filetype, - 'pyversion': pyversion, - 'md5_digest': md5_digest, - 'sha256_digest': sha256_digest, - }) - files = [('content', os.path.basename(filename), file_data)] - if sig_file: - with open(sig_file, 'rb') as f: - sig_data = f.read() - files.append(('gpg_signature', os.path.basename(sig_file), - sig_data)) - shutil.rmtree(os.path.dirname(sig_file)) - request = self.encode_request(d.items(), files) - return self.send_request(request) - - def upload_documentation(self, metadata, doc_dir): - """ - Upload documentation to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the documentation to be - uploaded. - :param doc_dir: The pathname of the directory which contains the - documentation. This should be the directory that - contains the ``index.html`` for the documentation. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.isdir(doc_dir): - raise DistlibException('not a directory: %r' % doc_dir) - fn = os.path.join(doc_dir, 'index.html') - if not os.path.exists(fn): - raise DistlibException('not found: %r' % fn) - metadata.validate() - name, version = metadata.name, metadata.version - zip_data = zip_dir(doc_dir).getvalue() - fields = [(':action', 'doc_upload'), - ('name', name), ('version', version)] - files = [('content', name, zip_data)] - request = self.encode_request(fields, files) - return self.send_request(request) - - def get_verify_command(self, signature_filename, data_filename, - keystore=None): - """ - Return a suitable command for verifying a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The verifying command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - cmd.extend(['--verify', signature_filename, data_filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd - - def verify_signature(self, signature_filename, data_filename, - keystore=None): - """ - Verify a signature for a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: True if the signature was verified, else False. - """ - if not self.gpg: - raise DistlibException('verification unavailable because gpg ' - 'unavailable') - cmd = self.get_verify_command(signature_filename, data_filename, - keystore) - rc, stdout, stderr = self.run_command(cmd) - if rc not in (0, 1): - raise DistlibException('verify command failed with error ' - 'code %s' % rc) - return rc == 0 - - def download_file(self, url, destfile, digest=None, reporthook=None): - """ - This is a convenience method for downloading a file from an URL. - Normally, this will be a file from the index, though currently - no check is made for this (i.e. a file can be downloaded from - anywhere). - - The method is just like the :func:`urlretrieve` function in the - standard library, except that it allows digest computation to be - done during download and checking that the downloaded data - matched any expected value. - - :param url: The URL of the file to be downloaded (assumed to be - available via an HTTP GET request). - :param destfile: The pathname where the downloaded file is to be - saved. - :param digest: If specified, this must be a (hasher, value) - tuple, where hasher is the algorithm used (e.g. - ``'md5'``) and ``value`` is the expected value. - :param reporthook: The same as for :func:`urlretrieve` in the - standard library. - """ - if digest is None: - digester = None - logger.debug('No digest specified') - else: - if isinstance(digest, (list, tuple)): - hasher, digest = digest - else: - hasher = 'md5' - digester = getattr(hashlib, hasher)() - logger.debug('Digest specified: %s' % digest) - # The following code is equivalent to urlretrieve. - # We need to do it this way so that we can compute the - # digest of the file as we go. - with open(destfile, 'wb') as dfp: - # addinfourl is not a context manager on 2.x - # so we have to use try/finally - sfp = self.send_request(Request(url)) - try: - headers = sfp.info() - blocksize = 8192 - size = -1 - read = 0 - blocknum = 0 - if "content-length" in headers: - size = int(headers["Content-Length"]) - if reporthook: - reporthook(blocknum, blocksize, size) - while True: - block = sfp.read(blocksize) - if not block: - break - read += len(block) - dfp.write(block) - if digester: - digester.update(block) - blocknum += 1 - if reporthook: - reporthook(blocknum, blocksize, size) - finally: - sfp.close() - - # check that we got the whole file, if we can - if size >= 0 and read < size: - raise DistlibException( - 'retrieval incomplete: got only %d out of %d bytes' - % (read, size)) - # if we have a digest, it must match. - if digester: - actual = digester.hexdigest() - if digest != actual: - raise DistlibException('%s digest mismatch for %s: expected ' - '%s, got %s' % (hasher, destfile, - digest, actual)) - logger.debug('Digest verified: %s', digest) - - def send_request(self, req): - """ - Send a standard library :class:`Request` to PyPI and return its - response. - - :param req: The request to send. - :return: The HTTP response from PyPI (a standard library HTTPResponse). - """ - handlers = [] - if self.password_handler: - handlers.append(self.password_handler) - if self.ssl_verifier: - handlers.append(self.ssl_verifier) - opener = build_opener(*handlers) - return opener.open(req) - - def encode_request(self, fields, files): - """ - Encode fields and files for posting to an HTTP server. - - :param fields: The fields to send as a list of (fieldname, value) - tuples. - :param files: The files to send as a list of (fieldname, filename, - file_bytes) tuple. - """ - # Adapted from packaging, which in turn was adapted from - # http://code.activestate.com/recipes/146306 - - parts = [] - boundary = self.boundary - for k, values in fields: - if not isinstance(values, (list, tuple)): - values = [values] - - for v in values: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"' % - k).encode('utf-8'), - b'', - v.encode('utf-8'))) - for key, filename, value in files: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"; filename="%s"' % - (key, filename)).encode('utf-8'), - b'', - value)) - - parts.extend((b'--' + boundary + b'--', b'')) - - body = b'\r\n'.join(parts) - ct = b'multipart/form-data; boundary=' + boundary - headers = { - 'Content-type': ct, - 'Content-length': str(len(body)) - } - return Request(self.url, body, headers) - - def search(self, terms, operator=None): - if isinstance(terms, string_types): - terms = {'name': terms} - rpc_proxy = ServerProxy(self.url, timeout=3.0) - try: - return rpc_proxy.search(terms, operator or 'and') - finally: - rpc_proxy('close')() diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/locators.py b/venv/Lib/site-packages/pip/_vendor/distlib/locators.py deleted file mode 100644 index 12a1d06..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/locators.py +++ /dev/null @@ -1,1302 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2015 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# - -import gzip -from io import BytesIO -import json -import logging -import os -import posixpath -import re -try: - import threading -except ImportError: # pragma: no cover - import dummy_threading as threading -import zlib - -from . import DistlibException -from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, - queue, quote, unescape, string_types, build_opener, - HTTPRedirectHandler as BaseRedirectHandler, text_type, - Request, HTTPError, URLError) -from .database import Distribution, DistributionPath, make_dist -from .metadata import Metadata, MetadataInvalidError -from .util import (cached_property, parse_credentials, ensure_slash, - split_filename, get_project_data, parse_requirement, - parse_name_and_version, ServerProxy, normalize_name) -from .version import get_scheme, UnsupportedVersionError -from .wheel import Wheel, is_compatible - -logger = logging.getLogger(__name__) - -HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') -CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) -HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') -DEFAULT_INDEX = 'https://pypi.org/pypi' - -def get_all_distribution_names(url=None): - """ - Return all distribution names known by an index. - :param url: The URL of the index. - :return: A list of all known distribution names. - """ - if url is None: - url = DEFAULT_INDEX - client = ServerProxy(url, timeout=3.0) - try: - return client.list_packages() - finally: - client('close')() - -class RedirectHandler(BaseRedirectHandler): - """ - A class to work around a bug in some Python 3.2.x releases. - """ - # There's a bug in the base version for some 3.2.x - # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header - # returns e.g. /abc, it bails because it says the scheme '' - # is bogus, when actually it should use the request's - # URL for the scheme. See Python issue #13696. - def http_error_302(self, req, fp, code, msg, headers): - # Some servers (incorrectly) return multiple Location headers - # (so probably same goes for URI). Use first header. - newurl = None - for key in ('location', 'uri'): - if key in headers: - newurl = headers[key] - break - if newurl is None: # pragma: no cover - return - urlparts = urlparse(newurl) - if urlparts.scheme == '': - newurl = urljoin(req.get_full_url(), newurl) - if hasattr(headers, 'replace_header'): - headers.replace_header(key, newurl) - else: - headers[key] = newurl - return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, - headers) - - http_error_301 = http_error_303 = http_error_307 = http_error_302 - -class Locator(object): - """ - A base class for locators - things that locate distributions. - """ - source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') - binary_extensions = ('.egg', '.exe', '.whl') - excluded_extensions = ('.pdf',) - - # A list of tags indicating which wheels you want to match. The default - # value of None matches against the tags compatible with the running - # Python. If you want to match other values, set wheel_tags on a locator - # instance to a list of tuples (pyver, abi, arch) which you want to match. - wheel_tags = None - - downloadable_extensions = source_extensions + ('.whl',) - - def __init__(self, scheme='default'): - """ - Initialise an instance. - :param scheme: Because locators look for most recent versions, they - need to know the version scheme to use. This specifies - the current PEP-recommended scheme - use ``'legacy'`` - if you need to support existing distributions on PyPI. - """ - self._cache = {} - self.scheme = scheme - # Because of bugs in some of the handlers on some of the platforms, - # we use our own opener rather than just using urlopen. - self.opener = build_opener(RedirectHandler()) - # If get_project() is called from locate(), the matcher instance - # is set from the requirement passed to locate(). See issue #18 for - # why this can be useful to know. - self.matcher = None - self.errors = queue.Queue() - - def get_errors(self): - """ - Return any errors which have occurred. - """ - result = [] - while not self.errors.empty(): # pragma: no cover - try: - e = self.errors.get(False) - result.append(e) - except self.errors.Empty: - continue - self.errors.task_done() - return result - - def clear_errors(self): - """ - Clear any errors which may have been logged. - """ - # Just get the errors and throw them away - self.get_errors() - - def clear_cache(self): - self._cache.clear() - - def _get_scheme(self): - return self._scheme - - def _set_scheme(self, value): - self._scheme = value - - scheme = property(_get_scheme, _set_scheme) - - def _get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This should be implemented in subclasses. - - If called from a locate() request, self.matcher will be set to a - matcher for the requirement to satisfy, otherwise it will be None. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This calls _get_project to do all the work, and just implements a caching layer on top. - """ - if self._cache is None: # pragma: no cover - result = self._get_project(name) - elif name in self._cache: - result = self._cache[name] - else: - self.clear_errors() - result = self._get_project(name) - self._cache[name] = result - return result - - def score_url(self, url): - """ - Give an url a score which can be used to choose preferred URLs - for a given project release. - """ - t = urlparse(url) - basename = posixpath.basename(t.path) - compatible = True - is_wheel = basename.endswith('.whl') - is_downloadable = basename.endswith(self.downloadable_extensions) - if is_wheel: - compatible = is_compatible(Wheel(basename), self.wheel_tags) - return (t.scheme == 'https', 'pypi.org' in t.netloc, - is_downloadable, is_wheel, compatible, basename) - - def prefer_url(self, url1, url2): - """ - Choose one of two URLs where both are candidates for distribution - archives for the same version of a distribution (for example, - .tar.gz vs. zip). - - The current implementation favours https:// URLs over http://, archives - from PyPI over those from other locations, wheel compatibility (if a - wheel) and then the archive name. - """ - result = url2 - if url1: - s1 = self.score_url(url1) - s2 = self.score_url(url2) - if s1 > s2: - result = url1 - if result != url2: - logger.debug('Not replacing %r with %r', url1, url2) - else: - logger.debug('Replacing %r with %r', url1, url2) - return result - - def split_filename(self, filename, project_name): - """ - Attempt to split a filename in project name, version and Python version. - """ - return split_filename(filename, project_name) - - def convert_url_to_download_info(self, url, project_name): - """ - See if a URL is a candidate for a download URL for a project (the URL - has typically been scraped from an HTML page). - - If it is, a dictionary is returned with keys "name", "version", - "filename" and "url"; otherwise, None is returned. - """ - def same_project(name1, name2): - return normalize_name(name1) == normalize_name(name2) - - result = None - scheme, netloc, path, params, query, frag = urlparse(url) - if frag.lower().startswith('egg='): # pragma: no cover - logger.debug('%s: version hint in fragment: %r', - project_name, frag) - m = HASHER_HASH.match(frag) - if m: - algo, digest = m.groups() - else: - algo, digest = None, None - origpath = path - if path and path[-1] == '/': # pragma: no cover - path = path[:-1] - if path.endswith('.whl'): - try: - wheel = Wheel(path) - if not is_compatible(wheel, self.wheel_tags): - logger.debug('Wheel not compatible: %s', path) - else: - if project_name is None: - include = True - else: - include = same_project(wheel.name, project_name) - if include: - result = { - 'name': wheel.name, - 'version': wheel.version, - 'filename': wheel.filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - 'python-version': ', '.join( - ['.'.join(list(v[2:])) for v in wheel.pyver]), - } - except Exception as e: # pragma: no cover - logger.warning('invalid path for wheel: %s', path) - elif not path.endswith(self.downloadable_extensions): # pragma: no cover - logger.debug('Not downloadable: %s', path) - else: # downloadable extension - path = filename = posixpath.basename(path) - for ext in self.downloadable_extensions: - if path.endswith(ext): - path = path[:-len(ext)] - t = self.split_filename(path, project_name) - if not t: # pragma: no cover - logger.debug('No match for project/version: %s', path) - else: - name, version, pyver = t - if not project_name or same_project(project_name, name): - result = { - 'name': name, - 'version': version, - 'filename': filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - #'packagetype': 'sdist', - } - if pyver: # pragma: no cover - result['python-version'] = pyver - break - if result and algo: - result['%s_digest' % algo] = digest - return result - - def _get_digest(self, info): - """ - Get a digest from a dictionary by looking at a "digests" dictionary - or keys of the form 'algo_digest'. - - Returns a 2-tuple (algo, digest) if found, else None. Currently - looks only for SHA256, then MD5. - """ - result = None - if 'digests' in info: - digests = info['digests'] - for algo in ('sha256', 'md5'): - if algo in digests: - result = (algo, digests[algo]) - break - if not result: - for algo in ('sha256', 'md5'): - key = '%s_digest' % algo - if key in info: - result = (algo, info[key]) - break - return result - - def _update_version_data(self, result, info): - """ - Update a result dictionary (the final result from _get_project) with a - dictionary for a specific version, which typically holds information - gleaned from a filename or URL for an archive for the distribution. - """ - name = info.pop('name') - version = info.pop('version') - if version in result: - dist = result[version] - md = dist.metadata - else: - dist = make_dist(name, version, scheme=self.scheme) - md = dist.metadata - dist.digest = digest = self._get_digest(info) - url = info['url'] - result['digests'][url] = digest - if md.source_url != info['url']: - md.source_url = self.prefer_url(md.source_url, url) - result['urls'].setdefault(version, set()).add(url) - dist.locator = self - result[version] = dist - - def locate(self, requirement, prereleases=False): - """ - Find the most recent distribution which matches the given - requirement. - - :param requirement: A requirement of the form 'foo (1.0)' or perhaps - 'foo (>= 1.0, < 2.0, != 1.3)' - :param prereleases: If ``True``, allow pre-release versions - to be located. Otherwise, pre-release versions - are not returned. - :return: A :class:`Distribution` instance, or ``None`` if no such - distribution could be located. - """ - result = None - r = parse_requirement(requirement) - if r is None: # pragma: no cover - raise DistlibException('Not a valid requirement: %r' % requirement) - scheme = get_scheme(self.scheme) - self.matcher = matcher = scheme.matcher(r.requirement) - logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) - versions = self.get_project(r.name) - if len(versions) > 2: # urls and digests keys are present - # sometimes, versions are invalid - slist = [] - vcls = matcher.version_class - for k in versions: - if k in ('urls', 'digests'): - continue - try: - if not matcher.match(k): - logger.debug('%s did not match %r', matcher, k) - else: - if prereleases or not vcls(k).is_prerelease: - slist.append(k) - else: - logger.debug('skipping pre-release ' - 'version %s of %s', k, matcher.name) - except Exception: # pragma: no cover - logger.warning('error matching %s with %r', matcher, k) - pass # slist.append(k) - if len(slist) > 1: - slist = sorted(slist, key=scheme.key) - if slist: - logger.debug('sorted list: %s', slist) - version = slist[-1] - result = versions[version] - if result: - if r.extras: - result.extras = r.extras - result.download_urls = versions.get('urls', {}).get(version, set()) - d = {} - sd = versions.get('digests', {}) - for url in result.download_urls: - if url in sd: # pragma: no cover - d[url] = sd[url] - result.digests = d - self.matcher = None - return result - - -class PyPIRPCLocator(Locator): - """ - This locator uses XML-RPC to locate distributions. It therefore - cannot be used with simple mirrors (that only mirror file content). - """ - def __init__(self, url, **kwargs): - """ - Initialise an instance. - - :param url: The URL to use for XML-RPC. - :param kwargs: Passed to the superclass constructor. - """ - super(PyPIRPCLocator, self).__init__(**kwargs) - self.base_url = url - self.client = ServerProxy(url, timeout=3.0) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - return set(self.client.list_packages()) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - versions = self.client.package_releases(name, True) - for v in versions: - urls = self.client.release_urls(name, v) - data = self.client.release_data(name, v) - metadata = Metadata(scheme=self.scheme) - metadata.name = data['name'] - metadata.version = data['version'] - metadata.license = data.get('license') - metadata.keywords = data.get('keywords', []) - metadata.summary = data.get('summary') - dist = Distribution(metadata) - if urls: - info = urls[0] - metadata.source_url = info['url'] - dist.digest = self._get_digest(info) - dist.locator = self - result[v] = dist - for info in urls: - url = info['url'] - digest = self._get_digest(info) - result['urls'].setdefault(v, set()).add(url) - result['digests'][url] = digest - return result - -class PyPIJSONLocator(Locator): - """ - This locator uses PyPI's JSON interface. It's very limited in functionality - and probably not worth using. - """ - def __init__(self, url, **kwargs): - super(PyPIJSONLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - url = urljoin(self.base_url, '%s/json' % quote(name)) - try: - resp = self.opener.open(url) - data = resp.read().decode() # for now - d = json.loads(data) - md = Metadata(scheme=self.scheme) - data = d['info'] - md.name = data['name'] - md.version = data['version'] - md.license = data.get('license') - md.keywords = data.get('keywords', []) - md.summary = data.get('summary') - dist = Distribution(md) - dist.locator = self - urls = d['urls'] - result[md.version] = dist - for info in d['urls']: - url = info['url'] - dist.download_urls.add(url) - dist.digests[url] = self._get_digest(info) - result['urls'].setdefault(md.version, set()).add(url) - result['digests'][url] = self._get_digest(info) - # Now get other releases - for version, infos in d['releases'].items(): - if version == md.version: - continue # already done - omd = Metadata(scheme=self.scheme) - omd.name = md.name - omd.version = version - odist = Distribution(omd) - odist.locator = self - result[version] = odist - for info in infos: - url = info['url'] - odist.download_urls.add(url) - odist.digests[url] = self._get_digest(info) - result['urls'].setdefault(version, set()).add(url) - result['digests'][url] = self._get_digest(info) -# for info in urls: -# md.source_url = info['url'] -# dist.digest = self._get_digest(info) -# dist.locator = self -# for info in urls: -# url = info['url'] -# result['urls'].setdefault(md.version, set()).add(url) -# result['digests'][url] = self._get_digest(info) - except Exception as e: - self.errors.put(text_type(e)) - logger.exception('JSON fetch failed: %s', e) - return result - - -class Page(object): - """ - This class represents a scraped HTML page. - """ - # The following slightly hairy-looking regex just looks for the contents of - # an anchor link, which has an attribute "href" either immediately preceded - # or immediately followed by a "rel" attribute. The attribute values can be - # declared with double quotes, single quotes or no quotes - which leads to - # the length of the expression. - _href = re.compile(""" -(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? -href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) -(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? -""", re.I | re.S | re.X) - _base = re.compile(r"""]+)""", re.I | re.S) - - def __init__(self, data, url): - """ - Initialise an instance with the Unicode page contents and the URL they - came from. - """ - self.data = data - self.base_url = self.url = url - m = self._base.search(self.data) - if m: - self.base_url = m.group(1) - - _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) - - @cached_property - def links(self): - """ - Return the URLs of all the links on a page together with information - about their "rel" attribute, for determining which ones to treat as - downloads and which ones to queue for further scraping. - """ - def clean(url): - "Tidy up an URL." - scheme, netloc, path, params, query, frag = urlparse(url) - return urlunparse((scheme, netloc, quote(path), - params, query, frag)) - - result = set() - for match in self._href.finditer(self.data): - d = match.groupdict('') - rel = (d['rel1'] or d['rel2'] or d['rel3'] or - d['rel4'] or d['rel5'] or d['rel6']) - url = d['url1'] or d['url2'] or d['url3'] - url = urljoin(self.base_url, url) - url = unescape(url) - url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) - result.add((url, rel)) - # We sort the result, hoping to bring the most recent versions - # to the front - result = sorted(result, key=lambda t: t[0], reverse=True) - return result - - -class SimpleScrapingLocator(Locator): - """ - A locator which scrapes HTML pages to locate downloads for a distribution. - This runs multiple threads to do the I/O; performance is at least as good - as pip's PackageFinder, which works in an analogous fashion. - """ - - # These are used to deal with various Content-Encoding schemes. - decoders = { - 'deflate': zlib.decompress, - 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), - 'none': lambda b: b, - } - - def __init__(self, url, timeout=None, num_workers=10, **kwargs): - """ - Initialise an instance. - :param url: The root URL to use for scraping. - :param timeout: The timeout, in seconds, to be applied to requests. - This defaults to ``None`` (no timeout specified). - :param num_workers: The number of worker threads you want to do I/O, - This defaults to 10. - :param kwargs: Passed to the superclass. - """ - super(SimpleScrapingLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - self.timeout = timeout - self._page_cache = {} - self._seen = set() - self._to_fetch = queue.Queue() - self._bad_hosts = set() - self.skip_externals = False - self.num_workers = num_workers - self._lock = threading.RLock() - # See issue #45: we need to be resilient when the locator is used - # in a thread, e.g. with concurrent.futures. We can't use self._lock - # as it is for coordinating our internal threads - the ones created - # in _prepare_threads. - self._gplock = threading.RLock() - self.platform_check = False # See issue #112 - - def _prepare_threads(self): - """ - Threads are created only when get_project is called, and terminate - before it returns. They are there primarily to parallelise I/O (i.e. - fetching web pages). - """ - self._threads = [] - for i in range(self.num_workers): - t = threading.Thread(target=self._fetch) - t.setDaemon(True) - t.start() - self._threads.append(t) - - def _wait_threads(self): - """ - Tell all the threads to terminate (by sending a sentinel value) and - wait for them to do so. - """ - # Note that you need two loops, since you can't say which - # thread will get each sentinel - for t in self._threads: - self._to_fetch.put(None) # sentinel - for t in self._threads: - t.join() - self._threads = [] - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - with self._gplock: - self.result = result - self.project_name = name - url = urljoin(self.base_url, '%s/' % quote(name)) - self._seen.clear() - self._page_cache.clear() - self._prepare_threads() - try: - logger.debug('Queueing %s', url) - self._to_fetch.put(url) - self._to_fetch.join() - finally: - self._wait_threads() - del self.result - return result - - platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' - r'win(32|_amd64)|macosx_?\d+)\b', re.I) - - def _is_platform_dependent(self, url): - """ - Does an URL refer to a platform-specific download? - """ - return self.platform_dependent.search(url) - - def _process_download(self, url): - """ - See if an URL is a suitable download for a project. - - If it is, register information in the result dictionary (for - _get_project) about the specific version it's for. - - Note that the return value isn't actually used other than as a boolean - value. - """ - if self.platform_check and self._is_platform_dependent(url): - info = None - else: - info = self.convert_url_to_download_info(url, self.project_name) - logger.debug('process_download: %s -> %s', url, info) - if info: - with self._lock: # needed because self.result is shared - self._update_version_data(self.result, info) - return info - - def _should_queue(self, link, referrer, rel): - """ - Determine whether a link URL from a referring page and with a - particular "rel" attribute should be queued for scraping. - """ - scheme, netloc, path, _, _, _ = urlparse(link) - if path.endswith(self.source_extensions + self.binary_extensions + - self.excluded_extensions): - result = False - elif self.skip_externals and not link.startswith(self.base_url): - result = False - elif not referrer.startswith(self.base_url): - result = False - elif rel not in ('homepage', 'download'): - result = False - elif scheme not in ('http', 'https', 'ftp'): - result = False - elif self._is_platform_dependent(link): - result = False - else: - host = netloc.split(':', 1)[0] - if host.lower() == 'localhost': - result = False - else: - result = True - logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, - referrer, result) - return result - - def _fetch(self): - """ - Get a URL to fetch from the work queue, get the HTML page, examine its - links for download candidates and candidates for further scraping. - - This is a handy method to run in a thread. - """ - while True: - url = self._to_fetch.get() - try: - if url: - page = self.get_page(url) - if page is None: # e.g. after an error - continue - for link, rel in page.links: - if link not in self._seen: - try: - self._seen.add(link) - if (not self._process_download(link) and - self._should_queue(link, url, rel)): - logger.debug('Queueing %s from %s', link, url) - self._to_fetch.put(link) - except MetadataInvalidError: # e.g. invalid versions - pass - except Exception as e: # pragma: no cover - self.errors.put(text_type(e)) - finally: - # always do this, to avoid hangs :-) - self._to_fetch.task_done() - if not url: - #logger.debug('Sentinel seen, quitting.') - break - - def get_page(self, url): - """ - Get the HTML for an URL, possibly from an in-memory cache. - - XXX TODO Note: this cache is never actually cleared. It's assumed that - the data won't get stale over the lifetime of a locator instance (not - necessarily true for the default_locator). - """ - # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api - scheme, netloc, path, _, _, _ = urlparse(url) - if scheme == 'file' and os.path.isdir(url2pathname(path)): - url = urljoin(ensure_slash(url), 'index.html') - - if url in self._page_cache: - result = self._page_cache[url] - logger.debug('Returning %s from cache: %s', url, result) - else: - host = netloc.split(':', 1)[0] - result = None - if host in self._bad_hosts: - logger.debug('Skipping %s due to bad host %s', url, host) - else: - req = Request(url, headers={'Accept-encoding': 'identity'}) - try: - logger.debug('Fetching %s', url) - resp = self.opener.open(req, timeout=self.timeout) - logger.debug('Fetched %s', url) - headers = resp.info() - content_type = headers.get('Content-Type', '') - if HTML_CONTENT_TYPE.match(content_type): - final_url = resp.geturl() - data = resp.read() - encoding = headers.get('Content-Encoding') - if encoding: - decoder = self.decoders[encoding] # fail if not found - data = decoder(data) - encoding = 'utf-8' - m = CHARSET.search(content_type) - if m: - encoding = m.group(1) - try: - data = data.decode(encoding) - except UnicodeError: # pragma: no cover - data = data.decode('latin-1') # fallback - result = Page(data, final_url) - self._page_cache[final_url] = result - except HTTPError as e: - if e.code != 404: - logger.exception('Fetch failed: %s: %s', url, e) - except URLError as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - with self._lock: - self._bad_hosts.add(host) - except Exception as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - finally: - self._page_cache[url] = result # even if None (failure) - return result - - _distname_re = re.compile(']*>([^<]+)<') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - page = self.get_page(self.base_url) - if not page: - raise DistlibException('Unable to get %s' % self.base_url) - for match in self._distname_re.finditer(page.data): - result.add(match.group(1)) - return result - -class DirectoryLocator(Locator): - """ - This class locates distributions in a directory tree. - """ - - def __init__(self, path, **kwargs): - """ - Initialise an instance. - :param path: The root of the directory tree to search. - :param kwargs: Passed to the superclass constructor, - except for: - * recursive - if True (the default), subdirectories are - recursed into. If False, only the top-level directory - is searched, - """ - self.recursive = kwargs.pop('recursive', True) - super(DirectoryLocator, self).__init__(**kwargs) - path = os.path.abspath(path) - if not os.path.isdir(path): # pragma: no cover - raise DistlibException('Not a directory: %r' % path) - self.base_dir = path - - def should_include(self, filename, parent): - """ - Should a filename be considered as a candidate for a distribution - archive? As well as the filename, the directory which contains it - is provided, though not used by the current implementation. - """ - return filename.endswith(self.downloadable_extensions) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, name) - if info: - self._update_version_data(result, info) - if not self.recursive: - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, None) - if info: - result.add(info['name']) - if not self.recursive: - break - return result - -class JSONLocator(Locator): - """ - This locator uses special extended metadata (not available on PyPI) and is - the basis of performant dependency resolution in distlib. Other locators - require archive downloads before dependencies can be determined! As you - might imagine, that can be slow. - """ - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - data = get_project_data(name) - if data: - for info in data.get('files', []): - if info['ptype'] != 'sdist' or info['pyversion'] != 'source': - continue - # We don't store summary in project metadata as it makes - # the data bigger for no benefit during dependency - # resolution - dist = make_dist(data['name'], info['version'], - summary=data.get('summary', - 'Placeholder for summary'), - scheme=self.scheme) - md = dist.metadata - md.source_url = info['url'] - # TODO SHA256 digest - if 'digest' in info and info['digest']: - dist.digest = ('md5', info['digest']) - md.dependencies = info.get('requirements', {}) - dist.exports = info.get('exports', {}) - result[dist.version] = dist - result['urls'].setdefault(dist.version, set()).add(info['url']) - return result - -class DistPathLocator(Locator): - """ - This locator finds installed distributions in a path. It can be useful for - adding to an :class:`AggregatingLocator`. - """ - def __init__(self, distpath, **kwargs): - """ - Initialise an instance. - - :param distpath: A :class:`DistributionPath` instance to search. - """ - super(DistPathLocator, self).__init__(**kwargs) - assert isinstance(distpath, DistributionPath) - self.distpath = distpath - - def _get_project(self, name): - dist = self.distpath.get_distribution(name) - if dist is None: - result = {'urls': {}, 'digests': {}} - else: - result = { - dist.version: dist, - 'urls': {dist.version: set([dist.source_url])}, - 'digests': {dist.version: set([None])} - } - return result - - -class AggregatingLocator(Locator): - """ - This class allows you to chain and/or merge a list of locators. - """ - def __init__(self, *locators, **kwargs): - """ - Initialise an instance. - - :param locators: The list of locators to search. - :param kwargs: Passed to the superclass constructor, - except for: - * merge - if False (the default), the first successful - search from any of the locators is returned. If True, - the results from all locators are merged (this can be - slow). - """ - self.merge = kwargs.pop('merge', False) - self.locators = locators - super(AggregatingLocator, self).__init__(**kwargs) - - def clear_cache(self): - super(AggregatingLocator, self).clear_cache() - for locator in self.locators: - locator.clear_cache() - - def _set_scheme(self, value): - self._scheme = value - for locator in self.locators: - locator.scheme = value - - scheme = property(Locator.scheme.fget, _set_scheme) - - def _get_project(self, name): - result = {} - for locator in self.locators: - d = locator.get_project(name) - if d: - if self.merge: - files = result.get('urls', {}) - digests = result.get('digests', {}) - # next line could overwrite result['urls'], result['digests'] - result.update(d) - df = result.get('urls') - if files and df: - for k, v in files.items(): - if k in df: - df[k] |= v - else: - df[k] = v - dd = result.get('digests') - if digests and dd: - dd.update(digests) - else: - # See issue #18. If any dists are found and we're looking - # for specific constraints, we only return something if - # a match is found. For example, if a DirectoryLocator - # returns just foo (1.0) while we're looking for - # foo (>= 2.0), we'll pretend there was nothing there so - # that subsequent locators can be queried. Otherwise we - # would just return foo (1.0) which would then lead to a - # failure to find foo (>= 2.0), because other locators - # weren't searched. Note that this only matters when - # merge=False. - if self.matcher is None: - found = True - else: - found = False - for k in d: - if self.matcher.match(k): - found = True - break - if found: - result = d - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for locator in self.locators: - try: - result |= locator.get_distribution_names() - except NotImplementedError: - pass - return result - - -# 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. -default_locator = AggregatingLocator( - JSONLocator(), - SimpleScrapingLocator('https://pypi.org/simple/', - timeout=3.0), - scheme='legacy') - -locate = default_locator.locate - -NAME_VERSION_RE = re.compile(r'(?P[\w-]+)\s*' - r'\(\s*(==\s*)?(?P[^)]+)\)$') - -class DependencyFinder(object): - """ - Locate dependencies for distributions. - """ - - def __init__(self, locator=None): - """ - Initialise an instance, using the specified locator - to locate distributions. - """ - self.locator = locator or default_locator - self.scheme = get_scheme(self.locator.scheme) - - def add_distribution(self, dist): - """ - Add a distribution to the finder. This will update internal information - about who provides what. - :param dist: The distribution to add. - """ - logger.debug('adding distribution %s', dist) - name = dist.key - self.dists_by_name[name] = dist - self.dists[(name, dist.version)] = dist - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - self.provided.setdefault(name, set()).add((version, dist)) - - def remove_distribution(self, dist): - """ - Remove a distribution from the finder. This will update internal - information about who provides what. - :param dist: The distribution to remove. - """ - logger.debug('removing distribution %s', dist) - name = dist.key - del self.dists_by_name[name] - del self.dists[(name, dist.version)] - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Remove from provided: %s, %s, %s', name, version, dist) - s = self.provided[name] - s.remove((version, dist)) - if not s: - del self.provided[name] - - def get_matcher(self, reqt): - """ - Get a version matcher for a requirement. - :param reqt: The requirement - :type reqt: str - :return: A version matcher (an instance of - :class:`distlib.version.Matcher`). - """ - try: - matcher = self.scheme.matcher(reqt) - except UnsupportedVersionError: # pragma: no cover - # XXX compat-mode if cannot read the version - name = reqt.split()[0] - matcher = self.scheme.matcher(name) - return matcher - - def find_providers(self, reqt): - """ - Find the distributions which can fulfill a requirement. - - :param reqt: The requirement. - :type reqt: str - :return: A set of distribution which can fulfill the requirement. - """ - matcher = self.get_matcher(reqt) - name = matcher.key # case-insensitive - result = set() - provided = self.provided - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - result.add(provider) - break - return result - - def try_to_replace(self, provider, other, problems): - """ - Attempt to replace one provider with another. This is typically used - when resolving dependencies from multiple sources, e.g. A requires - (B >= 1.0) while C requires (B >= 1.1). - - For successful replacement, ``provider`` must meet all the requirements - which ``other`` fulfills. - - :param provider: The provider we are trying to replace with. - :param other: The provider we're trying to replace. - :param problems: If False is returned, this will contain what - problems prevented replacement. This is currently - a tuple of the literal string 'cantreplace', - ``provider``, ``other`` and the set of requirements - that ``provider`` couldn't fulfill. - :return: True if we can replace ``other`` with ``provider``, else - False. - """ - rlist = self.reqts[other] - unmatched = set() - for s in rlist: - matcher = self.get_matcher(s) - if not matcher.match(provider.version): - unmatched.add(s) - if unmatched: - # can't replace other with provider - problems.add(('cantreplace', provider, other, - frozenset(unmatched))) - result = False - else: - # can replace other with provider - self.remove_distribution(other) - del self.reqts[other] - for s in rlist: - self.reqts.setdefault(provider, set()).add(s) - self.add_distribution(provider) - result = True - return result - - def find(self, requirement, meta_extras=None, prereleases=False): - """ - Find a distribution and all distributions it depends on. - - :param requirement: The requirement specifying the distribution to - find, or a Distribution instance. - :param meta_extras: A list of meta extras such as :test:, :build: and - so on. - :param prereleases: If ``True``, allow pre-release versions to be - returned - otherwise, don't return prereleases - unless they're all that's available. - - Return a set of :class:`Distribution` instances and a set of - problems. - - The distributions returned should be such that they have the - :attr:`required` attribute set to ``True`` if they were - from the ``requirement`` passed to ``find()``, and they have the - :attr:`build_time_dependency` attribute set to ``True`` unless they - are post-installation dependencies of the ``requirement``. - - The problems should be a tuple consisting of the string - ``'unsatisfied'`` and the requirement which couldn't be satisfied - by any distribution known to the locator. - """ - - self.provided = {} - self.dists = {} - self.dists_by_name = {} - self.reqts = {} - - meta_extras = set(meta_extras or []) - if ':*:' in meta_extras: - meta_extras.remove(':*:') - # :meta: and :run: are implicitly included - meta_extras |= set([':test:', ':build:', ':dev:']) - - if isinstance(requirement, Distribution): - dist = odist = requirement - logger.debug('passed %s as requirement', odist) - else: - dist = odist = self.locator.locate(requirement, - prereleases=prereleases) - if dist is None: - raise DistlibException('Unable to locate %r' % requirement) - logger.debug('located %s', odist) - dist.requested = True - problems = set() - todo = set([dist]) - install_dists = set([odist]) - while todo: - dist = todo.pop() - name = dist.key # case-insensitive - if name not in self.dists_by_name: - self.add_distribution(dist) - else: - #import pdb; pdb.set_trace() - other = self.dists_by_name[name] - if other != dist: - self.try_to_replace(dist, other, problems) - - ireqts = dist.run_requires | dist.meta_requires - sreqts = dist.build_requires - ereqts = set() - if meta_extras and dist in install_dists: - for key in ('test', 'build', 'dev'): - e = ':%s:' % key - if e in meta_extras: - ereqts |= getattr(dist, '%s_requires' % key) - all_reqts = ireqts | sreqts | ereqts - for r in all_reqts: - providers = self.find_providers(r) - if not providers: - logger.debug('No providers found for %r', r) - provider = self.locator.locate(r, prereleases=prereleases) - # If no provider is found and we didn't consider - # prereleases, consider them now. - if provider is None and not prereleases: - provider = self.locator.locate(r, prereleases=True) - if provider is None: - logger.debug('Cannot satisfy %r', r) - problems.add(('unsatisfied', r)) - else: - n, v = provider.key, provider.version - if (n, v) not in self.dists: - todo.add(provider) - providers.add(provider) - if r in ireqts and dist in install_dists: - install_dists.add(provider) - logger.debug('Adding %s to install_dists', - provider.name_and_version) - for p in providers: - name = p.key - if name not in self.dists_by_name: - self.reqts.setdefault(p, set()).add(r) - else: - other = self.dists_by_name[name] - if other != p: - # see if other can be replaced by p - self.try_to_replace(p, other, problems) - - dists = set(self.dists.values()) - for dist in dists: - dist.build_time_dependency = dist not in install_dists - if dist.build_time_dependency: - logger.debug('%s is a build-time dependency only.', - dist.name_and_version) - logger.debug('find done for %s', odist) - return dists, problems diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py b/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py deleted file mode 100644 index ca0fe44..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py +++ /dev/null @@ -1,393 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2013 Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Class representing the list of files in a distribution. - -Equivalent to distutils.filelist, but fixes some problems. -""" -import fnmatch -import logging -import os -import re -import sys - -from . import DistlibException -from .compat import fsdecode -from .util import convert_path - - -__all__ = ['Manifest'] - -logger = logging.getLogger(__name__) - -# a \ followed by some spaces + EOL -_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) -_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) - -# -# Due to the different results returned by fnmatch.translate, we need -# to do slightly different processing for Python 2.7 and 3.2 ... this needed -# to be brought in for Python 3.6 onwards. -# -_PYTHON_VERSION = sys.version_info[:2] - -class Manifest(object): - """A list of files built by on exploring the filesystem and filtered by - applying various patterns to what we find there. - """ - - def __init__(self, base=None): - """ - Initialise an instance. - - :param base: The base directory to explore under. - """ - self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) - self.prefix = self.base + os.sep - self.allfiles = None - self.files = set() - - # - # Public API - # - - def findall(self): - """Find all files under the base and set ``allfiles`` to the absolute - pathnames of files found. - """ - from stat import S_ISREG, S_ISDIR, S_ISLNK - - self.allfiles = allfiles = [] - root = self.base - stack = [root] - pop = stack.pop - push = stack.append - - while stack: - root = pop() - names = os.listdir(root) - - for name in names: - fullname = os.path.join(root, name) - - # Avoid excess stat calls -- just one will do, thank you! - stat = os.stat(fullname) - mode = stat.st_mode - if S_ISREG(mode): - allfiles.append(fsdecode(fullname)) - elif S_ISDIR(mode) and not S_ISLNK(mode): - push(fullname) - - def add(self, item): - """ - Add a file to the manifest. - - :param item: The pathname to add. This can be relative to the base. - """ - if not item.startswith(self.prefix): - item = os.path.join(self.base, item) - self.files.add(os.path.normpath(item)) - - def add_many(self, items): - """ - Add a list of files to the manifest. - - :param items: The pathnames to add. These can be relative to the base. - """ - for item in items: - self.add(item) - - def sorted(self, wantdirs=False): - """ - Return sorted files in directory order - """ - - def add_dir(dirs, d): - dirs.add(d) - logger.debug('add_dir added %s', d) - if d != self.base: - parent, _ = os.path.split(d) - assert parent not in ('', '/') - add_dir(dirs, parent) - - result = set(self.files) # make a copy! - if wantdirs: - dirs = set() - for f in result: - add_dir(dirs, os.path.dirname(f)) - result |= dirs - return [os.path.join(*path_tuple) for path_tuple in - sorted(os.path.split(path) for path in result)] - - def clear(self): - """Clear all collected files.""" - self.files = set() - self.allfiles = [] - - def process_directive(self, directive): - """ - Process a directive which either adds some files from ``allfiles`` to - ``files``, or removes some files from ``files``. - - :param directive: The directive to process. This should be in a format - compatible with distutils ``MANIFEST.in`` files: - - http://docs.python.org/distutils/sourcedist.html#commands - """ - # Parse the line: split it up, make sure the right number of words - # is there, and return the relevant words. 'action' is always - # defined: it's the first word of the line. Which of the other - # three are defined depends on the action; it'll be either - # patterns, (dir and patterns), or (dirpattern). - action, patterns, thedir, dirpattern = self._parse_directive(directive) - - # OK, now we know that the action is valid and we have the - # right number of words on the line for that action -- so we - # can proceed with minimal error-checking. - if action == 'include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=True): - logger.warning('no files found matching %r', pattern) - - elif action == 'exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=True) - #if not found: - # logger.warning('no previously-included files ' - # 'found matching %r', pattern) - - elif action == 'global-include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=False): - logger.warning('no files found matching %r ' - 'anywhere in distribution', pattern) - - elif action == 'global-exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=False) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found anywhere in ' - # 'distribution', pattern) - - elif action == 'recursive-include': - for pattern in patterns: - if not self._include_pattern(pattern, prefix=thedir): - logger.warning('no files found matching %r ' - 'under directory %r', pattern, thedir) - - elif action == 'recursive-exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, prefix=thedir) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found under directory %r', - # pattern, thedir) - - elif action == 'graft': - if not self._include_pattern(None, prefix=dirpattern): - logger.warning('no directories found matching %r', - dirpattern) - - elif action == 'prune': - if not self._exclude_pattern(None, prefix=dirpattern): - logger.warning('no previously-included directories found ' - 'matching %r', dirpattern) - else: # pragma: no cover - # This should never happen, as it should be caught in - # _parse_template_line - raise DistlibException( - 'invalid action %r' % action) - - # - # Private API - # - - def _parse_directive(self, directive): - """ - Validate a directive. - :param directive: The directive to validate. - :return: A tuple of action, patterns, thedir, dir_patterns - """ - words = directive.split() - if len(words) == 1 and words[0] not in ('include', 'exclude', - 'global-include', - 'global-exclude', - 'recursive-include', - 'recursive-exclude', - 'graft', 'prune'): - # no action given, let's use the default 'include' - words.insert(0, 'include') - - action = words[0] - patterns = thedir = dir_pattern = None - - if action in ('include', 'exclude', - 'global-include', 'global-exclude'): - if len(words) < 2: - raise DistlibException( - '%r expects ...' % action) - - patterns = [convert_path(word) for word in words[1:]] - - elif action in ('recursive-include', 'recursive-exclude'): - if len(words) < 3: - raise DistlibException( - '%r expects

...' % action) - - thedir = convert_path(words[1]) - patterns = [convert_path(word) for word in words[2:]] - - elif action in ('graft', 'prune'): - if len(words) != 2: - raise DistlibException( - '%r expects a single ' % action) - - dir_pattern = convert_path(words[1]) - - else: - raise DistlibException('unknown action %r' % action) - - return action, patterns, thedir, dir_pattern - - def _include_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Select strings (presumably filenames) from 'self.files' that - match 'pattern', a Unix-style wildcard (glob) pattern. - - Patterns are not quite the same as implemented by the 'fnmatch' - module: '*' and '?' match non-special characters, where "special" - is platform-dependent: slash on Unix; colon, slash, and backslash on - DOS/Windows; and colon on Mac OS. - - If 'anchor' is true (the default), then the pattern match is more - stringent: "*.py" will match "foo.py" but not "foo/bar.py". If - 'anchor' is false, both of these will match. - - If 'prefix' is supplied, then only filenames starting with 'prefix' - (itself a pattern) and ending with 'pattern', with anything in between - them, will match. 'anchor' is ignored in this case. - - If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and - 'pattern' is assumed to be either a string containing a regex or a - regex object -- no translation is done, the regex is just compiled - and used as-is. - - Selected strings will be added to self.files. - - Return True if files are found. - """ - # XXX docstring lying about what the special chars are? - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - - # delayed loading of allfiles list - if self.allfiles is None: - self.findall() - - for name in self.allfiles: - if pattern_re.search(name): - self.files.add(name) - found = True - return found - - def _exclude_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Remove strings (presumably filenames) from 'files' that match - 'pattern'. - - Other parameters are the same as for 'include_pattern()', above. - The list 'self.files' is modified in place. Return True if files are - found. - - This API is public to allow e.g. exclusion of SCM subdirs, e.g. when - packaging source distributions - """ - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - for f in list(self.files): - if pattern_re.search(f): - self.files.remove(f) - found = True - return found - - def _translate_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Translate a shell-like wildcard pattern to a compiled regular - expression. - - Return the compiled regex. If 'is_regex' true, - then 'pattern' is directly compiled to a regex (if it's a string) - or just returned as-is (assumes it's a regex object). - """ - if is_regex: - if isinstance(pattern, str): - return re.compile(pattern) - else: - return pattern - - if _PYTHON_VERSION > (3, 2): - # ditch start and end characters - start, _, end = self._glob_to_re('_').partition('_') - - if pattern: - pattern_re = self._glob_to_re(pattern) - if _PYTHON_VERSION > (3, 2): - assert pattern_re.startswith(start) and pattern_re.endswith(end) - else: - pattern_re = '' - - base = re.escape(os.path.join(self.base, '')) - if prefix is not None: - # ditch end of pattern character - if _PYTHON_VERSION <= (3, 2): - empty_pattern = self._glob_to_re('') - prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] - else: - prefix_re = self._glob_to_re(prefix) - assert prefix_re.startswith(start) and prefix_re.endswith(end) - prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] - sep = os.sep - if os.sep == '\\': - sep = r'\\' - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + sep.join((prefix_re, - '.*' + pattern_re)) - else: - pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] - pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, - pattern_re, end) - else: # no prefix -- respect anchor flag - if anchor: - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + pattern_re - else: - pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) - - return re.compile(pattern_re) - - def _glob_to_re(self, pattern): - """Translate a shell-like glob pattern to a regular expression. - - Return a string containing the regex. Differs from - 'fnmatch.translate()' in that '*' does not match "special characters" - (which are platform-specific). - """ - pattern_re = fnmatch.translate(pattern) - - # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which - # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, - # and by extension they shouldn't match such "special characters" under - # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters (currently: just os.sep). - sep = os.sep - if os.sep == '\\': - # we're using a regex to manipulate a regex, so we need - # to escape the backslash twice - sep = r'\\\\' - escaped = r'\1[^%s]' % sep - pattern_re = re.sub(r'((? y, - '!=': lambda x, y: x != y, - '<': lambda x, y: x < y, - '<=': lambda x, y: x == y or x < y, - '>': lambda x, y: x > y, - '>=': lambda x, y: x == y or x > y, - 'and': lambda x, y: x and y, - 'or': lambda x, y: x or y, - 'in': lambda x, y: x in y, - 'not in': lambda x, y: x not in y, - } - - def evaluate(self, expr, context): - """ - Evaluate a marker expression returned by the :func:`parse_requirement` - function in the specified context. - """ - if isinstance(expr, string_types): - if expr[0] in '\'"': - result = expr[1:-1] - else: - if expr not in context: - raise SyntaxError('unknown variable: %s' % expr) - result = context[expr] - else: - assert isinstance(expr, dict) - op = expr['op'] - if op not in self.operations: - raise NotImplementedError('op not implemented: %s' % op) - elhs = expr['lhs'] - erhs = expr['rhs'] - if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): - raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) - - lhs = self.evaluate(elhs, context) - rhs = self.evaluate(erhs, context) - result = self.operations[op](lhs, rhs) - return result - -def default_context(): - def format_full_version(info): - version = '%s.%s.%s' % (info.major, info.minor, info.micro) - kind = info.releaselevel - if kind != 'final': - version += kind[0] + str(info.serial) - return version - - if hasattr(sys, 'implementation'): - implementation_version = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - implementation_version = '0' - implementation_name = '' - - result = { - 'implementation_name': implementation_name, - 'implementation_version': implementation_version, - 'os_name': os.name, - 'platform_machine': platform.machine(), - 'platform_python_implementation': platform.python_implementation(), - 'platform_release': platform.release(), - '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], - 'sys_platform': sys.platform, - } - return result - -DEFAULT_CONTEXT = default_context() -del default_context - -evaluator = Evaluator() - -def interpret(marker, execution_context=None): - """ - Interpret a marker and return a result depending on environment. - - :param marker: The marker to interpret. - :type marker: str - :param execution_context: The context used for name lookup. - :type execution_context: mapping - """ - try: - expr, rest = parse_marker(marker) - except Exception as e: - raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) - if rest and rest[0] != '#': - raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) - context = dict(DEFAULT_CONTEXT) - if execution_context: - context.update(execution_context) - return evaluator.evaluate(expr, context) diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py b/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py deleted file mode 100644 index 6d5e236..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py +++ /dev/null @@ -1,1056 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""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). -""" -from __future__ import unicode_literals - -import codecs -from email import message_from_file -import json -import logging -import re - - -from . import DistlibException, __version__ -from .compat import StringIO, string_types, text_type -from .markers import interpret -from .util import extract_by_key, get_extras -from .version import get_scheme, PEP440_VERSION_RE - -logger = logging.getLogger(__name__) - - -class MetadataMissingError(DistlibException): - """A required metadata is missing""" - - -class MetadataConflictError(DistlibException): - """Attempt to read or write metadata fields that are conflictual.""" - - -class MetadataUnrecognizedVersionError(DistlibException): - """Unknown metadata version number.""" - - -class MetadataInvalidError(DistlibException): - """A metadata value is invalid""" - -# public API of this module -__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] - -# Encoding used for the PKG-INFO files -PKG_INFO_ENCODING = 'utf-8' - -# preferred version. Hopefully will be changed -# to 1.2 once PEP 345 is supported everywhere -PKG_INFO_PREFERRED_VERSION = '1.1' - -_LINE_PREFIX_1_2 = re.compile('\n \\|') -_LINE_PREFIX_PRE_1_2 = re.compile('\n ') -_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License') - -_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License', 'Classifier', 'Download-URL', 'Obsoletes', - 'Provides', 'Requires') - -_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', - 'Download-URL') - -_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External') - -_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', - 'Obsoletes-Dist', 'Requires-External', 'Maintainer', - 'Maintainer-email', 'Project-URL') - -_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External', 'Private-Version', - 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', - 'Provides-Extra') - -_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', - 'Setup-Requires-Dist', 'Extension') - -# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in -# the metadata. Include them in the tuple literal below to allow them -# (for now). -_566_FIELDS = _426_FIELDS + ('Description-Content-Type', - 'Requires', 'Provides') - -_566_MARKERS = ('Description-Content-Type',) - -_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) - -EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') - - -def _version2fieldlist(version): - if version == '1.0': - return _241_FIELDS - elif version == '1.1': - return _314_FIELDS - elif version == '1.2': - return _345_FIELDS - elif version in ('1.3', '2.1'): - return _345_FIELDS + _566_FIELDS - elif version == '2.0': - return _426_FIELDS - raise MetadataUnrecognizedVersionError(version) - - -def _best_version(fields): - """Detect the best version depending on the fields used.""" - def _has_marker(keys, markers): - for marker in markers: - if marker in keys: - return True - return False - - keys = [] - for key, value in fields.items(): - if value in ([], 'UNKNOWN', None): - continue - keys.append(key) - - possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] - - # first let's try to see if a field is not part of one of the version - for key in keys: - if key not in _241_FIELDS and '1.0' in possible_versions: - possible_versions.remove('1.0') - logger.debug('Removed 1.0 due to %s', key) - if key not in _314_FIELDS and '1.1' in possible_versions: - possible_versions.remove('1.1') - logger.debug('Removed 1.1 due to %s', key) - if key not in _345_FIELDS and '1.2' in possible_versions: - possible_versions.remove('1.2') - logger.debug('Removed 1.2 due to %s', key) - if key not in _566_FIELDS and '1.3' in possible_versions: - possible_versions.remove('1.3') - logger.debug('Removed 1.3 due to %s', key) - if key not in _566_FIELDS and '2.1' in possible_versions: - 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) - - # possible_version contains qualified versions - if len(possible_versions) == 1: - return possible_versions[0] # found ! - elif len(possible_versions) == 0: - logger.debug('Out of options - unknown metadata set: %s', fields) - raise MetadataConflictError('Unknown metadata set') - - # let's see if one unique marker is found - 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') - - # we have the choice, 1.0, or 1.2, or 2.0 - # - 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: - # we couldn't find any specific marker - if PKG_INFO_PREFERRED_VERSION in possible_versions: - return PKG_INFO_PREFERRED_VERSION - if is_1_1: - return '1.1' - if is_1_2: - return '1.2' - if is_2_1: - return '2.1' - - return '2.0' - -# This follows the rules about transforming keys as described in -# https://www.python.org/dev/peps/pep-0566/#id17 -_ATTR2FIELD = { - name.lower().replace("-", "_"): name for name in _ALL_FIELDS -} -_FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()} - -_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') -_VERSIONS_FIELDS = ('Requires-Python',) -_VERSION_FIELDS = ('Version',) -_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', - 'Requires', 'Provides', 'Obsoletes-Dist', - 'Provides-Dist', 'Requires-Dist', 'Requires-External', - 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', - 'Provides-Extra', 'Extension') -_LISTTUPLEFIELDS = ('Project-URL',) - -_ELEMENTSFIELD = ('Keywords',) - -_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') - -_MISSING = object() - -_FILESAFE = re.compile('[^A-Za-z0-9.]+') - - -def _get_name_and_version(name, version, for_filename=False): - """Return the distribution name with version. - - If for_filename is true, return a filename-escaped form.""" - if for_filename: - # For both name and version any runs of non-alphanumeric or '.' - # characters are replaced with a single '-'. Additionally any - # spaces in the version string become '.' - name = _FILESAFE.sub('-', name) - version = _FILESAFE.sub('-', version.replace(' ', '.')) - return '%s-%s' % (name, version) - - -class LegacyMetadata(object): - """The legacy metadata of a release. - - Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can - instantiate the class with one of these arguments (or none): - - *path*, the path to a metadata file - - *fileobj* give a file-like object with metadata as content - - *mapping* is a dict-like object - - *scheme* is a version scheme name - """ - # TODO document the mapping API and UNKNOWN default key - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._fields = {} - self.requires_files = [] - self._dependencies = None - self.scheme = scheme - if path is not None: - self.read(path) - elif fileobj is not None: - self.read_file(fileobj) - elif mapping is not None: - self.update(mapping) - self.set_metadata_version() - - def set_metadata_version(self): - self._fields['Metadata-Version'] = _best_version(self._fields) - - def _write_field(self, fileobj, name, value): - fileobj.write('%s: %s\n' % (name, value)) - - def __getitem__(self, name): - return self.get(name) - - def __setitem__(self, name, value): - return self.set(name, value) - - def __delitem__(self, name): - field_name = self._convert_name(name) - try: - del self._fields[field_name] - except KeyError: - raise KeyError(name) - - def __contains__(self, name): - return (name in self._fields or - self._convert_name(name) in self._fields) - - def _convert_name(self, name): - if name in _ALL_FIELDS: - return name - name = name.replace('-', '_').lower() - return _ATTR2FIELD.get(name, name) - - def _default_value(self, name): - if name in _LISTFIELDS or name in _ELEMENTSFIELD: - return [] - return 'UNKNOWN' - - def _remove_line_prefix(self, value): - if self.metadata_version in ('1.0', '1.1'): - return _LINE_PREFIX_PRE_1_2.sub('\n', value) - else: - return _LINE_PREFIX_1_2.sub('\n', value) - - def __getattr__(self, name): - if name in _ATTR2FIELD: - return self[name] - raise AttributeError(name) - - # - # Public API - # - -# dependencies = property(_get_dependencies, _set_dependencies) - - def get_fullname(self, filesafe=False): - """Return the distribution name with version. - - If filesafe is true, return a filename-escaped form.""" - return _get_name_and_version(self['Name'], self['Version'], filesafe) - - def is_field(self, name): - """return True if name is a valid metadata key""" - name = self._convert_name(name) - return name in _ALL_FIELDS - - def is_multi_field(self, name): - name = self._convert_name(name) - return name in _LISTFIELDS - - def read(self, filepath): - """Read the metadata values from a file path.""" - fp = codecs.open(filepath, 'r', encoding='utf-8') - try: - self.read_file(fp) - finally: - fp.close() - - def read_file(self, fileob): - """Read the metadata values from a file object.""" - msg = message_from_file(fileob) - self._fields['Metadata-Version'] = msg['metadata-version'] - - # When reading, get all the fields we can - for field in _ALL_FIELDS: - if field not in msg: - continue - if field in _LISTFIELDS: - # we can have multiple lines - values = msg.get_all(field) - if field in _LISTTUPLEFIELDS and values is not None: - values = [tuple(value.split(',')) for value in values] - self.set(field, values) - else: - # single line - value = msg[field] - if value is not None and value != 'UNKNOWN': - self.set(field, value) - - # PEP 566 specifies that the body be used for the description, if - # available - body = msg.get_payload() - self["Description"] = body if body else self["Description"] - # logger.debug('Attempting to set metadata for %s', self) - # self.set_metadata_version() - - def write(self, filepath, skip_unknown=False): - """Write the metadata fields to filepath.""" - fp = codecs.open(filepath, 'w', encoding='utf-8') - try: - self.write_file(fp, skip_unknown) - finally: - fp.close() - - def write_file(self, fileobject, skip_unknown=False): - """Write the PKG-INFO format data to a file object.""" - self.set_metadata_version() - - for field in _version2fieldlist(self['Metadata-Version']): - values = self.get(field) - if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): - continue - if field in _ELEMENTSFIELD: - self._write_field(fileobject, field, ','.join(values)) - continue - if field not in _LISTFIELDS: - if field == 'Description': - if self.metadata_version in ('1.0', '1.1'): - values = values.replace('\n', '\n ') - else: - values = values.replace('\n', '\n |') - values = [values] - - if field in _LISTTUPLEFIELDS: - values = [','.join(value) for value in values] - - for value in values: - self._write_field(fileobject, field, value) - - def update(self, other=None, **kwargs): - """Set metadata values from the given iterable `other` and kwargs. - - Behavior is like `dict.update`: If `other` has a ``keys`` method, - they are looped over and ``self[key]`` is assigned ``other[key]``. - Else, ``other`` is an iterable of ``(key, value)`` iterables. - - Keys that don't match a metadata field or that have an empty value are - dropped. - """ - def _set(key, value): - if key in _ATTR2FIELD and value: - self.set(self._convert_name(key), value) - - if not other: - # other is None or empty container - pass - elif hasattr(other, 'keys'): - for k in other.keys(): - _set(k, other[k]) - else: - for k, v in other: - _set(k, v) - - if kwargs: - for k, v in kwargs.items(): - _set(k, v) - - def set(self, name, value): - """Control then set a metadata field.""" - name = self._convert_name(name) - - if ((name in _ELEMENTSFIELD or name == 'Platform') and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [v.strip() for v in value.split(',')] - else: - value = [] - elif (name in _LISTFIELDS and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [value] - else: - value = [] - - if logger.isEnabledFor(logging.WARNING): - project_name = self['Name'] - - scheme = get_scheme(self.scheme) - if name in _PREDICATE_FIELDS and value is not None: - for v in value: - # check that the values are valid - if not scheme.is_valid_matcher(v.split(';')[0]): - logger.warning( - "'%s': '%s' is not valid (field '%s')", - project_name, v, name) - # FIXME this rejects UNKNOWN, is that right? - elif name in _VERSIONS_FIELDS and value is not None: - if not scheme.is_valid_constraint_list(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - elif name in _VERSION_FIELDS and value is not None: - if not scheme.is_valid_version(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - - if name in _UNICODEFIELDS: - if name == 'Description': - value = self._remove_line_prefix(value) - - self._fields[name] = value - - def get(self, name, default=_MISSING): - """Get a metadata field.""" - name = self._convert_name(name) - if name not in self._fields: - if default is _MISSING: - default = self._default_value(name) - return default - if name in _UNICODEFIELDS: - value = self._fields[name] - return value - elif name in _LISTFIELDS: - value = self._fields[name] - if value is None: - return [] - res = [] - for val in value: - if name not in _LISTTUPLEFIELDS: - res.append(val) - else: - # That's for Project-URL - res.append((val[0], val[1])) - return res - - elif name in _ELEMENTSFIELD: - value = self._fields[name] - if isinstance(value, string_types): - return value.split(',') - return self._fields[name] - - def check(self, strict=False): - """Check if the metadata is compliant. If strict is True then raise if - no Name or Version are provided""" - self.set_metadata_version() - - # XXX should check the versions (if the file was loaded) - missing, warnings = [], [] - - for attr in ('Name', 'Version'): # required by PEP 345 - if attr not in self: - missing.append(attr) - - if strict and missing != []: - msg = 'missing required metadata: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - - for attr in ('Home-page', 'Author'): - if attr not in self: - missing.append(attr) - - # checking metadata 1.2 (XXX needs to check 1.1, 1.0) - if self['Metadata-Version'] != '1.2': - return missing, warnings - - scheme = get_scheme(self.scheme) - - def are_valid_constraints(value): - for v in value: - if not scheme.is_valid_matcher(v.split(';')[0]): - return False - return True - - for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), - (_VERSIONS_FIELDS, - scheme.is_valid_constraint_list), - (_VERSION_FIELDS, - scheme.is_valid_version)): - for field in fields: - value = self.get(field, None) - if value is not None and not controller(value): - warnings.append("Wrong value for '%s': %s" % (field, value)) - - return missing, warnings - - def todict(self, skip_missing=False): - """Return fields as a dict. - - Field names will be converted to use the underscore-lowercase style - instead of hyphen-mixed case (i.e. home_page instead of Home-page). - This is as per https://www.python.org/dev/peps/pep-0566/#id17. - """ - self.set_metadata_version() - - fields = _version2fieldlist(self['Metadata-Version']) - - data = {} - - for field_name in fields: - if not skip_missing or field_name in self._fields: - key = _FIELD2ATTR[field_name] - if key != 'project_url': - data[key] = self[field_name] - else: - data[key] = [','.join(u) for u in self[field_name]] - - return data - - def add_requirements(self, requirements): - if self['Metadata-Version'] == '1.1': - # we can't have 1.1 metadata *and* Setuptools requires - for field in ('Obsoletes', 'Requires', 'Provides'): - if field in self: - del self[field] - self['Requires-Dist'] += requirements - - # Mapping API - # TODO could add iter* variants - - def keys(self): - return list(_version2fieldlist(self['Metadata-Version'])) - - def __iter__(self): - for key in self.keys(): - yield key - - def values(self): - return [self[key] for key in self.keys()] - - def items(self): - return [(key, self[key]) for key in self.keys()] - - def __repr__(self): - return '<%s %s %s>' % (self.__class__.__name__, self.name, - self.version) - - -METADATA_FILENAME = 'pydist.json' -WHEEL_METADATA_FILENAME = 'metadata.json' -LEGACY_METADATA_FILENAME = 'METADATA' - - -class Metadata(object): - """ - The metadata of a release. This implementation uses 2.0 (JSON) - metadata where possible. If not possible, it wraps a LegacyMetadata - instance which handles the key-value metadata format. - """ - - METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') - - NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) - - VERSION_MATCHER = PEP440_VERSION_RE - - SUMMARY_MATCHER = re.compile('.{1,2047}') - - METADATA_VERSION = '2.0' - - GENERATOR = 'distlib (%s)' % __version__ - - MANDATORY_KEYS = { - 'name': (), - 'version': (), - 'summary': ('legacy',), - } - - INDEX_KEYS = ('name version license summary description author ' - 'author_email keywords platform home_page classifiers ' - 'download_url') - - DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' - 'dev_requires provides meta_requires obsoleted_by ' - 'supports_environments') - - SYNTAX_VALIDATORS = { - 'metadata_version': (METADATA_VERSION_MATCHER, ()), - 'name': (NAME_MATCHER, ('legacy',)), - 'version': (VERSION_MATCHER, ('legacy',)), - 'summary': (SUMMARY_MATCHER, ('legacy',)), - } - - __slots__ = ('_legacy', '_data', 'scheme') - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._legacy = None - self._data = None - self.scheme = scheme - #import pdb; pdb.set_trace() - if mapping is not None: - try: - self._validate_mapping(mapping, scheme) - self._data = mapping - except MetadataUnrecognizedVersionError: - self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) - self.validate() - else: - data = None - if path: - with open(path, 'rb') as f: - data = f.read() - elif fileobj: - data = fileobj.read() - if data is None: - # Initialised with no args - to be added - self._data = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - else: - if not isinstance(data, text_type): - data = data.decode('utf-8') - try: - self._data = json.loads(data) - self._validate_mapping(self._data, scheme) - except ValueError: - # Note: MetadataUnrecognizedVersionError does not - # inherit from ValueError (it's a DistlibException, - # which should not inherit from ValueError). - # The ValueError comes from the json.load - if that - # succeeds and we get a validation error, we want - # that to propagate - self._legacy = LegacyMetadata(fileobj=StringIO(data), - scheme=scheme) - self.validate() - - common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) - - none_list = (None, list) - none_dict = (None, dict) - - mapped_keys = { - 'run_requires': ('Requires-Dist', list), - 'build_requires': ('Setup-Requires-Dist', list), - 'dev_requires': none_list, - 'test_requires': none_list, - 'meta_requires': none_list, - 'extras': ('Provides-Extra', list), - 'modules': none_list, - 'namespaces': none_list, - 'exports': none_dict, - 'commands': none_dict, - 'classifiers': ('Classifier', list), - 'source_url': ('Download-URL', None), - 'metadata_version': ('Metadata-Version', None), - } - - del none_list, none_dict - - def __getattribute__(self, key): - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, maker = mapped[key] - if self._legacy: - if lk is None: - result = None if maker is None else maker() - else: - result = self._legacy.get(lk) - else: - value = None if maker is None else maker() - if key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - result = self._data.get(key, value) - else: - # special cases for PEP 459 - sentinel = object() - result = sentinel - d = self._data.get('extensions') - if d: - if key == 'commands': - result = d.get('python.commands', value) - elif key == 'classifiers': - d = d.get('python.details') - if d: - result = d.get(key, value) - else: - d = d.get('python.exports') - if not d: - d = self._data.get('python.exports') - if d: - result = d.get(key, value) - if result is sentinel: - result = value - elif key not in common: - result = object.__getattribute__(self, key) - elif self._legacy: - result = self._legacy.get(key) - else: - result = self._data.get(key) - return result - - def _validate_value(self, key, value, scheme=None): - if key in self.SYNTAX_VALIDATORS: - pattern, exclusions = self.SYNTAX_VALIDATORS[key] - if (scheme or self.scheme) not in exclusions: - m = pattern.match(value) - if not m: - raise MetadataInvalidError("'%s' is an invalid value for " - "the '%s' property" % (value, - key)) - - def __setattr__(self, key, value): - self._validate_value(key, value) - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, _ = mapped[key] - if self._legacy: - if lk is None: - raise NotImplementedError - self._legacy[lk] = value - elif key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - self._data[key] = value - else: - # special cases for PEP 459 - d = self._data.setdefault('extensions', {}) - if key == 'commands': - d['python.commands'] = value - elif key == 'classifiers': - d = d.setdefault('python.details', {}) - d[key] = value - else: - d = d.setdefault('python.exports', {}) - d[key] = value - elif key not in common: - object.__setattr__(self, key, value) - else: - if key == 'keywords': - if isinstance(value, string_types): - value = value.strip() - if value: - value = value.split() - else: - value = [] - if self._legacy: - self._legacy[key] = value - else: - self._data[key] = value - - @property - def name_and_version(self): - return _get_name_and_version(self.name, self.version, True) - - @property - def provides(self): - if self._legacy: - result = self._legacy['Provides-Dist'] - else: - result = self._data.setdefault('provides', []) - s = '%s (%s)' % (self.name, self.version) - if s not in result: - result.append(s) - return result - - @provides.setter - def provides(self, value): - if self._legacy: - self._legacy['Provides-Dist'] = value - else: - self._data['provides'] = value - - def get_requirements(self, reqts, extras=None, env=None): - """ - Base method to get dependencies, given a set of extras - to satisfy and an optional environment context. - :param reqts: A list of sometimes-wanted dependencies, - perhaps dependent on extras and environment. - :param extras: A list of optional components being requested. - :param env: An optional environment for marker evaluation. - """ - if self._legacy: - result = reqts - else: - result = [] - extras = get_extras(extras or [], self.extras) - for d in reqts: - if 'extra' not in d and 'environment' not in d: - # unconditional - include = True - else: - if 'extra' not in d: - # Not extra-dependent - only environment-dependent - include = True - else: - include = d.get('extra') in extras - if include: - # Not excluded because of extras, check environment - marker = d.get('environment') - if marker: - include = interpret(marker, env) - if include: - result.extend(d['requires']) - for key in ('build', 'dev', 'test'): - e = ':%s:' % key - if e in extras: - extras.remove(e) - # A recursive call, but it should terminate since 'test' - # has been removed from the extras - reqts = self._data.get('%s_requires' % key, []) - result.extend(self.get_requirements(reqts, extras=extras, - env=env)) - return result - - @property - def dictionary(self): - if self._legacy: - return self._from_legacy() - return self._data - - @property - def dependencies(self): - if self._legacy: - raise NotImplementedError - else: - return extract_by_key(self._data, self.DEPENDENCY_KEYS) - - @dependencies.setter - def dependencies(self, value): - if self._legacy: - raise NotImplementedError - else: - self._data.update(value) - - def _validate_mapping(self, mapping, scheme): - if mapping.get('metadata_version') != self.METADATA_VERSION: - raise MetadataUnrecognizedVersionError() - missing = [] - for key, exclusions in self.MANDATORY_KEYS.items(): - if key not in mapping: - if scheme not in exclusions: - missing.append(key) - if missing: - msg = 'Missing metadata items: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - for k, v in mapping.items(): - self._validate_value(k, v, scheme) - - def validate(self): - if self._legacy: - missing, warnings = self._legacy.check(True) - if missing or warnings: - logger.warning('Metadata: missing: %s, warnings: %s', - missing, warnings) - else: - self._validate_mapping(self._data, self.scheme) - - def todict(self): - if self._legacy: - return self._legacy.todict(True) - else: - result = extract_by_key(self._data, self.INDEX_KEYS) - return result - - def _from_legacy(self): - assert self._legacy and not self._data - result = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - lmd = self._legacy.todict(True) # skip missing ones - for k in ('name', 'version', 'license', 'summary', 'description', - 'classifier'): - if k in lmd: - if k == 'classifier': - nk = 'classifiers' - else: - nk = k - result[nk] = lmd[k] - kw = lmd.get('Keywords', []) - if kw == ['']: - kw = [] - result['keywords'] = kw - keys = (('requires_dist', 'run_requires'), - ('setup_requires_dist', 'build_requires')) - for ok, nk in keys: - if ok in lmd and lmd[ok]: - result[nk] = [{'requires': lmd[ok]}] - result['provides'] = self.provides - author = {} - maintainer = {} - return result - - LEGACY_MAPPING = { - 'name': 'Name', - 'version': 'Version', - ('extensions', 'python.details', 'license'): 'License', - 'summary': 'Summary', - 'description': 'Description', - ('extensions', 'python.project', 'project_urls', 'Home'): 'Home-page', - ('extensions', 'python.project', 'contacts', 0, 'name'): 'Author', - ('extensions', 'python.project', 'contacts', 0, 'email'): 'Author-email', - 'source_url': 'Download-URL', - ('extensions', 'python.details', 'classifiers'): 'Classifier', - } - - def _to_legacy(self): - def process_entries(entries): - reqts = set() - for e in entries: - extra = e.get('extra') - env = e.get('environment') - rlist = e['requires'] - for r in rlist: - if not env and not extra: - reqts.add(r) - else: - marker = '' - if extra: - marker = 'extra == "%s"' % extra - if env: - if marker: - marker = '(%s) and %s' % (env, marker) - else: - marker = env - reqts.add(';'.join((r, marker))) - return reqts - - assert self._data and not self._legacy - result = LegacyMetadata() - nmd = self._data - # import pdb; pdb.set_trace() - for nk, ok in self.LEGACY_MAPPING.items(): - if not isinstance(nk, tuple): - if nk in nmd: - result[ok] = nmd[nk] - else: - d = nmd - found = True - for k in nk: - try: - d = d[k] - except (KeyError, IndexError): - found = False - break - if found: - result[ok] = d - r1 = process_entries(self.run_requires + self.meta_requires) - r2 = process_entries(self.build_requires + self.dev_requires) - if self.extras: - result['Provides-Extra'] = sorted(self.extras) - result['Requires-Dist'] = sorted(r1) - result['Setup-Requires-Dist'] = sorted(r2) - # TODO: any other fields wanted - return result - - def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): - if [path, fileobj].count(None) != 1: - raise ValueError('Exactly one of path and fileobj is needed') - self.validate() - if legacy: - if self._legacy: - legacy_md = self._legacy - else: - legacy_md = self._to_legacy() - if path: - legacy_md.write(path, skip_unknown=skip_unknown) - else: - legacy_md.write_file(fileobj, skip_unknown=skip_unknown) - else: - if self._legacy: - d = self._from_legacy() - else: - d = self._data - if fileobj: - json.dump(d, fileobj, ensure_ascii=True, indent=2, - sort_keys=True) - else: - with codecs.open(path, 'w', 'utf-8') as f: - json.dump(d, f, ensure_ascii=True, indent=2, - sort_keys=True) - - def add_requirements(self, requirements): - if self._legacy: - self._legacy.add_requirements(requirements) - else: - run_requires = self._data.setdefault('run_requires', []) - always = None - for entry in run_requires: - if 'environment' not in entry and 'extra' not in entry: - always = entry - break - if always is None: - always = { 'requires': requirements } - run_requires.insert(0, always) - else: - rset = set(always['requires']) | set(requirements) - always['requires'] = sorted(rset) - - def __repr__(self): - name = self.name or '(no name)' - version = self.version or 'no version' - return '<%s %s %s (%s)>' % (self.__class__.__name__, - self.metadata_version, name, version) diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/resources.py b/venv/Lib/site-packages/pip/_vendor/distlib/resources.py deleted file mode 100644 index 1884016..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/resources.py +++ /dev/null @@ -1,355 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import unicode_literals - -import bisect -import io -import logging -import os -import pkgutil -import shutil -import sys -import types -import zipimport - -from . import DistlibException -from .util import cached_property, get_cache_base, path_to_cache_dir, Cache - -logger = logging.getLogger(__name__) - - -cache = None # created when needed - - -class ResourceCache(Cache): - def __init__(self, base=None): - if base is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('resource-cache')) - super(ResourceCache, self).__init__(base) - - def is_stale(self, resource, path): - """ - Is the cache stale for the given resource? - - :param resource: The :class:`Resource` being cached. - :param path: The path of the resource in the cache. - :return: True if the cache is stale. - """ - # Cache invalidation is a hard problem :-) - return True - - def get(self, resource): - """ - Get a resource into the cache, - - :param resource: A :class:`Resource` instance. - :return: The pathname of the resource in the cache. - """ - prefix, path = resource.finder.get_cache_info(resource) - if prefix is None: - result = path - else: - result = os.path.join(self.base, self.prefix_to_dir(prefix), path) - dirname = os.path.dirname(result) - if not os.path.isdir(dirname): - os.makedirs(dirname) - if not os.path.exists(result): - stale = True - else: - stale = self.is_stale(resource, path) - if stale: - # write the bytes of the resource to the cache location - with open(result, 'wb') as f: - f.write(resource.bytes) - return result - - -class ResourceBase(object): - def __init__(self, finder, name): - self.finder = finder - self.name = name - - -class Resource(ResourceBase): - """ - A class representing an in-package resource, such as a data file. This is - not normally instantiated by user code, but rather by a - :class:`ResourceFinder` which manages the resource. - """ - is_container = False # Backwards compatibility - - def as_stream(self): - """ - Get the resource as a stream. - - This is not a property to make it obvious that it returns a new stream - each time. - """ - return self.finder.get_stream(self) - - @cached_property - def file_path(self): - global cache - if cache is None: - cache = ResourceCache() - return cache.get(self) - - @cached_property - def bytes(self): - return self.finder.get_bytes(self) - - @cached_property - def size(self): - return self.finder.get_size(self) - - -class ResourceContainer(ResourceBase): - is_container = True # Backwards compatibility - - @cached_property - def resources(self): - return self.finder.get_resources(self) - - -class ResourceFinder(object): - """ - Resource finder for file system resources. - """ - - if sys.platform.startswith('java'): - skipped_extensions = ('.pyc', '.pyo', '.class') - else: - skipped_extensions = ('.pyc', '.pyo') - - def __init__(self, module): - self.module = module - self.loader = getattr(module, '__loader__', None) - self.base = os.path.dirname(getattr(module, '__file__', '')) - - def _adjust_path(self, path): - return os.path.realpath(path) - - def _make_path(self, resource_name): - # Issue #50: need to preserve type of path on Python 2.x - # like os.path._get_sep - if isinstance(resource_name, bytes): # should only happen on 2.x - sep = b'/' - else: - sep = '/' - parts = resource_name.split(sep) - parts.insert(0, self.base) - result = os.path.join(*parts) - return self._adjust_path(result) - - def _find(self, path): - return os.path.exists(path) - - def get_cache_info(self, resource): - return None, resource.path - - def find(self, resource_name): - path = self._make_path(resource_name) - if not self._find(path): - result = None - else: - if self._is_directory(path): - result = ResourceContainer(self, resource_name) - else: - result = Resource(self, resource_name) - result.path = path - return result - - def get_stream(self, resource): - return open(resource.path, 'rb') - - def get_bytes(self, resource): - with open(resource.path, 'rb') as f: - return f.read() - - def get_size(self, resource): - return os.path.getsize(resource.path) - - def get_resources(self, resource): - def allowed(f): - return (f != '__pycache__' and not - f.endswith(self.skipped_extensions)) - return set([f for f in os.listdir(resource.path) if allowed(f)]) - - def is_container(self, resource): - return self._is_directory(resource.path) - - _is_directory = staticmethod(os.path.isdir) - - def iterator(self, resource_name): - resource = self.find(resource_name) - if resource is not None: - todo = [resource] - while todo: - resource = todo.pop(0) - yield resource - if resource.is_container: - rname = resource.name - for name in resource.resources: - if not rname: - new_name = name - else: - new_name = '/'.join([rname, name]) - child = self.find(new_name) - if child.is_container: - todo.append(child) - else: - yield child - - -class ZipResourceFinder(ResourceFinder): - """ - Resource finder for resources in .zip files. - """ - def __init__(self, module): - super(ZipResourceFinder, self).__init__(module) - archive = self.loader.archive - self.prefix_len = 1 + len(archive) - # PyPy doesn't have a _files attr on zipimporter, and you can't set one - if hasattr(self.loader, '_files'): - self._files = self.loader._files - else: - self._files = zipimport._zip_directory_cache[archive] - self.index = sorted(self._files) - - def _adjust_path(self, path): - return path - - def _find(self, path): - path = path[self.prefix_len:] - if path in self._files: - result = True - else: - if path and path[-1] != os.sep: - path = path + os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - if not result: - logger.debug('_find failed: %r %r', path, self.loader.prefix) - else: - logger.debug('_find worked: %r %r', path, self.loader.prefix) - return result - - def get_cache_info(self, resource): - prefix = self.loader.archive - path = resource.path[1 + len(prefix):] - return prefix, path - - def get_bytes(self, resource): - return self.loader.get_data(resource.path) - - def get_stream(self, resource): - return io.BytesIO(self.get_bytes(resource)) - - def get_size(self, resource): - path = resource.path[self.prefix_len:] - return self._files[path][3] - - def get_resources(self, resource): - path = resource.path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - plen = len(path) - result = set() - i = bisect.bisect(self.index, path) - while i < len(self.index): - if not self.index[i].startswith(path): - break - s = self.index[i][plen:] - result.add(s.split(os.sep, 1)[0]) # only immediate children - i += 1 - return result - - def _is_directory(self, path): - path = path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - return result - -_finder_registry = { - type(None): ResourceFinder, - zipimport.zipimporter: ZipResourceFinder -} - -try: - # In Python 3.6, _frozen_importlib -> _frozen_importlib_external - try: - import _frozen_importlib_external as _fi - except ImportError: - import _frozen_importlib as _fi - _finder_registry[_fi.SourceFileLoader] = ResourceFinder - _finder_registry[_fi.FileFinder] = ResourceFinder - del _fi -except (ImportError, AttributeError): - pass - - -def register_finder(loader, finder_maker): - _finder_registry[type(loader)] = finder_maker - -_finder_cache = {} - - -def finder(package): - """ - Return a resource finder for a package. - :param package: The name of the package. - :return: A :class:`ResourceFinder` instance for the package. - """ - if package in _finder_cache: - result = _finder_cache[package] - else: - if package not in sys.modules: - __import__(package) - module = sys.modules[package] - path = getattr(module, '__path__', None) - if path is None: - raise DistlibException('You cannot get a finder for a module, ' - 'only for a package') - loader = getattr(module, '__loader__', None) - finder_maker = _finder_registry.get(type(loader)) - if finder_maker is None: - raise DistlibException('Unable to locate finder for %r' % package) - result = finder_maker(module) - _finder_cache[package] = result - return result - - -_dummy_module = types.ModuleType(str('__dummy__')) - - -def finder_for_path(path): - """ - Return a resource finder for a path, which should represent a container. - - :param path: The path. - :return: A :class:`ResourceFinder` instance for the path. - """ - result = None - # calls any path hooks, gets importer into cache - pkgutil.get_importer(path) - loader = sys.path_importer_cache.get(path) - finder = _finder_registry.get(type(loader)) - if finder: - module = _dummy_module - module.__file__ = os.path.join(path, '') - module.__loader__ = loader - result = finder(module) - return result diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py b/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py deleted file mode 100644 index 03f8f21..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +++ /dev/null @@ -1,419 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2015 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from io import BytesIO -import logging -import os -import re -import struct -import sys - -from .compat import sysconfig, detect_encoding, ZipFile -from .resources import finder -from .util import (FileOperator, get_export_entry, convert_path, - get_executable, in_venv) - -logger = logging.getLogger(__name__) - -_DEFAULT_MANIFEST = ''' - - - - - - - - - - - - -'''.strip() - -# check if Python is called on the first line with this expression -FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') -SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- -import re -import sys -from %(module)s import %(import_name)s -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(%(func)s()) -''' - - -def enquote_executable(executable): - if ' ' in executable: - # make sure we quote only the executable in case of env - # for example /usr/bin/env "/dir with spaces/bin/jython" - # instead of "/usr/bin/env /dir with spaces/bin/jython" - # otherwise whole - if executable.startswith('/usr/bin/env '): - env, _executable = executable.split(' ', 1) - if ' ' in _executable and not _executable.startswith('"'): - executable = '%s "%s"' % (env, _executable) - else: - if not executable.startswith('"'): - executable = '"%s"' % executable - return executable - -# Keep the old name around (for now), as there is at least one project using it! -_enquote_executable = enquote_executable - -class ScriptMaker(object): - """ - A class to copy or create scripts from source scripts or callable - specifications. - """ - script_template = SCRIPT_TEMPLATE - - executable = None # for shebangs - - def __init__(self, source_dir, target_dir, add_launchers=True, - dry_run=False, fileop=None): - self.source_dir = source_dir - self.target_dir = target_dir - self.add_launchers = add_launchers - self.force = False - self.clobber = False - # It only makes sense to set mode bits on POSIX. - self.set_mode = (os.name == 'posix') or (os.name == 'java' and - os._name == 'posix') - self.variants = set(('', 'X.Y')) - self._fileop = fileop or FileOperator(dry_run) - - self._is_nt = os.name == 'nt' or ( - os.name == 'java' and os._name == 'nt') - self.version_info = sys.version_info - - def _get_alternate_executable(self, executable, options): - if options.get('gui', False) and self._is_nt: # pragma: no cover - dn, fn = os.path.split(executable) - fn = fn.replace('python', 'pythonw') - executable = os.path.join(dn, fn) - return executable - - if sys.platform.startswith('java'): # pragma: no cover - def _is_shell(self, executable): - """ - Determine if the specified executable is a script - (contains a #! line) - """ - try: - with open(executable) as fp: - return fp.read(2) == '#!' - except (OSError, IOError): - logger.warning('Failed to open %s', executable) - return False - - def _fix_jython_executable(self, executable): - if self._is_shell(executable): - # Workaround for Jython is not needed on Linux systems. - import java - - if java.lang.System.getProperty('os.name') == 'Linux': - return executable - elif executable.lower().endswith('jython.exe'): - # Use wrapper exe for Jython on Windows - return executable - return '/usr/bin/env %s' % executable - - def _build_shebang(self, executable, post_interp): - """ - Build a shebang line. In the simple case (on Windows, or a shebang line - which is not too long or contains spaces) use a simple formulation for - the shebang. Otherwise, use /bin/sh as the executable, with a contrived - shebang which allows the script to run either under Python or sh, using - suitable quoting. Thanks to Harald Nordgren for his input. - - See also: http://www.in-ulm.de/~mascheck/various/shebang/#length - https://hg.mozilla.org/mozilla-central/file/tip/mach - """ - if os.name != 'posix': - simple_shebang = True - else: - # Add 3 for '#!' prefix and newline suffix. - shebang_length = len(executable) + len(post_interp) + 3 - if sys.platform == 'darwin': - max_shebang_length = 512 - else: - max_shebang_length = 127 - simple_shebang = ((b' ' not in executable) and - (shebang_length <= max_shebang_length)) - - if simple_shebang: - result = b'#!' + executable + post_interp + b'\n' - else: - result = b'#!/bin/sh\n' - result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' - result += b"' '''" - return result - - def _get_shebang(self, encoding, post_interp=b'', options=None): - enquote = True - if self.executable: - executable = self.executable - enquote = False # assume this will be taken care of - elif not sysconfig.is_python_build(): - executable = get_executable() - elif in_venv(): # pragma: no cover - executable = os.path.join(sysconfig.get_path('scripts'), - 'python%s' % sysconfig.get_config_var('EXE')) - else: # pragma: no cover - executable = os.path.join( - sysconfig.get_config_var('BINDIR'), - 'python%s%s' % (sysconfig.get_config_var('VERSION'), - sysconfig.get_config_var('EXE'))) - if options: - executable = self._get_alternate_executable(executable, options) - - if sys.platform.startswith('java'): # pragma: no cover - executable = self._fix_jython_executable(executable) - - # Normalise case for Windows - COMMENTED OUT - # executable = os.path.normcase(executable) - # N.B. The normalising operation above has been commented out: See - # issue #124. Although paths in Windows are generally case-insensitive, - # they aren't always. For example, a path containing a ẞ (which is a - # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a - # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by - # Windows as equivalent in path names. - - # If the user didn't specify an executable, it may be necessary to - # cater for executable paths with spaces (not uncommon on Windows) - if enquote: - executable = enquote_executable(executable) - # Issue #51: don't use fsencode, since we later try to - # check that the shebang is decodable using utf-8. - executable = executable.encode('utf-8') - # in case of IronPython, play safe and enable frames support - if (sys.platform == 'cli' and '-X:Frames' not in post_interp - and '-X:FullFrames' not in post_interp): # pragma: no cover - post_interp += b' -X:Frames' - shebang = self._build_shebang(executable, post_interp) - # Python parser starts to read a script using UTF-8 until - # it gets a #coding:xxx cookie. The shebang has to be the - # first line of a file, the #coding:xxx cookie cannot be - # written before. So the shebang has to be decodable from - # UTF-8. - try: - shebang.decode('utf-8') - except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable from utf-8' % shebang) - # If the script is encoded to a custom encoding (use a - # #coding:xxx cookie), the shebang has to be decodable from - # the script encoding too. - if encoding != 'utf-8': - try: - shebang.decode(encoding) - except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable ' - 'from the script encoding (%r)' % (shebang, encoding)) - return shebang - - def _get_script_text(self, entry): - return self.script_template % dict(module=entry.prefix, - import_name=entry.suffix.split('.')[0], - func=entry.suffix) - - manifest = _DEFAULT_MANIFEST - - def get_manifest(self, exename): - base = os.path.basename(exename) - return self.manifest % base - - def _write_script(self, names, shebang, script_bytes, filenames, ext): - use_launcher = self.add_launchers and self._is_nt - linesep = os.linesep.encode('utf-8') - if not shebang.endswith(linesep): - shebang += linesep - if not use_launcher: - script_bytes = shebang + script_bytes - else: # pragma: no cover - if ext == 'py': - launcher = self._get_launcher('t') - else: - launcher = self._get_launcher('w') - stream = BytesIO() - with ZipFile(stream, 'w') as zf: - zf.writestr('__main__.py', script_bytes) - zip_data = stream.getvalue() - script_bytes = launcher + shebang + zip_data - for name in names: - outname = os.path.join(self.target_dir, name) - if use_launcher: # pragma: no cover - n, e = os.path.splitext(outname) - if e.startswith('.py'): - outname = n - outname = '%s.exe' % outname - try: - self._fileop.write_binary_file(outname, script_bytes) - except Exception: - # Failed writing an executable - it might be in use. - logger.warning('Failed to write executable - trying to ' - 'use .deleteme logic') - dfname = '%s.deleteme' % outname - if os.path.exists(dfname): - os.remove(dfname) # Not allowed to fail here - os.rename(outname, dfname) # nor here - self._fileop.write_binary_file(outname, script_bytes) - logger.debug('Able to replace executable using ' - '.deleteme logic') - try: - os.remove(dfname) - except Exception: - pass # still in use - ignore error - else: - if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover - outname = '%s.%s' % (outname, ext) - if os.path.exists(outname) and not self.clobber: - logger.warning('Skipping existing file %s', outname) - continue - self._fileop.write_binary_file(outname, script_bytes) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - - def _make_script(self, entry, filenames, options=None): - post_interp = b'' - if options: - args = options.get('interpreter_args', []) - if args: - args = ' %s' % ' '.join(args) - post_interp = args.encode('utf-8') - shebang = self._get_shebang('utf-8', post_interp, options=options) - script = self._get_script_text(entry).encode('utf-8') - name = entry.name - scriptnames = set() - if '' in self.variants: - scriptnames.add(name) - if 'X' in self.variants: - scriptnames.add('%s%s' % (name, self.version_info[0])) - if 'X.Y' in self.variants: - scriptnames.add('%s-%s.%s' % (name, self.version_info[0], - self.version_info[1])) - if options and options.get('gui', False): - ext = 'pyw' - else: - ext = 'py' - self._write_script(scriptnames, shebang, script, filenames, ext) - - def _copy_script(self, script, filenames): - adjust = False - script = os.path.join(self.source_dir, convert_path(script)) - outname = os.path.join(self.target_dir, os.path.basename(script)) - if not self.force and not self._fileop.newer(script, outname): - logger.debug('not copying %s (up-to-date)', script) - return - - # Always open the file, but ignore failures in dry-run mode -- - # that way, we'll get accurate feedback if we can read the - # script. - try: - f = open(script, 'rb') - except IOError: # pragma: no cover - if not self.dry_run: - raise - f = None - else: - first_line = f.readline() - if not first_line: # pragma: no cover - logger.warning('%s: %s is an empty file (skipping)', - self.get_command_name(), script) - return - - match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) - if match: - adjust = True - post_interp = match.group(1) or b'' - - if not adjust: - if f: - f.close() - self._fileop.copy_file(script, outname) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - else: - logger.info('copying and adjusting %s -> %s', script, - self.target_dir) - if not self._fileop.dry_run: - encoding, lines = detect_encoding(f.readline) - f.seek(0) - shebang = self._get_shebang(encoding, post_interp) - if b'pythonw' in first_line: # pragma: no cover - ext = 'pyw' - else: - ext = 'py' - n = os.path.basename(outname) - self._write_script([n], shebang, f.read(), filenames, ext) - if f: - f.close() - - @property - def dry_run(self): - return self._fileop.dry_run - - @dry_run.setter - def dry_run(self, value): - self._fileop.dry_run = value - - if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover - # Executable launcher support. - # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ - - def _get_launcher(self, kind): - if struct.calcsize('P') == 8: # 64-bit - bits = '64' - else: - bits = '32' - name = '%s%s.exe' % (kind, bits) - # Issue 31: don't hardcode an absolute package name, but - # determine it relative to the current package - distlib_package = __name__.rsplit('.', 1)[0] - resource = finder(distlib_package).find(name) - if not resource: - msg = ('Unable to find resource %s in package %s' % (name, - distlib_package)) - raise ValueError(msg) - return resource.bytes - - # Public API follows - - def make(self, specification, options=None): - """ - Make a script. - - :param specification: The specification, which is either a valid export - entry specification (to make a script from a - callable) or a filename (to make a script by - copying from a source location). - :param options: A dictionary of options controlling script generation. - :return: A list of all absolute pathnames written to. - """ - filenames = [] - entry = get_export_entry(specification) - if entry is None: - self._copy_script(specification, filenames) - else: - self._make_script(entry, filenames, options=options) - return filenames - - def make_multiple(self, specifications, options=None): - """ - Take a list of specifications and make scripts from them, - :param specifications: A list of specifications. - :return: A list of all absolute pathnames written to, - """ - filenames = [] - for specification in specifications: - filenames.extend(self.make(specification, options)) - return filenames diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe b/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe deleted file mode 100644 index 8932a18e4596952373a38c60b81b7116d4ef9ee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96768 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 F{{j_Hb~FG0 diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe b/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe deleted file mode 100644 index 325b8057c08cf7113d4fd889991fa5638d443793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105984 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

^h^N4aZyJe%k(7BL*-gn=9``8`j0CuR45%cHI z_uuQ8!-|TEvJ}r=zF@%uKc8U@W1eNxUymJ(e45Tb6KDNieQcKe?L-gR8zZj^wFmi= z{5sAxrfP3BOZz~T$3h=Gi%jFg1%D>!6t*l^`zH2G#1PiYtvOBSI#q&y?8qN57P^LA zq9U)rQU+*y!XEgsGMCJM7yWOS+9lW~^axz>9gyv{Pu^qsBg%ZkfzkaN`$zV#>=oFn zwANnf4&g*eu~pAMC~1dl8FZ-^aeQgZ7=osPU=58@oke z55pen;eU@Z`iL!`$;1-VA&$VF4gN7ttU>relx5d-_x=|95B47HeeiYJZ$$38(ddJH zcrW3>{OR2@KF^H}gAbdZDX=AzyZHSizB_(9`v&$-69)D4WBjSaY@YVD`kl8;nl#Cu z5h1U}Tp}-l|Nde9w|3Pc@Aps8-X~fh_EGq!b-~*$a&nv>05-_n;)z{t+vW|PpX{Oj zKE#i|Gsq9Jhpor%Fqiu6y5}jjnz?*$b)h|UO;3NGd-k|9?ZqeVXL!9~vaIO0E8bVb zejzv5ZG0}~1A7{a3!hob11v4ihxvzh!S5>3I?4E~N9+^m8@sHve^M+wb{f3t2VUsD z*C*C&;z_`=&t~mbE@mHC`k7cGl3rKU9U84p?fzGxTg1q z)-Ai@eQSs49?#VDZ(BQ5_sXt#*VAn)X1Lk5l>kvHP6SDZX>#ITM7@`jxR;sQ>OG+Pe$CuXbGOdj zGq+|zTtQMnhk{-O{R=KF7*}vZ!OVhr1xpLo6l^NkTCk^}W?@_*Z|>hH7&o`>+{q8j zm_Kv=-1+n7FPgt}{>u4l=C7T3KtbFEnHc+rVzeuEi5hE<2hHiD6S}>D5l co{tw5U0O7=?|={2,3}|[~!]=)\s*') -MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') -OR = re.compile(r'^or\b\s*') -AND = re.compile(r'^and\b\s*') -NON_SPACE = re.compile(r'(\S+)\s*') -STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') - - -def parse_marker(marker_string): - """ - Parse a marker string and return a dictionary containing a marker expression. - - The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in - the expression grammar, or strings. A string contained in quotes is to be - interpreted as a literal string, and a string not contained in quotes is a - variable (such as os_name). - """ - def marker_var(remaining): - # either identifier, or literal string - m = IDENTIFIER.match(remaining) - if m: - result = m.groups()[0] - remaining = remaining[m.end():] - elif not remaining: - raise SyntaxError('unexpected end of input') - else: - q = remaining[0] - if q not in '\'"': - raise SyntaxError('invalid expression: %s' % remaining) - oq = '\'"'.replace(q, '') - remaining = remaining[1:] - parts = [q] - while remaining: - # either a string chunk, or oq, or q to terminate - if remaining[0] == q: - break - elif remaining[0] == oq: - parts.append(oq) - remaining = remaining[1:] - else: - m = STRING_CHUNK.match(remaining) - if not m: - raise SyntaxError('error in string literal: %s' % remaining) - parts.append(m.groups()[0]) - remaining = remaining[m.end():] - else: - s = ''.join(parts) - raise SyntaxError('unterminated string: %s' % s) - parts.append(q) - result = ''.join(parts) - remaining = remaining[1:].lstrip() # skip past closing quote - return result, remaining - - def marker_expr(remaining): - if remaining and remaining[0] == '(': - result, remaining = marker(remaining[1:].lstrip()) - if remaining[0] != ')': - raise SyntaxError('unterminated parenthesis: %s' % remaining) - remaining = remaining[1:].lstrip() - else: - lhs, remaining = marker_var(remaining) - while remaining: - m = MARKER_OP.match(remaining) - if not m: - break - op = m.groups()[0] - remaining = remaining[m.end():] - rhs, remaining = marker_var(remaining) - lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} - result = lhs - return result, remaining - - def marker_and(remaining): - lhs, remaining = marker_expr(remaining) - while remaining: - m = AND.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_expr(remaining) - lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - def marker(remaining): - lhs, remaining = marker_and(remaining) - while remaining: - m = OR.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_and(remaining) - lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - return marker(marker_string) - - -def parse_requirement(req): - """ - Parse a requirement passed in as a string. Return a Container - whose attributes contain the various parts of the requirement. - """ - remaining = req.strip() - if not remaining or remaining.startswith('#'): - return None - m = IDENTIFIER.match(remaining) - if not m: - raise SyntaxError('name expected: %s' % remaining) - distname = m.groups()[0] - remaining = remaining[m.end():] - extras = mark_expr = versions = uri = None - if remaining and remaining[0] == '[': - i = remaining.find(']', 1) - if i < 0: - raise SyntaxError('unterminated extra: %s' % remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - extras = [] - while s: - m = IDENTIFIER.match(s) - if not m: - raise SyntaxError('malformed extra: %s' % s) - extras.append(m.groups()[0]) - s = s[m.end():] - if not s: - break - if s[0] != ',': - raise SyntaxError('comma expected in extras: %s' % s) - s = s[1:].lstrip() - if not extras: - extras = None - if remaining: - if remaining[0] == '@': - # it's a URI - remaining = remaining[1:].lstrip() - m = NON_SPACE.match(remaining) - if not m: - raise SyntaxError('invalid URI: %s' % remaining) - uri = m.groups()[0] - t = urlparse(uri) - # there are issues with Python and URL parsing, so this test - # is a bit crude. See bpo-20271, bpo-23505. Python doesn't - # always parse invalid URLs correctly - it should raise - # exceptions for malformed URLs - if not (t.scheme and t.netloc): - raise SyntaxError('Invalid URL: %s' % uri) - remaining = remaining[m.end():].lstrip() - else: - - def get_versions(ver_remaining): - """ - Return a list of operator, version tuples if any are - specified, else None. - """ - m = COMPARE_OP.match(ver_remaining) - versions = None - if m: - versions = [] - while True: - op = m.groups()[0] - ver_remaining = ver_remaining[m.end():] - m = VERSION_IDENTIFIER.match(ver_remaining) - if not m: - raise SyntaxError('invalid version: %s' % ver_remaining) - v = m.groups()[0] - versions.append((op, v)) - ver_remaining = ver_remaining[m.end():] - if not ver_remaining or ver_remaining[0] != ',': - break - ver_remaining = ver_remaining[1:].lstrip() - m = COMPARE_OP.match(ver_remaining) - if not m: - raise SyntaxError('invalid constraint: %s' % ver_remaining) - if not versions: - versions = None - return versions, ver_remaining - - if remaining[0] != '(': - versions, remaining = get_versions(remaining) - else: - i = remaining.find(')', 1) - if i < 0: - raise SyntaxError('unterminated parenthesis: %s' % remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - # As a special diversion from PEP 508, allow a version number - # a.b.c in parentheses as a synonym for ~= a.b.c (because this - # is allowed in earlier PEPs) - if COMPARE_OP.match(s): - versions, _ = get_versions(s) - else: - m = VERSION_IDENTIFIER.match(s) - if not m: - raise SyntaxError('invalid constraint: %s' % s) - v = m.groups()[0] - s = s[m.end():].lstrip() - if s: - raise SyntaxError('invalid constraint: %s' % s) - versions = [('~=', v)] - - if remaining: - if remaining[0] != ';': - raise SyntaxError('invalid requirement: %s' % remaining) - remaining = remaining[1:].lstrip() - - mark_expr, remaining = parse_marker(remaining) - - if remaining and remaining[0] != '#': - raise SyntaxError('unexpected trailing data: %s' % remaining) - - if not versions: - rs = distname - else: - rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) - return Container(name=distname, extras=extras, constraints=versions, - marker=mark_expr, url=uri, requirement=rs) - - -def get_resources_dests(resources_root, rules): - """Find destinations for resources files""" - - def get_rel_path(root, path): - # normalizes and returns a lstripped-/-separated path - root = root.replace(os.path.sep, '/') - path = path.replace(os.path.sep, '/') - assert path.startswith(root) - return path[len(root):].lstrip('/') - - destinations = {} - for base, suffix, dest in rules: - prefix = os.path.join(resources_root, base) - for abs_base in iglob(prefix): - abs_glob = os.path.join(abs_base, suffix) - for abs_path in iglob(abs_glob): - resource_file = get_rel_path(resources_root, abs_path) - if dest is None: # remove the entry if it was here - destinations.pop(resource_file, None) - else: - rel_path = get_rel_path(abs_base, abs_path) - rel_dest = dest.replace(os.path.sep, '/').rstrip('/') - destinations[resource_file] = rel_dest + '/' + rel_path - return destinations - - -def in_venv(): - if hasattr(sys, 'real_prefix'): - # virtualenv venvs - result = True - else: - # PEP 405 venvs - result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) - return result - - -def get_executable(): -# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as -# changes to the stub launcher mean that sys.executable always points -# to the stub on OS X -# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' -# in os.environ): -# result = os.environ['__PYVENV_LAUNCHER__'] -# else: -# result = sys.executable -# return result - result = os.path.normcase(sys.executable) - if not isinstance(result, text_type): - result = fsdecode(result) - return result - - -def proceed(prompt, allowed_chars, error_prompt=None, default=None): - p = prompt - while True: - s = raw_input(p) - p = prompt - if not s and default: - s = default - if s: - c = s[0].lower() - if c in allowed_chars: - break - if error_prompt: - p = '%c: %s\n%s' % (c, error_prompt, prompt) - return c - - -def extract_by_key(d, keys): - if isinstance(keys, string_types): - keys = keys.split() - result = {} - for key in keys: - if key in d: - result[key] = d[key] - return result - -def read_exports(stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - # Try to load as JSON, falling back on legacy format - data = stream.read() - stream = StringIO(data) - try: - jdata = json.load(stream) - result = jdata['extensions']['python.exports']['exports'] - for group, entries in result.items(): - for k, v in entries.items(): - s = '%s = %s' % (k, v) - entry = get_export_entry(s) - assert entry is not None - entries[k] = entry - return result - except Exception: - stream.seek(0, 0) - - def read_stream(cp, stream): - if hasattr(cp, 'read_file'): - cp.read_file(stream) - else: - cp.readfp(stream) - - cp = configparser.ConfigParser() - try: - read_stream(cp, stream) - except configparser.MissingSectionHeaderError: - stream.close() - data = textwrap.dedent(data) - stream = StringIO(data) - read_stream(cp, stream) - - result = {} - for key in cp.sections(): - result[key] = entries = {} - for name, value in cp.items(key): - s = '%s = %s' % (name, value) - entry = get_export_entry(s) - assert entry is not None - #entry.dist = self - entries[name] = entry - return result - - -def write_exports(exports, stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getwriter('utf-8')(stream) - cp = configparser.ConfigParser() - for k, v in exports.items(): - # TODO check k, v for valid values - cp.add_section(k) - for entry in v.values(): - if entry.suffix is None: - s = entry.prefix - else: - s = '%s:%s' % (entry.prefix, entry.suffix) - if entry.flags: - s = '%s [%s]' % (s, ', '.join(entry.flags)) - cp.set(k, entry.name, s) - cp.write(stream) - - -@contextlib.contextmanager -def tempdir(): - td = tempfile.mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - -@contextlib.contextmanager -def chdir(d): - cwd = os.getcwd() - try: - os.chdir(d) - yield - finally: - os.chdir(cwd) - - -@contextlib.contextmanager -def socket_timeout(seconds=15): - cto = socket.getdefaulttimeout() - try: - socket.setdefaulttimeout(seconds) - yield - finally: - socket.setdefaulttimeout(cto) - - -class cached_property(object): - def __init__(self, func): - self.func = func - #for attr in ('__name__', '__module__', '__doc__'): - # setattr(self, attr, getattr(func, attr, None)) - - def __get__(self, obj, cls=None): - if obj is None: - return self - value = self.func(obj) - object.__setattr__(obj, self.func.__name__, value) - #obj.__dict__[self.func.__name__] = value = self.func(obj) - return value - -def convert_path(pathname): - """Return 'pathname' as a name that will work on the native filesystem. - - The path is split on '/' and put back together again using the current - directory separator. Needed because filenames in the setup script are - always supplied in Unix style, and have to be converted to the local - convention before we can actually use them in the filesystem. Raises - ValueError on non-Unix-ish systems if 'pathname' either starts or - ends with a slash. - """ - if os.sep == '/': - return pathname - if not pathname: - return pathname - if pathname[0] == '/': - raise ValueError("path '%s' cannot be absolute" % pathname) - if pathname[-1] == '/': - raise ValueError("path '%s' cannot end with '/'" % pathname) - - paths = pathname.split('/') - while os.curdir in paths: - paths.remove(os.curdir) - if not paths: - return os.curdir - return os.path.join(*paths) - - -class FileOperator(object): - def __init__(self, dry_run=False): - self.dry_run = dry_run - self.ensured = set() - self._init_record() - - def _init_record(self): - self.record = False - self.files_written = set() - self.dirs_created = set() - - def record_as_written(self, path): - if self.record: - self.files_written.add(path) - - def newer(self, source, target): - """Tell if the target is newer than the source. - - Returns true if 'source' exists and is more recently modified than - 'target', or if 'source' exists and 'target' doesn't. - - Returns false if both exist and 'target' is the same age or younger - than 'source'. Raise PackagingFileError if 'source' does not exist. - - Note that this test is not very accurate: files created in the same - second will have the same "age". - """ - if not os.path.exists(source): - raise DistlibException("file '%r' does not exist" % - os.path.abspath(source)) - if not os.path.exists(target): - return True - - return os.stat(source).st_mtime > os.stat(target).st_mtime - - def copy_file(self, infile, outfile, check=True): - """Copy a file respecting dry-run and force flags. - """ - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying %s to %s', infile, outfile) - if not self.dry_run: - msg = None - if check: - if os.path.islink(outfile): - msg = '%s is a symlink' % outfile - elif os.path.exists(outfile) and not os.path.isfile(outfile): - msg = '%s is a non-regular file' % outfile - if msg: - raise ValueError(msg + ' which would be overwritten') - shutil.copyfile(infile, outfile) - self.record_as_written(outfile) - - def copy_stream(self, instream, outfile, encoding=None): - assert not os.path.isdir(outfile) - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying stream %s to %s', instream, outfile) - if not self.dry_run: - if encoding is None: - outstream = open(outfile, 'wb') - else: - outstream = codecs.open(outfile, 'w', encoding=encoding) - try: - shutil.copyfileobj(instream, outstream) - finally: - outstream.close() - self.record_as_written(outfile) - - def write_binary_file(self, path, data): - self.ensure_dir(os.path.dirname(path)) - if not self.dry_run: - if os.path.exists(path): - os.remove(path) - with open(path, 'wb') as f: - f.write(data) - self.record_as_written(path) - - def write_text_file(self, path, data, encoding): - self.write_binary_file(path, data.encode(encoding)) - - def set_mode(self, bits, mask, files): - if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): - # Set the executable bits (owner, group, and world) on - # all the files specified. - for f in files: - if self.dry_run: - logger.info("changing mode of %s", f) - else: - mode = (os.stat(f).st_mode | bits) & mask - logger.info("changing mode of %s to %o", f, mode) - os.chmod(f, mode) - - set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) - - def ensure_dir(self, path): - path = os.path.abspath(path) - if path not in self.ensured and not os.path.exists(path): - self.ensured.add(path) - d, f = os.path.split(path) - self.ensure_dir(d) - logger.info('Creating %s' % path) - if not self.dry_run: - os.mkdir(path) - if self.record: - self.dirs_created.add(path) - - def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): - dpath = cache_from_source(path, not optimize) - logger.info('Byte-compiling %s to %s', path, dpath) - if not self.dry_run: - if force or self.newer(path, dpath): - if not prefix: - diagpath = None - else: - assert path.startswith(prefix) - diagpath = path[len(prefix):] - compile_kwargs = {} - if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): - compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH - py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error - self.record_as_written(dpath) - return dpath - - def ensure_removed(self, path): - if os.path.exists(path): - if os.path.isdir(path) and not os.path.islink(path): - logger.debug('Removing directory tree at %s', path) - if not self.dry_run: - shutil.rmtree(path) - if self.record: - if path in self.dirs_created: - self.dirs_created.remove(path) - else: - if os.path.islink(path): - s = 'link' - else: - s = 'file' - logger.debug('Removing %s %s', s, path) - if not self.dry_run: - os.remove(path) - if self.record: - if path in self.files_written: - self.files_written.remove(path) - - def is_writable(self, path): - result = False - while not result: - if os.path.exists(path): - result = os.access(path, os.W_OK) - break - parent = os.path.dirname(path) - if parent == path: - break - path = parent - return result - - def commit(self): - """ - Commit recorded changes, turn off recording, return - changes. - """ - assert self.record - result = self.files_written, self.dirs_created - self._init_record() - return result - - def rollback(self): - if not self.dry_run: - for f in list(self.files_written): - if os.path.exists(f): - os.remove(f) - # dirs should all be empty now, except perhaps for - # __pycache__ subdirs - # reverse so that subdirs appear before their parents - dirs = sorted(self.dirs_created, reverse=True) - for d in dirs: - flist = os.listdir(d) - if flist: - assert flist == ['__pycache__'] - sd = os.path.join(d, flist[0]) - os.rmdir(sd) - os.rmdir(d) # should fail if non-empty - self._init_record() - -def resolve(module_name, dotted_path): - if module_name in sys.modules: - mod = sys.modules[module_name] - else: - mod = __import__(module_name) - if dotted_path is None: - result = mod - else: - parts = dotted_path.split('.') - result = getattr(mod, parts.pop(0)) - for p in parts: - result = getattr(result, p) - return result - - -class ExportEntry(object): - def __init__(self, name, prefix, suffix, flags): - self.name = name - self.prefix = prefix - self.suffix = suffix - self.flags = flags - - @cached_property - def value(self): - return resolve(self.prefix, self.suffix) - - def __repr__(self): # pragma: no cover - return '' % (self.name, self.prefix, - self.suffix, self.flags) - - def __eq__(self, other): - if not isinstance(other, ExportEntry): - result = False - else: - result = (self.name == other.name and - self.prefix == other.prefix and - self.suffix == other.suffix and - self.flags == other.flags) - return result - - __hash__ = object.__hash__ - - -ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+) - \s*=\s*(?P(\w+)([:\.]\w+)*) - \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? - ''', re.VERBOSE) - -def get_export_entry(specification): - m = ENTRY_RE.search(specification) - if not m: - result = None - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - else: - d = m.groupdict() - name = d['name'] - path = d['callable'] - colons = path.count(':') - if colons == 0: - prefix, suffix = path, None - else: - if colons != 1: - raise DistlibException("Invalid specification " - "'%s'" % specification) - prefix, suffix = path.split(':') - flags = d['flags'] - if flags is None: - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - flags = [] - else: - flags = [f.strip() for f in flags.split(',')] - result = ExportEntry(name, prefix, suffix, flags) - return result - - -def get_cache_base(suffix=None): - """ - Return the default base location for distlib caches. If the directory does - not exist, it is created. Use the suffix provided for the base directory, - and default to '.distlib' if it isn't provided. - - On Windows, if LOCALAPPDATA is defined in the environment, then it is - assumed to be a directory, and will be the parent directory of the result. - On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home - directory - using os.expanduser('~') - will be the parent directory of - the result. - - The result is just the directory '.distlib' in the parent directory as - determined above, or with the name specified with ``suffix``. - """ - if suffix is None: - suffix = '.distlib' - if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: - result = os.path.expandvars('$localappdata') - else: - # Assume posix, or old Windows - result = os.path.expanduser('~') - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if os.path.isdir(result): - usable = os.access(result, os.W_OK) - if not usable: - logger.warning('Directory exists but is not writable: %s', result) - else: - try: - os.makedirs(result) - usable = True - except OSError: - logger.warning('Unable to create %s', result, exc_info=True) - usable = False - if not usable: - result = tempfile.mkdtemp() - logger.warning('Default location unusable, using %s', result) - return os.path.join(result, suffix) - - -def path_to_cache_dir(path): - """ - Convert an absolute path to a directory name for use in a cache. - - The algorithm used is: - - #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. - #. Any occurrence of ``os.sep`` is replaced with ``'--'``. - #. ``'.cache'`` is appended. - """ - d, p = os.path.splitdrive(os.path.abspath(path)) - if d: - d = d.replace(':', '---') - p = p.replace(os.sep, '--') - return d + p + '.cache' - - -def ensure_slash(s): - if not s.endswith('/'): - return s + '/' - return s - - -def parse_credentials(netloc): - username = password = None - if '@' in netloc: - prefix, netloc = netloc.rsplit('@', 1) - if ':' not in prefix: - username = prefix - else: - username, password = prefix.split(':', 1) - if username: - username = unquote(username) - if password: - password = unquote(password) - return username, password, netloc - - -def get_process_umask(): - result = os.umask(0o22) - os.umask(result) - return result - -def is_string_sequence(seq): - result = True - i = None - for i, s in enumerate(seq): - if not isinstance(s, string_types): - result = False - break - assert i is not None - return result - -PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' - '([a-z0-9_.+-]+)', re.I) -PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') - - -def split_filename(filename, project_name=None): - """ - Extract name, version, python version from a filename (no extension) - - Return name, version, pyver or None - """ - result = None - pyver = None - filename = unquote(filename).replace(' ', '-') - m = PYTHON_VERSION.search(filename) - if m: - pyver = m.group(1) - filename = filename[:m.start()] - if project_name and len(filename) > len(project_name) + 1: - m = re.match(re.escape(project_name) + r'\b', filename) - if m: - n = m.end() - result = filename[:n], filename[n + 1:], pyver - if result is None: - m = PROJECT_NAME_AND_VERSION.match(filename) - if m: - result = m.group(1), m.group(3), pyver - return result - -# Allow spaces in name because of legacy dists like "Twisted Core" -NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' - r'\(\s*(?P[^\s)]+)\)$') - -def parse_name_and_version(p): - """ - A utility method used to get name and version from a string. - - From e.g. a Provides-Dist value. - - :param p: A value in a form 'foo (1.0)' - :return: The name and version as a tuple. - """ - m = NAME_VERSION_RE.match(p) - if not m: - raise DistlibException('Ill-formed name/version string: \'%s\'' % p) - d = m.groupdict() - return d['name'].strip().lower(), d['ver'] - -def get_extras(requested, available): - result = set() - requested = set(requested or []) - available = set(available or []) - if '*' in requested: - requested.remove('*') - result |= available - for r in requested: - if r == '-': - result.add(r) - elif r.startswith('-'): - unwanted = r[1:] - if unwanted not in available: - logger.warning('undeclared extra: %s' % unwanted) - if unwanted in result: - result.remove(unwanted) - else: - if r not in available: - logger.warning('undeclared extra: %s' % r) - result.add(r) - return result -# -# Extended metadata functionality -# - -def _get_external_data(url): - result = {} - try: - # urlopen might fail if it runs into redirections, - # because of Python issue #13696. Fixed in locators - # using a custom redirect handler. - resp = urlopen(url) - headers = resp.info() - ct = headers.get('Content-Type') - if not ct.startswith('application/json'): - logger.debug('Unexpected response for JSON request: %s', ct) - else: - reader = codecs.getreader('utf-8')(resp) - #data = reader.read().decode('utf-8') - #result = json.loads(data) - result = json.load(reader) - except Exception as e: - logger.exception('Failed to get external data for %s: %s', url, e) - return result - -_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' - -def get_project_data(name): - url = '%s/%s/project.json' % (name[0].upper(), name) - url = urljoin(_external_data_base_url, url) - result = _get_external_data(url) - return result - -def get_package_data(name, version): - url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) - url = urljoin(_external_data_base_url, url) - return _get_external_data(url) - - -class Cache(object): - """ - A class implementing a cache for resources that need to live in the file system - e.g. shared libraries. This class was moved from resources to here because it - could be used by other modules, e.g. the wheel module. - """ - - def __init__(self, base): - """ - Initialise an instance. - - :param base: The base directory where the cache should be located. - """ - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if not os.path.isdir(base): # pragma: no cover - os.makedirs(base) - if (os.stat(base).st_mode & 0o77) != 0: - logger.warning('Directory \'%s\' is not private', base) - self.base = os.path.abspath(os.path.normpath(base)) - - def prefix_to_dir(self, prefix): - """ - Converts a resource prefix to a directory name in the cache. - """ - return path_to_cache_dir(prefix) - - def clear(self): - """ - Clear the cache. - """ - not_removed = [] - for fn in os.listdir(self.base): - fn = os.path.join(self.base, fn) - try: - if os.path.islink(fn) or os.path.isfile(fn): - os.remove(fn) - elif os.path.isdir(fn): - shutil.rmtree(fn) - except Exception: - not_removed.append(fn) - return not_removed - - -class EventMixin(object): - """ - A very simple publish/subscribe system. - """ - def __init__(self): - self._subscribers = {} - - def add(self, event, subscriber, append=True): - """ - Add a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be added (and called when the - event is published). - :param append: Whether to append or prepend the subscriber to an - existing subscriber list for the event. - """ - subs = self._subscribers - if event not in subs: - subs[event] = deque([subscriber]) - else: - sq = subs[event] - if append: - sq.append(subscriber) - else: - sq.appendleft(subscriber) - - def remove(self, event, subscriber): - """ - Remove a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be removed. - """ - subs = self._subscribers - if event not in subs: - raise ValueError('No subscribers: %r' % event) - subs[event].remove(subscriber) - - def get_subscribers(self, event): - """ - Return an iterator for the subscribers for an event. - :param event: The event to return subscribers for. - """ - return iter(self._subscribers.get(event, ())) - - def publish(self, event, *args, **kwargs): - """ - Publish a event and return a list of values returned by its - subscribers. - - :param event: The event to publish. - :param args: The positional arguments to pass to the event's - subscribers. - :param kwargs: The keyword arguments to pass to the event's - subscribers. - """ - result = [] - for subscriber in self.get_subscribers(event): - try: - value = subscriber(event, *args, **kwargs) - except Exception: - logger.exception('Exception during event publication') - value = None - result.append(value) - logger.debug('publish %s: args = %s, kwargs = %s, result = %s', - event, args, kwargs, result) - return result - -# -# Simple sequencing -# -class Sequencer(object): - def __init__(self): - self._preds = {} - self._succs = {} - self._nodes = set() # nodes with no preds/succs - - def add_node(self, node): - self._nodes.add(node) - - def remove_node(self, node, edges=False): - if node in self._nodes: - self._nodes.remove(node) - if edges: - for p in set(self._preds.get(node, ())): - self.remove(p, node) - for s in set(self._succs.get(node, ())): - self.remove(node, s) - # Remove empties - for k, v in list(self._preds.items()): - if not v: - del self._preds[k] - for k, v in list(self._succs.items()): - if not v: - del self._succs[k] - - def add(self, pred, succ): - assert pred != succ - self._preds.setdefault(succ, set()).add(pred) - self._succs.setdefault(pred, set()).add(succ) - - def remove(self, pred, succ): - assert pred != succ - try: - preds = self._preds[succ] - succs = self._succs[pred] - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of anything' % succ) - try: - preds.remove(pred) - succs.remove(succ) - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of %r' % (succ, pred)) - - def is_step(self, step): - return (step in self._preds or step in self._succs or - step in self._nodes) - - def get_steps(self, final): - if not self.is_step(final): - raise ValueError('Unknown: %r' % final) - result = [] - todo = [] - seen = set() - todo.append(final) - while todo: - step = todo.pop(0) - if step in seen: - # if a step was already seen, - # move it to the end (so it will appear earlier - # when reversed on return) ... but not for the - # final step, as that would be confusing for - # users - if step != final: - result.remove(step) - result.append(step) - else: - seen.add(step) - result.append(step) - preds = self._preds.get(step, ()) - todo.extend(preds) - return reversed(result) - - @property - def strong_connections(self): - #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm - index_counter = [0] - stack = [] - lowlinks = {} - index = {} - result = [] - - graph = self._succs - - def strongconnect(node): - # set the depth index for this node to the smallest unused index - index[node] = index_counter[0] - lowlinks[node] = index_counter[0] - index_counter[0] += 1 - stack.append(node) - - # Consider successors - try: - successors = graph[node] - except Exception: - successors = [] - for successor in successors: - if successor not in lowlinks: - # Successor has not yet been visited - strongconnect(successor) - lowlinks[node] = min(lowlinks[node],lowlinks[successor]) - elif successor in stack: - # the successor is in the stack and hence in the current - # strongly connected component (SCC) - lowlinks[node] = min(lowlinks[node],index[successor]) - - # If `node` is a root node, pop the stack and generate an SCC - if lowlinks[node] == index[node]: - connected_component = [] - - while True: - successor = stack.pop() - connected_component.append(successor) - if successor == node: break - component = tuple(connected_component) - # storing the result - result.append(component) - - for node in graph: - if node not in lowlinks: - strongconnect(node) - - return result - - @property - def dot(self): - result = ['digraph G {'] - for succ in self._preds: - preds = self._preds[succ] - for pred in preds: - result.append(' %s -> %s;' % (pred, succ)) - for node in self._nodes: - result.append(' %s;' % node) - result.append('}') - return '\n'.join(result) - -# -# Unarchiving functionality for zip, tar, tgz, tbz, whl -# - -ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', - '.tgz', '.tbz', '.whl') - -def unarchive(archive_filename, dest_dir, format=None, check=True): - - def check_path(path): - if not isinstance(path, text_type): - path = path.decode('utf-8') - p = os.path.abspath(os.path.join(dest_dir, path)) - if not p.startswith(dest_dir) or p[plen] != os.sep: - raise ValueError('path outside destination: %r' % p) - - dest_dir = os.path.abspath(dest_dir) - plen = len(dest_dir) - archive = None - if format is None: - if archive_filename.endswith(('.zip', '.whl')): - format = 'zip' - elif archive_filename.endswith(('.tar.gz', '.tgz')): - format = 'tgz' - mode = 'r:gz' - elif archive_filename.endswith(('.tar.bz2', '.tbz')): - format = 'tbz' - mode = 'r:bz2' - elif archive_filename.endswith('.tar'): - format = 'tar' - mode = 'r' - else: # pragma: no cover - raise ValueError('Unknown format for %r' % archive_filename) - try: - if format == 'zip': - archive = ZipFile(archive_filename, 'r') - if check: - names = archive.namelist() - for name in names: - check_path(name) - else: - archive = tarfile.open(archive_filename, mode) - if check: - names = archive.getnames() - for name in names: - check_path(name) - if format != 'zip' and sys.version_info[0] < 3: - # See Python issue 17153. If the dest path contains Unicode, - # tarfile extraction fails on Python 2.x if a member path name - # contains non-ASCII characters - it leads to an implicit - # bytes -> unicode conversion using ASCII to decode. - for tarinfo in archive.getmembers(): - if not isinstance(tarinfo.name, text_type): - tarinfo.name = tarinfo.name.decode('utf-8') - archive.extractall(dest_dir) - - finally: - if archive: - archive.close() - - -def zip_dir(directory): - """zip a directory tree into a BytesIO object""" - result = io.BytesIO() - dlen = len(directory) - with ZipFile(result, "w") as zf: - for root, dirs, files in os.walk(directory): - for name in files: - full = os.path.join(root, name) - rel = root[dlen:] - dest = os.path.join(rel, name) - zf.write(full, dest) - return result - -# -# Simple progress bar -# - -UNITS = ('', 'K', 'M', 'G','T','P') - - -class Progress(object): - unknown = 'UNKNOWN' - - def __init__(self, minval=0, maxval=100): - assert maxval is None or maxval >= minval - self.min = self.cur = minval - self.max = maxval - self.started = None - self.elapsed = 0 - self.done = False - - def update(self, curval): - assert self.min <= curval - assert self.max is None or curval <= self.max - self.cur = curval - now = time.time() - if self.started is None: - self.started = now - else: - self.elapsed = now - self.started - - def increment(self, incr): - assert incr >= 0 - self.update(self.cur + incr) - - def start(self): - self.update(self.min) - return self - - def stop(self): - if self.max is not None: - self.update(self.max) - self.done = True - - @property - def maximum(self): - return self.unknown if self.max is None else self.max - - @property - def percentage(self): - if self.done: - result = '100 %' - elif self.max is None: - result = ' ?? %' - else: - v = 100.0 * (self.cur - self.min) / (self.max - self.min) - result = '%3d %%' % v - return result - - def format_duration(self, duration): - if (duration <= 0) and self.max is None or self.cur == self.min: - result = '??:??:??' - #elif duration < 1: - # result = '--:--:--' - else: - result = time.strftime('%H:%M:%S', time.gmtime(duration)) - return result - - @property - def ETA(self): - if self.done: - prefix = 'Done' - t = self.elapsed - #import pdb; pdb.set_trace() - else: - prefix = 'ETA ' - if self.max is None: - t = -1 - elif self.elapsed == 0 or (self.cur == self.min): - t = 0 - else: - #import pdb; pdb.set_trace() - t = float(self.max - self.min) - t /= self.cur - self.min - t = (t - 1) * self.elapsed - return '%s: %s' % (prefix, self.format_duration(t)) - - @property - def speed(self): - if self.elapsed == 0: - result = 0.0 - else: - result = (self.cur - self.min) / self.elapsed - for unit in UNITS: - if result < 1000: - break - result /= 1000.0 - return '%d %sB/s' % (result, unit) - -# -# Glob functionality -# - -RICH_GLOB = re.compile(r'\{([^}]*)\}') -_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') -_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') - - -def iglob(path_glob): - """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" - if _CHECK_RECURSIVE_GLOB.search(path_glob): - msg = """invalid glob %r: recursive glob "**" must be used alone""" - raise ValueError(msg % path_glob) - if _CHECK_MISMATCH_SET.search(path_glob): - msg = """invalid glob %r: mismatching set marker '{' or '}'""" - raise ValueError(msg % path_glob) - return _iglob(path_glob) - - -def _iglob(path_glob): - rich_path_glob = RICH_GLOB.split(path_glob, 1) - if len(rich_path_glob) > 1: - assert len(rich_path_glob) == 3, rich_path_glob - prefix, set, suffix = rich_path_glob - for item in set.split(','): - for path in _iglob(''.join((prefix, item, suffix))): - yield path - else: - if '**' not in path_glob: - for item in std_iglob(path_glob): - yield item - else: - prefix, radical = path_glob.split('**', 1) - if prefix == '': - prefix = '.' - if radical == '': - radical = '*' - else: - # we support both - radical = radical.lstrip('/') - radical = radical.lstrip('\\') - for path, dir, files in os.walk(prefix): - path = os.path.normpath(path) - for fn in _iglob(os.path.join(path, radical)): - yield fn - -if ssl: - from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, - CertificateError) - - -# -# HTTPSConnection which verifies certificates/matches domains -# - - class HTTPSConnection(httplib.HTTPSConnection): - ca_certs = None # set this to the path to the certs file (.pem) - check_domain = True # only used if ca_certs is not None - - # noinspection PyPropertyAccess - def connect(self): - sock = socket.create_connection((self.host, self.port), self.timeout) - if getattr(self, '_tunnel_host', False): - self.sock = sock - self._tunnel() - - if not hasattr(ssl, 'SSLContext'): - # For 2.x - if self.ca_certs: - cert_reqs = ssl.CERT_REQUIRED - else: - cert_reqs = ssl.CERT_NONE - self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, - cert_reqs=cert_reqs, - ssl_version=ssl.PROTOCOL_SSLv23, - ca_certs=self.ca_certs) - else: # pragma: no cover - context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) - if hasattr(ssl, 'OP_NO_SSLv2'): - context.options |= ssl.OP_NO_SSLv2 - if self.cert_file: - context.load_cert_chain(self.cert_file, self.key_file) - kwargs = {} - if self.ca_certs: - context.verify_mode = ssl.CERT_REQUIRED - context.load_verify_locations(cafile=self.ca_certs) - if getattr(ssl, 'HAS_SNI', False): - kwargs['server_hostname'] = self.host - self.sock = context.wrap_socket(sock, **kwargs) - if self.ca_certs and self.check_domain: - try: - match_hostname(self.sock.getpeercert(), self.host) - logger.debug('Host verified: %s', self.host) - except CertificateError: # pragma: no cover - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() - raise - - class HTTPSHandler(BaseHTTPSHandler): - def __init__(self, ca_certs, check_domain=True): - BaseHTTPSHandler.__init__(self) - self.ca_certs = ca_certs - self.check_domain = check_domain - - def _conn_maker(self, *args, **kwargs): - """ - This is called to create a connection instance. Normally you'd - pass a connection class to do_open, but it doesn't actually check for - a class, and just expects a callable. As long as we behave just as a - constructor would have, we should be OK. If it ever changes so that - we *must* pass a class, we'll create an UnsafeHTTPSConnection class - which just sets check_domain to False in the class definition, and - choose which one to pass to do_open. - """ - result = HTTPSConnection(*args, **kwargs) - if self.ca_certs: - result.ca_certs = self.ca_certs - result.check_domain = self.check_domain - return result - - def https_open(self, req): - try: - return self.do_open(self._conn_maker, req) - except URLError as e: - if 'certificate verify failed' in str(e.reason): - raise CertificateError('Unable to verify server certificate ' - 'for %s' % req.host) - else: - raise - - # - # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- - # Middle proxy using HTTP listens on port 443, or an index mistakenly serves - # HTML containing a http://xyz link when it should be https://xyz), - # you can use the following handler class, which does not allow HTTP traffic. - # - # It works by inheriting from HTTPHandler - so build_opener won't add a - # handler for HTTP itself. - # - class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): - def http_open(self, req): - raise URLError('Unexpected HTTP request on what should be a secure ' - 'connection: %s' % req) - -# -# XML-RPC with timeouts -# - -_ver_info = sys.version_info[:2] - -if _ver_info == (2, 6): - class HTTP(httplib.HTTP): - def __init__(self, host='', port=None, **kwargs): - if port == 0: # 0 means use port 0, not the default port - port = None - self._setup(self._connection_class(host, port, **kwargs)) - - - if ssl: - class HTTPS(httplib.HTTPS): - def __init__(self, host='', port=None, **kwargs): - if port == 0: # 0 means use port 0, not the default port - port = None - self._setup(self._connection_class(host, port, **kwargs)) - - -class Transport(xmlrpclib.Transport): - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.Transport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, x509 = self.get_host_info(host) - if _ver_info == (2, 6): - result = HTTP(h, timeout=self.timeout) - else: - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPConnection(h) - result = self._connection[1] - return result - -if ssl: - class SafeTransport(xmlrpclib.SafeTransport): - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.SafeTransport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, kwargs = self.get_host_info(host) - if not kwargs: - kwargs = {} - kwargs['timeout'] = self.timeout - if _ver_info == (2, 6): - result = HTTPS(host, None, **kwargs) - else: - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPSConnection(h, None, - **kwargs) - result = self._connection[1] - return result - - -class ServerProxy(xmlrpclib.ServerProxy): - def __init__(self, uri, **kwargs): - self.timeout = timeout = kwargs.pop('timeout', None) - # The above classes only come into play if a timeout - # is specified - if timeout is not None: - scheme, _ = splittype(uri) - use_datetime = kwargs.get('use_datetime', 0) - if scheme == 'https': - tcls = SafeTransport - else: - tcls = Transport - kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) - self.transport = t - xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) - -# -# CSV functionality. This is provided because on 2.x, the csv module can't -# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. -# - -def _csv_open(fn, mode, **kwargs): - if sys.version_info[0] < 3: - mode += 'b' - else: - kwargs['newline'] = '' - # Python 3 determines encoding from locale. Force 'utf-8' - # file encoding to match other forced utf-8 encoding - kwargs['encoding'] = 'utf-8' - return open(fn, mode, **kwargs) - - -class CSVBase(object): - defaults = { - 'delimiter': str(','), # The strs are used because we need native - 'quotechar': str('"'), # str in the csv API (2.x won't take - 'lineterminator': str('\n') # Unicode) - } - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.stream.close() - - -class CSVReader(CSVBase): - def __init__(self, **kwargs): - if 'stream' in kwargs: - stream = kwargs['stream'] - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - self.stream = stream - else: - self.stream = _csv_open(kwargs['path'], 'r') - self.reader = csv.reader(self.stream, **self.defaults) - - def __iter__(self): - return self - - def next(self): - result = next(self.reader) - if sys.version_info[0] < 3: - for i, item in enumerate(result): - if not isinstance(item, text_type): - result[i] = item.decode('utf-8') - return result - - __next__ = next - -class CSVWriter(CSVBase): - def __init__(self, fn, **kwargs): - self.stream = _csv_open(fn, 'w') - self.writer = csv.writer(self.stream, **self.defaults) - - def writerow(self, row): - if sys.version_info[0] < 3: - r = [] - for item in row: - if isinstance(item, text_type): - item = item.encode('utf-8') - r.append(item) - row = r - self.writer.writerow(row) - -# -# Configurator functionality -# - -class Configurator(BaseConfigurator): - - value_converters = dict(BaseConfigurator.value_converters) - value_converters['inc'] = 'inc_convert' - - def __init__(self, config, base=None): - super(Configurator, self).__init__(config) - self.base = base or os.getcwd() - - def configure_custom(self, config): - def convert(o): - if isinstance(o, (list, tuple)): - result = type(o)([convert(i) for i in o]) - elif isinstance(o, dict): - if '()' in o: - result = self.configure_custom(o) - else: - result = {} - for k in o: - result[k] = convert(o[k]) - else: - result = self.convert(o) - return result - - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - args = config.pop('[]', ()) - if args: - args = tuple([convert(o) for o in args]) - items = [(k, convert(config[k])) for k in config if valid_ident(k)] - kwargs = dict(items) - result = c(*args, **kwargs) - if props: - for n, v in props.items(): - setattr(result, n, convert(v)) - return result - - def __getitem__(self, key): - result = self.config[key] - if isinstance(result, dict) and '()' in result: - self.config[key] = result = self.configure_custom(result) - return result - - def inc_convert(self, value): - """Default converter for the inc:// protocol.""" - if not os.path.isabs(value): - value = os.path.join(self.base, value) - with codecs.open(value, 'r', encoding='utf-8') as f: - result = json.load(f) - return result - - -class SubprocessMixin(object): - """ - Mixin for running subprocesses and capturing their output - """ - def __init__(self, verbose=False, progress=None): - self.verbose = verbose - self.progress = progress - - def reader(self, stream, context): - """ - Read lines from a subprocess' output stream and either pass to a progress - callable (if specified) or write progress information to sys.stderr. - """ - progress = self.progress - verbose = self.verbose - while True: - s = stream.readline() - if not s: - break - if progress is not None: - progress(s, context) - else: - if not verbose: - sys.stderr.write('.') - else: - sys.stderr.write(s.decode('utf-8')) - sys.stderr.flush() - stream.close() - - def run_command(self, cmd, **kwargs): - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, **kwargs) - t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) - t1.start() - t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) - t2.start() - p.wait() - t1.join() - t2.join() - if self.progress is not None: - self.progress('done.', 'main') - elif self.verbose: - sys.stderr.write('done.\n') - return p - - -def normalize_name(name): - """Normalize a python package name a la PEP 503""" - # https://www.python.org/dev/peps/pep-0503/#normalized-names - return re.sub('[-_.]+', '-', name).lower() diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/version.py b/venv/Lib/site-packages/pip/_vendor/distlib/version.py deleted file mode 100644 index 3eebe18..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distlib/version.py +++ /dev/null @@ -1,736 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Implementation of a flexible versioning scheme providing support for PEP-440, -setuptools-compatible and semantic versioning. -""" - -import logging -import re - -from .compat import string_types -from .util import parse_requirement - -__all__ = ['NormalizedVersion', 'NormalizedMatcher', - 'LegacyVersion', 'LegacyMatcher', - 'SemanticVersion', 'SemanticMatcher', - 'UnsupportedVersionError', 'get_scheme'] - -logger = logging.getLogger(__name__) - - -class UnsupportedVersionError(ValueError): - """This is an unsupported version.""" - pass - - -class Version(object): - def __init__(self, s): - self._string = s = s.strip() - self._parts = parts = self.parse(s) - assert isinstance(parts, tuple) - assert len(parts) > 0 - - def parse(self, s): - raise NotImplementedError('please implement in a subclass') - - def _check_compatible(self, other): - if type(self) != type(other): - raise TypeError('cannot compare %r and %r' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - def __lt__(self, other): - self._check_compatible(other) - return self._parts < other._parts - - def __gt__(self, other): - return not (self.__lt__(other) or self.__eq__(other)) - - def __le__(self, other): - return self.__lt__(other) or self.__eq__(other) - - def __ge__(self, other): - return self.__gt__(other) or self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self._parts) - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - @property - def is_prerelease(self): - raise NotImplementedError('Please implement in subclasses.') - - -class Matcher(object): - version_class = None - - # value is either a callable or the name of a method - _operators = { - '<': lambda v, c, p: v < c, - '>': lambda v, c, p: v > c, - '<=': lambda v, c, p: v == c or v < c, - '>=': lambda v, c, p: v == c or v > c, - '==': lambda v, c, p: v == c, - '===': lambda v, c, p: v == c, - # by default, compatible => >=. - '~=': lambda v, c, p: v == c or v > c, - '!=': lambda v, c, p: v != c, - } - - # this is a method only to support alternative implementations - # via overriding - def parse_requirement(self, s): - return parse_requirement(s) - - def __init__(self, s): - if self.version_class is None: - raise ValueError('Please specify a version class') - self._string = s = s.strip() - r = self.parse_requirement(s) - if not r: - raise ValueError('Not valid: %r' % s) - self.name = r.name - self.key = self.name.lower() # for case-insensitive comparisons - clist = [] - if r.constraints: - # import pdb; pdb.set_trace() - for op, s in r.constraints: - if s.endswith('.*'): - if op not in ('==', '!='): - raise ValueError('\'.*\' not allowed for ' - '%r constraints' % op) - # Could be a partial version (e.g. for '2.*') which - # won't parse as a version, so keep it as a string - vn, prefix = s[:-2], True - # Just to check that vn is a valid version - self.version_class(vn) - else: - # Should parse as a version, so we can create an - # instance for the comparison - vn, prefix = self.version_class(s), False - clist.append((op, vn, prefix)) - self._parts = tuple(clist) - - def match(self, version): - """ - Check if the provided version matches the constraints. - - :param version: The version to match against this instance. - :type version: String or :class:`Version` instance. - """ - if isinstance(version, string_types): - version = self.version_class(version) - for operator, constraint, prefix in self._parts: - f = self._operators.get(operator) - if isinstance(f, string_types): - f = getattr(self, f) - if not f: - msg = ('%r not implemented ' - 'for %s' % (operator, self.__class__.__name__)) - raise NotImplementedError(msg) - if not f(version, constraint, prefix): - return False - return True - - @property - def exact_version(self): - result = None - if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): - result = self._parts[0][1] - return result - - def _check_compatible(self, other): - if type(self) != type(other) or self.name != other.name: - raise TypeError('cannot compare %s and %s' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self.key == other.key and self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self.key) + hash(self._parts) - - def __repr__(self): - return "%s(%r)" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - -PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' - r'(\.(post)(\d+))?(\.(dev)(\d+))?' - r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') - - -def _pep_440_key(s): - s = s.strip() - m = PEP440_VERSION_RE.match(s) - if not m: - raise UnsupportedVersionError('Not a valid version: %s' % s) - groups = m.groups() - nums = tuple(int(v) for v in groups[1].split('.')) - while len(nums) > 1 and nums[-1] == 0: - nums = nums[:-1] - - if not groups[0]: - epoch = 0 - else: - epoch = int(groups[0]) - pre = groups[4:6] - post = groups[7:9] - dev = groups[10:12] - local = groups[13] - if pre == (None, None): - pre = () - else: - pre = pre[0], int(pre[1]) - if post == (None, None): - post = () - else: - post = post[0], int(post[1]) - if dev == (None, None): - dev = () - else: - dev = dev[0], int(dev[1]) - if local is None: - local = () - else: - parts = [] - for part in local.split('.'): - # to ensure that numeric compares as > lexicographic, avoid - # comparing them directly, but encode a tuple which ensures - # correct sorting - if part.isdigit(): - part = (1, int(part)) - else: - part = (0, part) - parts.append(part) - local = tuple(parts) - if not pre: - # either before pre-release, or final release and after - if not post and dev: - # before pre-release - pre = ('a', -1) # to sort before a0 - else: - pre = ('z',) # to sort after all pre-releases - # now look at the state of post and dev. - if not post: - post = ('_',) # sort before 'a' - if not dev: - dev = ('final',) - - #print('%s -> %s' % (s, m.groups())) - return epoch, nums, pre, post, dev, local - - -_normalized_key = _pep_440_key - - -class NormalizedVersion(Version): - """A rational version. - - Good: - 1.2 # equivalent to "1.2.0" - 1.2.0 - 1.2a1 - 1.2.3a2 - 1.2.3b1 - 1.2.3c1 - 1.2.3.4 - TODO: fill this out - - Bad: - 1 # minimum two numbers - 1.2a # release level must have a release serial - 1.2.3b - """ - def parse(self, s): - result = _normalized_key(s) - # _normalized_key loses trailing zeroes in the release - # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 - # However, PEP 440 prefix matching needs it: for example, - # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). - m = PEP440_VERSION_RE.match(s) # must succeed - groups = m.groups() - self._release_clause = tuple(int(v) for v in groups[1].split('.')) - return result - - PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) - - @property - def is_prerelease(self): - return any(t[0] in self.PREREL_TAGS for t in self._parts if t) - - -def _match_prefix(x, y): - x = str(x) - y = str(y) - if x == y: - return True - if not x.startswith(y): - return False - n = len(y) - return x[n] == '.' - - -class NormalizedMatcher(Matcher): - version_class = NormalizedVersion - - # value is either a callable or the name of a method - _operators = { - '~=': '_match_compatible', - '<': '_match_lt', - '>': '_match_gt', - '<=': '_match_le', - '>=': '_match_ge', - '==': '_match_eq', - '===': '_match_arbitrary', - '!=': '_match_ne', - } - - def _adjust_local(self, version, constraint, prefix): - if prefix: - strip_local = '+' not in constraint and version._parts[-1] - else: - # both constraint and version are - # NormalizedVersion instances. - # If constraint does not have a local component, - # ensure the version doesn't, either. - strip_local = not constraint._parts[-1] and version._parts[-1] - if strip_local: - s = version._string.split('+', 1)[0] - version = self.version_class(s) - return version, constraint - - def _match_lt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version >= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_gt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version <= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_le(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version <= constraint - - def _match_ge(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version >= constraint - - def _match_eq(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version == constraint) - else: - result = _match_prefix(version, constraint) - return result - - def _match_arbitrary(self, version, constraint, prefix): - return str(version) == str(constraint) - - def _match_ne(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version != constraint) - else: - result = not _match_prefix(version, constraint) - return result - - def _match_compatible(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version == constraint: - return True - if version < constraint: - return False -# if not prefix: -# return True - release_clause = constraint._release_clause - if len(release_clause) > 1: - release_clause = release_clause[:-1] - pfx = '.'.join([str(i) for i in release_clause]) - return _match_prefix(version, pfx) - -_REPLACEMENTS = ( - (re.compile('[.+-]$'), ''), # remove trailing puncts - (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start - (re.compile('^[.-]'), ''), # remove leading puncts - (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses - (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha - (re.compile(r'\b(pre-alpha|prealpha)\b'), - 'pre.alpha'), # standardise - (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses -) - -_SUFFIX_REPLACEMENTS = ( - (re.compile('^[:~._+-]+'), ''), # remove leading puncts - (re.compile('[,*")([\\]]'), ''), # remove unwanted chars - (re.compile('[~:+_ -]'), '.'), # replace illegal chars - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\.$'), ''), # trailing '.' -) - -_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') - - -def _suggest_semantic_version(s): - """ - Try to suggest a semantic form for a version for which - _suggest_normalized_version couldn't come up with anything. - """ - result = s.strip().lower() - for pat, repl in _REPLACEMENTS: - result = pat.sub(repl, result) - if not result: - result = '0.0.0' - - # Now look for numeric prefix, and separate it out from - # the rest. - #import pdb; pdb.set_trace() - m = _NUMERIC_PREFIX.match(result) - if not m: - prefix = '0.0.0' - suffix = result - else: - prefix = m.groups()[0].split('.') - prefix = [int(i) for i in prefix] - while len(prefix) < 3: - prefix.append(0) - if len(prefix) == 3: - suffix = result[m.end():] - else: - suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] - prefix = prefix[:3] - prefix = '.'.join([str(i) for i in prefix]) - suffix = suffix.strip() - if suffix: - #import pdb; pdb.set_trace() - # massage the suffix. - for pat, repl in _SUFFIX_REPLACEMENTS: - suffix = pat.sub(repl, suffix) - - if not suffix: - result = prefix - else: - sep = '-' if 'dev' in suffix else '+' - result = prefix + sep + suffix - if not is_semver(result): - result = None - return result - - -def _suggest_normalized_version(s): - """Suggest a normalized version close to the given version string. - - If you have a version string that isn't rational (i.e. NormalizedVersion - doesn't like it) then you might be able to get an equivalent (or close) - rational version from this function. - - This does a number of simple normalizations to the given string, based - on observation of versions currently in use on PyPI. Given a dump of - those version during PyCon 2009, 4287 of them: - - 2312 (53.93%) match NormalizedVersion without change - with the automatic suggestion - - 3474 (81.04%) match when using this suggestion method - - @param s {str} An irrational version string. - @returns A rational version string, or None, if couldn't determine one. - """ - try: - _normalized_key(s) - return s # already rational - except UnsupportedVersionError: - pass - - rs = s.lower() - - # part of this could use maketrans - for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), - ('beta', 'b'), ('rc', 'c'), ('-final', ''), - ('-pre', 'c'), - ('-release', ''), ('.release', ''), ('-stable', ''), - ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), - ('final', '')): - rs = rs.replace(orig, repl) - - # if something ends with dev or pre, we add a 0 - rs = re.sub(r"pre$", r"pre0", rs) - rs = re.sub(r"dev$", r"dev0", rs) - - # if we have something like "b-2" or "a.2" at the end of the - # version, that is probably beta, alpha, etc - # let's remove the dash or dot - rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) - - # 1.0-dev-r371 -> 1.0.dev371 - # 0.1-dev-r79 -> 0.1.dev79 - rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) - - # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 - rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) - - # Clean: v0.3, v1.0 - if rs.startswith('v'): - rs = rs[1:] - - # Clean leading '0's on numbers. - #TODO: unintended side-effect on, e.g., "2003.05.09" - # PyPI stats: 77 (~2%) better - rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) - - # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers - # zero. - # PyPI stats: 245 (7.56%) better - rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) - - # the 'dev-rNNN' tag is a dev tag - rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) - - # clean the - when used as a pre delimiter - rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) - - # a terminal "dev" or "devel" can be changed into ".dev0" - rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) - - # a terminal "dev" can be changed into ".dev0" - rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) - - # a terminal "final" or "stable" can be removed - rs = re.sub(r"(final|stable)$", "", rs) - - # The 'r' and the '-' tags are post release tags - # 0.4a1.r10 -> 0.4a1.post10 - # 0.9.33-17222 -> 0.9.33.post17222 - # 0.9.33-r17222 -> 0.9.33.post17222 - rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) - - # Clean 'r' instead of 'dev' usage: - # 0.9.33+r17222 -> 0.9.33.dev17222 - # 1.0dev123 -> 1.0.dev123 - # 1.0.git123 -> 1.0.dev123 - # 1.0.bzr123 -> 1.0.dev123 - # 0.1a0dev.123 -> 0.1a0.dev123 - # PyPI stats: ~150 (~4%) better - rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) - - # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: - # 0.2.pre1 -> 0.2c1 - # 0.2-c1 -> 0.2c1 - # 1.0preview123 -> 1.0c123 - # PyPI stats: ~21 (0.62%) better - rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) - - # Tcl/Tk uses "px" for their post release markers - rs = re.sub(r"p(\d+)$", r".post\1", rs) - - try: - _normalized_key(rs) - except UnsupportedVersionError: - rs = None - return rs - -# -# Legacy version processing (distribute-compatible) -# - -_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) -_VERSION_REPLACE = { - 'pre': 'c', - 'preview': 'c', - '-': 'final-', - 'rc': 'c', - 'dev': '@', - '': None, - '.': None, -} - - -def _legacy_key(s): - def get_parts(s): - result = [] - for p in _VERSION_PART.split(s.lower()): - p = _VERSION_REPLACE.get(p, p) - if p: - if '0' <= p[:1] <= '9': - p = p.zfill(8) - else: - p = '*' + p - result.append(p) - result.append('*final') - return result - - result = [] - for p in get_parts(s): - if p.startswith('*'): - if p < '*final': - while result and result[-1] == '*final-': - result.pop() - while result and result[-1] == '00000000': - result.pop() - result.append(p) - return tuple(result) - - -class LegacyVersion(Version): - def parse(self, s): - return _legacy_key(s) - - @property - def is_prerelease(self): - result = False - for x in self._parts: - if (isinstance(x, string_types) and x.startswith('*') and - x < '*final'): - result = True - break - return result - - -class LegacyMatcher(Matcher): - version_class = LegacyVersion - - _operators = dict(Matcher._operators) - _operators['~='] = '_match_compatible' - - numeric_re = re.compile(r'^(\d+(\.\d+)*)') - - def _match_compatible(self, version, constraint, prefix): - if version < constraint: - return False - m = self.numeric_re.match(str(constraint)) - if not m: - logger.warning('Cannot compute compatible match for version %s ' - ' and constraint %s', version, constraint) - return True - s = m.groups()[0] - if '.' in s: - s = s.rsplit('.', 1)[0] - return _match_prefix(version, s) - -# -# Semantic versioning -# - -_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' - r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' - r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) - - -def is_semver(s): - return _SEMVER_RE.match(s) - - -def _semantic_key(s): - def make_tuple(s, absent): - if s is None: - result = (absent,) - else: - parts = s[1:].split('.') - # We can't compare ints and strings on Python 3, so fudge it - # by zero-filling numeric values so simulate a numeric comparison - result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) - return result - - m = is_semver(s) - if not m: - raise UnsupportedVersionError(s) - groups = m.groups() - major, minor, patch = [int(i) for i in groups[:3]] - # choose the '|' and '*' so that versions sort correctly - pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') - return (major, minor, patch), pre, build - - -class SemanticVersion(Version): - def parse(self, s): - return _semantic_key(s) - - @property - def is_prerelease(self): - return self._parts[1][0] != '|' - - -class SemanticMatcher(Matcher): - version_class = SemanticVersion - - -class VersionScheme(object): - def __init__(self, key, matcher, suggester=None): - self.key = key - self.matcher = matcher - self.suggester = suggester - - def is_valid_version(self, s): - try: - self.matcher.version_class(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_matcher(self, s): - try: - self.matcher(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_constraint_list(self, s): - """ - Used for processing some metadata fields - """ - return self.is_valid_matcher('dummy_name (%s)' % s) - - def suggest(self, s): - if self.suggester is None: - result = None - else: - result = self.suggester(s) - return result - -_SCHEMES = { - 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, - _suggest_normalized_version), - 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), - 'semantic': VersionScheme(_semantic_key, SemanticMatcher, - _suggest_semantic_version), -} - -_SCHEMES['default'] = _SCHEMES['normalized'] - - -def get_scheme(name): - if name not in _SCHEMES: - raise ValueError('unknown scheme name: %r' % name) - return _SCHEMES[name] diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe b/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe deleted file mode 100644 index e6439e9e45897365d5ac6a85a46864c158a225fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 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�gPVRVBXt_FM7e4<}XM;HRH{62JZSn^<*L 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 OB+yBqlfeHwf&T)jA)JE% diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe b/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe deleted file mode 100644 index 46139dbf9400b7bc0b64e6756ce17b4eb5fd7436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99840 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 Z7(5y;+h}i2Zl8qUfoyWl)=;kN!N0xBaM=I= diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-39.pyc deleted file mode 100644 index 20c29f0be4307a4d98e16afa29fadebb8d905e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 zcmb7FOK%%D5GJ_~tz_Aj)6|LkNYoZBsy@_SngWFpBu$e7Mc_+~9t0J{TBN15_aT#% zYa6Re<=;`nM_>DMcb(2yJsXNKQA7_Y822z*EB{rJz2kUwy7 z_48rz2>$vx5J3b@Nk)4#V?CC6J&z)frG6Il0yp>4Fst=yF!x1}Mp?brpyYcZLQy*> zq9z+NuU8k*kEBz72^vYqv+MDmF4BpSJjup|GBy&)aiWtVx2;K@3<@E6ni#3#RClPY z8+l^5IUP$_tn4LP4h&D_zIjPeAGQ9jO5^~QU;R8-Jc7S|21Jq`6{N=m73`e!JmCo+ zMsQh#Fb1L~A{awa7Y!I|q9vMQ^_=!1u_o4mQx_|6g$)&fvH=6K_;8MxJ%PXe0f+(2 z&`3#N&jQ&bXS`zLVzuKMQDiA)NONuCd>~Z-(!gTfFD*T}Bx)7be~YKz z^o2Z@X)*4PRWVd?mL>VHKRz|1BIm=z^oMaKxgN&@**})~aX(G=`Wiy>Ij|1nq163x zGVXKO6NT!JOqPCyBHTbkKu>pkYU|rWnah*0dbk2c|AId`Yh%Q^oF{o=IPY$!#QeHXIhsZxcq0T;1}ZKxr! zq=025zz6YQBteJuQkmOkwH_BqZZrVnYnkp_ACEe0DzXN?+Gyb>){SnW|8$c^ETn5R zq-U$wuJW(cz?iwzz|$D~19A)zQgv8fQuQVdOuY?*^}y4c#+#fEirmByNY38?DeZEP zo^8y{zS_N(DhSav(~uDAth+=kG8np`}cS-h`1JG8n-D-8L@Bh&0qV)bfFMLDh2@{XUzrsb>O| zgH&LpH}icm^`}AJT5xBq;y^)@X;}IuMClpmSEdX>C!P(q2xz9D_qQ^9QCsjXD1|-2 zz9!S)$W)!C^vl3?6dzA_ydAXxo-4ddCsKD{u%4F2HlR@`qkl=vNMUPHZy|vPg1AJ1 zViTfMs}eOFE4iPXSe6!+jS?HUvz8_bGxSDW9S@_RF&`&?m_F6v<~ux=3y$`R!4xT}R@G zG_Qbs0D}4!5CXXP4xL-9$<|V`382U9D6jk4bHPdOj4Xf+c=uUX|fF|Chn=jHl?v>A{x~rulhCaxV@du3L4#?n27?T3j2-n zkl=f0*WqR8&R>SEPEOn#WW(zHc9{juc`w$|DeKi9fBOXQ`Z`x^v|U~8A@((mZ}4r} I1c;j6KNz0sR{#J2 diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py deleted file mode 100644 index 6b71975..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py deleted file mode 100644 index c178b21..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py deleted file mode 100644 index d7c4926..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/constants.py b/venv/Lib/site-packages/pip/_vendor/html5lib/constants.py deleted file mode 100644 index fe3e237..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py deleted file mode 100644 index 5ba926e..0000000 --- a/venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - -from collections import OrderedDict - - -def _attr_key(attr): - """Return an appropriate key for an attribute for sorting - - Attributes have a namespace that can be either ``None`` or a string. We - can't compare the two because they're different types, so we convert - ``None`` to an empty string first. - - """ - return (attr[0][0] or ''), attr[0][1] - - -class Filter(base.Filter): - """Alphabetizes attributes for elements""" - def __iter__(self): - for token in base.Filter.__iter__(self): - if token["type"] in ("StartTag", "EmptyTag"): - attrs = OrderedDict() - for name, value in sorted(token["data"].items(), - key=_attr_key): - attrs[name] = value - token["data"] = attrs - yield token diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py deleted file mode 100644 index c7dbaed..0000000 --- a/venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - - -class Filter(object): - def __init__(self, source): - self.source = source - - def __iter__(self): - return iter(self.source) - - def __getattr__(self, name): - return getattr(self.source, name) diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py deleted file mode 100644 index aefb5c8..0000000 --- a/venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - - -class Filter(base.Filter): - """Injects ```` 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/venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py deleted file mode 100644 index fcc07ee..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py deleted file mode 100644 index 4a86501..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py deleted file mode 100644 index aa7431d..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py deleted file mode 100644 index 0d12584..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py b/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py deleted file mode 100644 index d06784f..0000000 --- a/venv/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('

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 

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[^-]+) --(?P\d+[^-]*) -(-(?P\d+[^-]*))? --(?P\w+\d+(\.\w+\d+)*) --(?P\w+) --(?P\w+(\.\w+)*) -\.whl$ -''', re.IGNORECASE | re.VERBOSE) - -NAME_VERSION_RE = re.compile(r''' -(?P[^-]+) --(?P\d+[^-]*) -(-(?P\d+[^-]*))?$ -''', re.IGNORECASE | re.VERBOSE) - -SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') -SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') -SHEBANG_PYTHON = b'#!python' -SHEBANG_PYTHONW = b'#!pythonw' - -if os.sep == '/': - to_posix = lambda o: o -else: - to_posix = lambda o: o.replace(os.sep, '/') - - -class Mounter(object): - def __init__(self): - self.impure_wheels = {} - self.libs = {} - - def add(self, pathname, extensions): - self.impure_wheels[pathname] = extensions - self.libs.update(extensions) - - def remove(self, pathname): - extensions = self.impure_wheels.pop(pathname) - for k, v in extensions: - if k in self.libs: - del self.libs[k] - - def find_module(self, fullname, path=None): - if fullname in self.libs: - result = self - else: - result = None - return result - - def load_module(self, fullname): - if fullname in sys.modules: - result = sys.modules[fullname] - 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.__loader__ = self - parts = fullname.rsplit('.', 1) - if len(parts) > 1: - result.__package__ = parts[0] - return result - -_hook = Mounter() - - -class Wheel(object): - """ - Class to build and install from Wheel files (PEP 427). - """ - - wheel_version = (1, 1) - hash_kind = 'sha256' - - def __init__(self, filename=None, sign=False, verify=False): - """ - Initialise an instance using a (valid) filename. - """ - self.sign = sign - self.should_verify = verify - self.buildver = '' - self.pyver = [PYVER] - self.abi = ['none'] - self.arch = ['any'] - self.dirname = os.getcwd() - if filename is None: - self.name = 'dummy' - self.version = '0.1' - self._filename = self.filename - else: - m = NAME_VERSION_RE.match(filename) - if m: - info = m.groupdict('') - self.name = info['nm'] - # Reinstate the local version separator - self.version = info['vn'].replace('_', '-') - self.buildver = info['bn'] - self._filename = self.filename - else: - dirname, filename = os.path.split(filename) - m = FILENAME_RE.match(filename) - if not m: - raise DistlibException('Invalid name or ' - 'filename: %r' % filename) - if dirname: - self.dirname = os.path.abspath(dirname) - self._filename = filename - info = m.groupdict('') - self.name = info['nm'] - self.version = info['vn'] - self.buildver = info['bn'] - self.pyver = info['py'].split('.') - self.abi = info['bi'].split('.') - self.arch = info['ar'].split('.') - - @property - def filename(self): - """ - Build and return a filename from the various components. - """ - if self.buildver: - buildver = '-' + self.buildver - else: - buildver = '' - pyver = '.'.join(self.pyver) - abi = '.'.join(self.abi) - arch = '.'.join(self.arch) - # replace - with _ as a local version separator - version = self.version.replace('-', '_') - return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, - pyver, abi, arch) - - @property - def exists(self): - path = os.path.join(self.dirname, self.filename) - return os.path.isfile(path) - - @property - def tags(self): - for pyver in self.pyver: - for abi in self.abi: - for arch in self.arch: - yield pyver, abi, arch - - @cached_property - def metadata(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - wrapper = codecs.getreader('utf-8') - with ZipFile(pathname, 'r') as zf: - wheel_metadata = self.get_wheel_metadata(zf) - wv = wheel_metadata['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - # if file_version < (1, 1): - # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, - # LEGACY_METADATA_FILENAME] - # else: - # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] - fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME] - result = None - for fn in fns: - try: - metadata_filename = posixpath.join(info_dir, fn) - with zf.open(metadata_filename) as bf: - wf = wrapper(bf) - result = Metadata(fileobj=wf) - if result: - break - except KeyError: - pass - if not result: - raise ValueError('Invalid wheel, because metadata is ' - 'missing: looked in %s' % ', '.join(fns)) - return result - - def get_wheel_metadata(self, zf): - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - metadata_filename = posixpath.join(info_dir, 'WHEEL') - with zf.open(metadata_filename) as bf: - wf = codecs.getreader('utf-8')(bf) - message = message_from_file(wf) - return dict(message) - - @cached_property - def info(self): - pathname = os.path.join(self.dirname, self.filename) - with ZipFile(pathname, 'r') as zf: - result = self.get_wheel_metadata(zf) - return result - - def process_shebang(self, data): - m = SHEBANG_RE.match(data) - if m: - end = m.end() - shebang, data_after_shebang = data[:end], data[end:] - # Preserve any arguments after the interpreter - if b'pythonw' in shebang.lower(): - shebang_python = SHEBANG_PYTHONW - else: - shebang_python = SHEBANG_PYTHON - m = SHEBANG_DETAIL_RE.match(shebang) - if m: - args = b' ' + m.groups()[-1] - else: - args = b'' - shebang = shebang_python + args - data = shebang + data_after_shebang - else: - cr = data.find(b'\r') - lf = data.find(b'\n') - if cr < 0 or cr > lf: - term = b'\n' - else: - if data[cr:cr + 2] == b'\r\n': - term = b'\r\n' - else: - term = b'\r' - data = SHEBANG_PYTHON + term + data - return data - - def get_hash(self, data, hash_kind=None): - if hash_kind is None: - hash_kind = self.hash_kind - try: - hasher = getattr(hashlib, hash_kind) - except AttributeError: - raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) - result = hasher(data).digest() - result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') - return hash_kind, result - - def write_record(self, records, record_path, base): - records = list(records) # make a copy, as mutated - p = to_posix(os.path.relpath(record_path, base)) - records.append((p, '', '')) - with CSVWriter(record_path) as writer: - for row in records: - writer.writerow(row) - - def write_records(self, info, libdir, archive_paths): - records = [] - distinfo, info_dir = info - hasher = getattr(hashlib, self.hash_kind) - for ap, p in archive_paths: - with open(p, 'rb') as f: - data = f.read() - digest = '%s=%s' % self.get_hash(data) - size = os.path.getsize(p) - 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')) - archive_paths.append((ap, p)) - - def build_zip(self, pathname, archive_paths): - with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: - for ap, p in archive_paths: - logger.debug('Wrote %s to %s in wheel', p, ap) - zf.write(p, ap) - - def build(self, paths, tags=None, wheel_version=None): - """ - Build a wheel from files in specified paths, and use any specified tags - when determining the name of the wheel. - """ - if tags is None: - tags = {} - - libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] - if libkey == 'platlib': - is_pure = 'false' - default_pyver = [IMPVER] - default_abi = [ABI] - default_arch = [ARCH] - else: - is_pure = 'true' - default_pyver = [PYVER] - default_abi = ['none'] - default_arch = ['any'] - - self.pyver = tags.get('pyver', default_pyver) - self.abi = tags.get('abi', default_abi) - self.arch = tags.get('arch', default_arch) - - libdir = paths[libkey] - - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - archive_paths = [] - - # First, stuff which is not in site-packages - for key in ('data', 'headers', 'scripts'): - if key not in paths: - continue - path = paths[key] - if os.path.isdir(path): - for root, dirs, files in os.walk(path): - for fn in files: - p = fsdecode(os.path.join(root, fn)) - rp = os.path.relpath(p, path) - ap = to_posix(os.path.join(data_dir, key, rp)) - archive_paths.append((ap, p)) - if key == 'scripts' and not p.endswith('.exe'): - with open(p, 'rb') as f: - data = f.read() - data = self.process_shebang(data) - with open(p, 'wb') as f: - f.write(data) - - # Now, stuff which is in site-packages, other than the - # distinfo stuff. - path = libdir - distinfo = None - for root, dirs, files in os.walk(path): - if root == path: - # At the top level only, save distinfo for later - # and skip it for now - for i, dn in enumerate(dirs): - dn = fsdecode(dn) - if dn.endswith('.dist-info'): - distinfo = os.path.join(root, dn) - del dirs[i] - break - assert distinfo, '.dist-info directory expected, not found' - - for fn in files: - # comment out next suite to leave .pyc files in - if fsdecode(fn).endswith(('.pyc', '.pyo')): - continue - p = os.path.join(root, fn) - rp = to_posix(os.path.relpath(p, path)) - archive_paths.append((rp, p)) - - # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. - files = os.listdir(distinfo) - for fn in files: - if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): - p = fsdecode(os.path.join(distinfo, fn)) - ap = to_posix(os.path.join(info_dir, fn)) - archive_paths.append((ap, p)) - - wheel_metadata = [ - 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), - 'Generator: distlib %s' % __version__, - 'Root-Is-Purelib: %s' % is_pure, - ] - for pyver, abi, arch in self.tags: - wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) - p = os.path.join(distinfo, 'WHEEL') - with open(p, 'w') as f: - f.write('\n'.join(wheel_metadata)) - ap = to_posix(os.path.join(info_dir, 'WHEEL')) - archive_paths.append((ap, p)) - - # sort the entries by archive path. Not needed by any spec, but it - # keeps the archive listing and RECORD tidier than they would otherwise - # be. Use the number of path segments to keep directory entries together, - # and keep the dist-info stuff at the end. - def sorter(t): - ap = t[0] - n = ap.count('/') - if '.dist-info' in ap: - n += 10000 - return (n, ap) - archive_paths = sorted(archive_paths, key=sorter) - - # Now, at last, RECORD. - # Paths in here are archive paths - nothing else makes sense. - self.write_records((distinfo, info_dir), libdir, archive_paths) - # Now, ready to build the zip file - pathname = os.path.join(self.dirname, self.filename) - self.build_zip(pathname, archive_paths) - return pathname - - def skip_entry(self, arcname): - """ - Determine whether an archive entry should be skipped when verifying - or installing. - """ - # The signature file won't be in RECORD, - # and we don't currently don't do anything with it - # We also skip directories, as they won't be in RECORD - # either. See: - # - # https://github.com/pypa/wheel/issues/294 - # https://github.com/pypa/wheel/issues/287 - # https://github.com/pypa/wheel/pull/289 - # - return arcname.endswith(('/', '/RECORD.jws')) - - def install(self, paths, maker, **kwargs): - """ - Install a wheel to the specified paths. If kwarg ``warner`` is - specified, it should be a callable, which will be called with two - tuples indicating the wheel version of this software and the wheel - version in the file, if there is a discrepancy in the versions. - This can be used to issue any warnings to raise any exceptions. - If kwarg ``lib_only`` is True, only the purelib/platlib files are - installed, and the headers, scripts, data and dist-info metadata are - not written. If kwarg ``bytecode_hashed_invalidation`` is True, written - bytecode will try to use file-hash based invalidation (PEP-552) on - supported interpreter versions (CPython 2.7+). - - The return value is a :class:`InstalledDistribution` instance unless - ``options.lib_only`` is True, in which case the return value is ``None``. - """ - - dry_run = maker.dry_run - warner = kwargs.get('warner') - lib_only = kwargs.get('lib_only', False) - bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - if (file_version != self.wheel_version) and warner: - warner(self.wheel_version, file_version) - - if message['Root-Is-Purelib'] == 'true': - libdir = paths['purelib'] - else: - libdir = paths['platlib'] - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - data_pfx = posixpath.join(data_dir, '') - info_pfx = posixpath.join(info_dir, '') - script_pfx = posixpath.join(data_dir, 'scripts', '') - - # make a new instance rather than a copy of maker's, - # as we mutate it - fileop = FileOperator(dry_run=dry_run) - fileop.record = True # so we can rollback if needed - - bc = not sys.dont_write_bytecode # Double negatives. Lovely! - - outfiles = [] # for RECORD writing - - # for script copying/shebang processing - workdir = tempfile.mkdtemp() - # set target dir later - # we default add_launchers to False, as the - # Python Launcher should be used instead - maker.source_dir = workdir - maker.target_dir = None - try: - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if self.skip_entry(u_arcname): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - if lib_only and u_arcname.startswith((info_pfx, data_pfx)): - logger.debug('lib_only: skipping %s', u_arcname) - continue - is_script = (u_arcname.startswith(script_pfx) - and not u_arcname.endswith('.exe')) - - if u_arcname.startswith(data_pfx): - _, where, rp = u_arcname.split('/', 2) - outfile = os.path.join(paths[where], convert_path(rp)) - else: - # meant for site-packages. - if u_arcname in (wheel_metadata_name, record_name): - continue - outfile = os.path.join(libdir, convert_path(u_arcname)) - if not is_script: - with zf.open(arcname) as bf: - fileop.copy_stream(bf, outfile) - outfiles.append(outfile) - # Double check the digest of the written file - if not dry_run and row[1]: - with open(outfile, 'rb') as bf: - data = bf.read() - _, newdigest = self.get_hash(data, kind) - if newdigest != digest: - raise DistlibException('digest mismatch ' - 'on write for ' - '%s' % outfile) - if bc and outfile.endswith('.py'): - try: - pyc = fileop.byte_compile(outfile, - hashed_invalidation=bc_hashed_invalidation) - outfiles.append(pyc) - except Exception: - # Don't give up if byte-compilation fails, - # but log it and perhaps warn the user - logger.warning('Byte-compilation failed', - exc_info=True) - else: - fn = os.path.basename(convert_path(arcname)) - workname = os.path.join(workdir, fn) - with zf.open(arcname) as bf: - fileop.copy_stream(bf, workname) - - dn, fn = os.path.split(outfile) - maker.target_dir = dn - filenames = maker.make(fn) - fileop.set_executable_mode(filenames) - outfiles.extend(filenames) - - if lib_only: - logger.debug('lib_only: returning None') - dist = None - else: - # Generate scripts - - # Try to get pydist.json so we can see if there are - # any commands to generate. If this fails (e.g. because - # of a legacy wheel), log a warning but don't give up. - commands = None - file_version = self.info['Wheel-Version'] - if file_version == '1.0': - # Use legacy info - ep = posixpath.join(info_dir, 'entry_points.txt') - try: - with zf.open(ep) as bwf: - epdata = read_exports(bwf) - commands = {} - for key in ('console', 'gui'): - k = '%s_scripts' % key - if k in epdata: - commands['wrap_%s' % key] = d = {} - for v in epdata[k].values(): - s = '%s:%s' % (v.prefix, v.suffix) - if v.flags: - s += ' [%s]' % ','.join(v.flags) - d[v.name] = s - except Exception: - logger.warning('Unable to read legacy script ' - 'metadata, so cannot generate ' - 'scripts') - else: - try: - with zf.open(metadata_name) as bwf: - wf = wrapper(bwf) - commands = json.load(wf).get('extensions') - if commands: - commands = commands.get('python.commands') - except Exception: - logger.warning('Unable to read JSON metadata, so ' - 'cannot generate scripts') - if commands: - console_scripts = commands.get('wrap_console', {}) - gui_scripts = commands.get('wrap_gui', {}) - if console_scripts or gui_scripts: - script_dir = paths.get('scripts', '') - if not os.path.isdir(script_dir): - raise ValueError('Valid script path not ' - 'specified') - maker.target_dir = script_dir - for k, v in console_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script) - fileop.set_executable_mode(filenames) - - if gui_scripts: - options = {'gui': True } - for k, v in gui_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script, options) - fileop.set_executable_mode(filenames) - - p = os.path.join(libdir, info_dir) - dist = InstalledDistribution(p) - - # Write SHARED - paths = dict(paths) # don't change passed in dict - del paths['purelib'] - del paths['platlib'] - paths['lib'] = libdir - p = dist.write_shared_locations(paths, dry_run) - if p: - outfiles.append(p) - - # Write RECORD - dist.write_installed_files(outfiles, paths['prefix'], - dry_run) - return dist - except Exception: # pragma: no cover - logger.exception('installation failed.') - fileop.rollback() - raise - finally: - shutil.rmtree(workdir) - - def _get_dylib_cache(self): - global cache - if cache is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('dylib-cache'), - '%s.%s' % sys.version_info[:2]) - cache = Cache(base) - return cache - - def _get_extensions(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - arcname = posixpath.join(info_dir, 'EXTENSIONS') - wrapper = codecs.getreader('utf-8') - result = [] - with ZipFile(pathname, 'r') as zf: - try: - with zf.open(arcname) as bf: - wf = wrapper(bf) - extensions = json.load(wf) - cache = self._get_dylib_cache() - prefix = cache.prefix_to_dir(pathname) - cache_base = os.path.join(cache.base, prefix) - if not os.path.isdir(cache_base): - os.makedirs(cache_base) - for name, relpath in extensions.items(): - dest = os.path.join(cache_base, convert_path(relpath)) - if not os.path.exists(dest): - extract = True - else: - file_time = os.stat(dest).st_mtime - file_time = datetime.datetime.fromtimestamp(file_time) - info = zf.getinfo(relpath) - wheel_time = datetime.datetime(*info.date_time) - extract = wheel_time > file_time - if extract: - zf.extract(relpath, cache_base) - result.append((name, dest)) - except KeyError: - pass - return result - - def is_compatible(self): - """ - Determine if a wheel is compatible with the running system. - """ - return is_compatible(self) - - def is_mountable(self): - """ - Determine if a wheel is asserted as mountable by its metadata. - """ - return True # for now - metadata details TBD - - def mount(self, append=False): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if not self.is_compatible(): - msg = 'Wheel %s not compatible with this Python.' % pathname - raise DistlibException(msg) - if not self.is_mountable(): - msg = 'Wheel %s is marked as not mountable.' % pathname - raise DistlibException(msg) - if pathname in sys.path: - logger.debug('%s already in path', pathname) - else: - if append: - sys.path.append(pathname) - else: - sys.path.insert(0, pathname) - extensions = self._get_extensions() - if extensions: - if _hook not in sys.meta_path: - sys.meta_path.append(_hook) - _hook.add(pathname, extensions) - - def unmount(self): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if pathname not in sys.path: - logger.debug('%s not in path', pathname) - else: - sys.path.remove(pathname) - if pathname in _hook.impure_wheels: - _hook.remove(pathname) - if not _hook.impure_wheels: - if _hook in sys.meta_path: - sys.meta_path.remove(_hook) - - def verify(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - # TODO version verification - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - # See issue #115: some wheels have .. in their entries, but - # in the filename ... e.g. __main__..py ! So the check is - # updated to look for .. in the directory portions - p = u_arcname.split('/') - if '..' in p: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - - if self.skip_entry(u_arcname): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - def update(self, modifier, dest_dir=None, **kwargs): - """ - Update the contents of a wheel in a generic way. The modifier should - be a callable which expects a dictionary argument: its keys are - archive-entry paths, and its values are absolute filesystem paths - where the contents the corresponding archive entries can be found. The - modifier is free to change the contents of the files pointed to, add - new entries and remove entries, before returning. This method will - extract the entire contents of the wheel to a temporary location, call - the modifier, and then use the passed (and possibly updated) - dictionary to write a new wheel. If ``dest_dir`` is specified, the new - wheel is written there -- otherwise, the original wheel is overwritten. - - The modifier should return True if it updated the wheel, else False. - This method returns the same value the modifier returns. - """ - - def get_version(path_map, info_dir): - version = path = None - key = '%s/%s' % (info_dir, LEGACY_METADATA_FILENAME) - if key not in path_map: - key = '%s/PKG-INFO' % info_dir - if key in path_map: - path = path_map[key] - version = Metadata(path=path).version - return version, path - - def update_version(version, path): - updated = None - try: - v = NormalizedVersion(version) - i = version.find('-') - if i < 0: - updated = '%s+1' % version - else: - parts = [int(s) for s in version[i + 1:].split('.')] - parts[-1] += 1 - updated = '%s+%s' % (version[:i], - '.'.join(str(i) for i in parts)) - except UnsupportedVersionError: - logger.debug('Cannot update non-compliant (PEP-440) ' - 'version %r', version) - if updated: - md = Metadata(path=path) - md.version = updated - legacy = path.endswith(LEGACY_METADATA_FILENAME) - md.write(path=path, legacy=legacy) - logger.debug('Version updated from %r to %r', version, - updated) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - record_name = posixpath.join(info_dir, 'RECORD') - with tempdir() as workdir: - with ZipFile(pathname, 'r') as zf: - path_map = {} - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if u_arcname == record_name: - continue - if '..' in u_arcname: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - zf.extract(zinfo, workdir) - path = os.path.join(workdir, convert_path(u_arcname)) - path_map[u_arcname] = path - - # Remember the version. - original_version, _ = get_version(path_map, info_dir) - # Files extracted. Call the modifier. - modified = modifier(path_map, **kwargs) - if modified: - # Something changed - need to build a new wheel. - current_version, path = get_version(path_map, info_dir) - if current_version and (current_version == original_version): - # Add or update local version to signify changes. - update_version(current_version, path) - # Decide where the new wheel goes. - if dest_dir is None: - fd, newpath = tempfile.mkstemp(suffix='.whl', - prefix='wheel-update-', - dir=workdir) - os.close(fd) - else: - if not os.path.isdir(dest_dir): - raise DistlibException('Not a directory: %r' % dest_dir) - newpath = os.path.join(dest_dir, self.filename) - archive_paths = list(path_map.items()) - distinfo = os.path.join(workdir, info_dir) - info = distinfo, info_dir - self.write_records(info, workdir, archive_paths) - self.build_zip(newpath, archive_paths) - if dest_dir is None: - shutil.copyfile(newpath, pathname) - return modified - -def compatible_tags(): - """ - Return (pyver, abi, arch) tuples compatible with this Python. - """ - versions = [VER_SUFFIX] - major = VER_SUFFIX[0] - for minor in range(sys.version_info[1] - 1, - 1, -1): - versions.append(''.join([major, str(minor)])) - - abis = [] - for suffix, _, _ in imp.get_suffixes(): - if suffix.startswith('.abi'): - abis.append(suffix.split('.', 2)[1]) - abis.sort() - if ABI != 'none': - abis.insert(0, ABI) - abis.append('none') - result = [] - - arches = [ARCH] - if sys.platform == 'darwin': - m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) - if m: - name, major, minor, arch = m.groups() - minor = int(minor) - matches = [arch] - if arch in ('i386', 'ppc'): - matches.append('fat') - if arch in ('i386', 'ppc', 'x86_64'): - matches.append('fat3') - if arch in ('ppc64', 'x86_64'): - matches.append('fat64') - if arch in ('i386', 'x86_64'): - matches.append('intel') - if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): - matches.append('universal') - while minor >= 0: - for match in matches: - s = '%s_%s_%s_%s' % (name, major, minor, match) - if s != ARCH: # already there - arches.append(s) - minor -= 1 - - # Most specific - our Python version, ABI and arch - for abi in abis: - for arch in arches: - result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) - - # where no ABI / arch dependency, but IMP_PREFIX dependency - for i, version in enumerate(versions): - result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) - if i == 0: - result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) - - # no IMP_PREFIX, ABI or arch dependency - for i, version in enumerate(versions): - result.append((''.join(('py', version)), 'none', 'any')) - if i == 0: - result.append((''.join(('py', version[0])), 'none', 'any')) - return set(result) - - -COMPATIBLE_TAGS = compatible_tags() - -del compatible_tags - - -def is_compatible(wheel, tags=None): - if not isinstance(wheel, Wheel): - wheel = Wheel(wheel) # assume it's a filename - result = False - if tags is None: - tags = COMPATIBLE_TAGS - for ver, abi, arch in tags: - if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: - result = True - break - return result diff --git a/venv/Lib/site-packages/pip/_vendor/distro.py b/venv/Lib/site-packages/pip/_vendor/distro.py deleted file mode 100644 index 0611b62..0000000 --- a/venv/Lib/site-packages/pip/_vendor/distro.py +++ /dev/null @@ -1,1230 +0,0 @@ -# Copyright 2015,2016,2017 Nir Cohen -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -The ``distro`` package (``distro`` stands for Linux Distribution) provides -information about the Linux distribution it runs on, such as a reliable -machine-readable distro ID, or version information. - -It is the recommended replacement for Python's original -:py:func:`platform.linux_distribution` function, but it provides much more -functionality. An alternative implementation became necessary because Python -3.5 deprecated this function, and Python 3.8 will remove it altogether. -Its predecessor function :py:func:`platform.dist` was already -deprecated since Python 2.6 and will also be removed in Python 3.8. -Still, there are many cases in which access to OS distribution information -is needed. See `Python issue 1322 `_ for -more information. -""" - -import os -import re -import sys -import json -import shlex -import logging -import argparse -import subprocess - - -_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') -_OS_RELEASE_BASENAME = 'os-release' - -#: Translation table for normalizing the "ID" attribute defined in os-release -#: files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as defined in the os-release file, translated to lower case, -#: with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_OS_ID = { - 'ol': 'oracle', # Oracle Linux -} - -#: Translation table for normalizing the "Distributor ID" attribute returned by -#: the lsb_release command, for use by the :func:`distro.id` method. -#: -#: * Key: Value as returned by the lsb_release command, translated to lower -#: case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_LSB_ID = { - 'enterpriseenterpriseas': 'oracle', # Oracle Enterprise Linux 4 - 'enterpriseenterpriseserver': 'oracle', # Oracle Linux 5 - 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation - 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server - 'redhatenterprisecomputenode': 'rhel', # RHEL 6 ComputeNode -} - -#: Translation table for normalizing the distro ID derived from the file name -#: of distro release files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as derived from the file name of a distro release file, -#: translated to lower case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_DISTRO_ID = { - 'redhat': 'rhel', # RHEL 6.x, 7.x -} - -# Pattern for content of distro release file (reversed) -_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( - r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') - -# Pattern for base file name of distro release file -_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( - r'(\w+)[-_](release|version)$') - -# Base file names to be ignored when searching for distro release file -_DISTRO_RELEASE_IGNORE_BASENAMES = ( - 'debian_version', - 'lsb-release', - 'oem-release', - _OS_RELEASE_BASENAME, - 'system-release', - 'plesk-release', -) - - -def linux_distribution(full_distribution_name=True): - """ - Return information about the current OS distribution as a tuple - ``(id_name, version, codename)`` with items as follows: - - * ``id_name``: If *full_distribution_name* is false, the result of - :func:`distro.id`. Otherwise, the result of :func:`distro.name`. - - * ``version``: The result of :func:`distro.version`. - - * ``codename``: 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 - its parameters. - - The data it returns may not exactly be the same, because it uses more data - sources than the original function, and that may lead to different data if - the OS distribution is not consistent across multiple data sources it - provides (there are indeed such distributions ...). - - Another reason for differences is the fact that the :func:`distro.id` - method normalizes the distro ID string to a reliable machine-readable value - for a number of popular OS distributions. - """ - return _distro.linux_distribution(full_distribution_name) - - -def id(): - """ - Return the distro ID of the current distribution, as a - machine-readable string. - - For a number of OS distributions, the returned distro ID value is - *reliable*, in the sense that it is documented and that it does not change - across releases of the distribution. - - This package maintains the following reliable distro ID values: - - ============== ========================================= - Distro ID Distribution - ============== ========================================= - "ubuntu" Ubuntu - "debian" Debian - "rhel" RedHat Enterprise Linux - "centos" CentOS - "fedora" Fedora - "sles" SUSE Linux Enterprise Server - "opensuse" openSUSE - "amazon" Amazon Linux - "arch" Arch Linux - "cloudlinux" CloudLinux OS - "exherbo" Exherbo Linux - "gentoo" GenToo Linux - "ibm_powerkvm" IBM PowerKVM - "kvmibm" KVM for IBM z Systems - "linuxmint" Linux Mint - "mageia" Mageia - "mandriva" Mandriva Linux - "parallels" Parallels - "pidora" Pidora - "raspbian" Raspbian - "oracle" Oracle Linux (and Oracle Enterprise Linux) - "scientific" Scientific Linux - "slackware" Slackware - "xenserver" XenServer - "openbsd" OpenBSD - "netbsd" NetBSD - "freebsd" FreeBSD - "midnightbsd" MidnightBSD - ============== ========================================= - - If you have a need to get distros for reliable IDs added into this set, - or if you find that the :func:`distro.id` function returns a different - distro ID for one of the listed distros, please create an issue in the - `distro issue tracker`_. - - **Lookup hierarchy and transformations:** - - First, the ID is obtained from the following sources, in the specified - order. The first available and non-empty value is used: - - * the value of the "ID" attribute of the os-release file, - - * the value of the "Distributor ID" attribute returned by the lsb_release - command, - - * the first part of the file name of the distro release file, - - The so determined ID value then passes the following transformations, - before it is returned by this method: - - * it is translated to lower case, - - * blanks (which should not be there anyway) are translated to underscores, - - * a normalization of the ID is performed, based upon - `normalization tables`_. The purpose of this normalization is to ensure - that the ID is as reliable as possible, even across incompatible changes - in the OS distributions. A common reason for an incompatible change is - the addition of an os-release file, or the addition of the lsb_release - command, with ID values that differ from what was previously determined - from the distro release file name. - """ - return _distro.id() - - -def name(pretty=False): - """ - Return the name of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the name is returned without version or codename. - (e.g. "CentOS Linux") - - If *pretty* is true, the version and codename are appended. - (e.g. "CentOS Linux 7.1.1503 (Core)") - - **Lookup hierarchy:** - - The name is obtained from the following sources, in the specified order. - The first available and non-empty value is used: - - * If *pretty* is false: - - - the value of the "NAME" attribute of the os-release file, - - - the value of the "Distributor ID" attribute returned by the lsb_release - command, - - - the value of the "" field of the distro release file. - - * If *pretty* is true: - - - the value of the "PRETTY_NAME" attribute of the os-release file, - - - the value of the "Description" attribute returned by the lsb_release - command, - - - the value of the "" field of the distro release file, appended - with the value of the pretty version ("" and "" - fields) of the distro release file, if available. - """ - return _distro.name(pretty) - - -def version(pretty=False, best=False): - """ - Return the version of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the version is returned without codename (e.g. - "7.0"). - - If *pretty* is true, the codename in parenthesis is appended, if the - codename is non-empty (e.g. "7.0 (Maipo)"). - - Some distributions provide version numbers with different precisions in - the different sources of distribution information. Examining the different - sources in a fixed priority order does not always yield the most precise - version (e.g. for Debian 8.2, or CentOS 7.1). - - The *best* parameter can be used to control the approach for the returned - version: - - If *best* is false, the first non-empty version number in priority order of - the examined sources is returned. - - If *best* is true, the most precise version number out of all examined - sources is returned. - - **Lookup hierarchy:** - - In all cases, the version number is obtained from the following sources. - If *best* is false, this order represents the priority order: - - * the value of the "VERSION_ID" attribute of the os-release file, - * the value of the "Release" attribute returned by the lsb_release - command, - * the version number parsed from the "" field of the first line - of the distro release file, - * the version number parsed from the "PRETTY_NAME" attribute of the - os-release file, if it follows the format of the distro release files. - * the version number parsed from the "Description" attribute returned by - the lsb_release command, if it follows the format of the distro release - files. - """ - return _distro.version(pretty, best) - - -def version_parts(best=False): - """ - Return the version of the current OS distribution as a tuple - ``(major, minor, build_number)`` with items as follows: - - * ``major``: The result of :func:`distro.major_version`. - - * ``minor``: The result of :func:`distro.minor_version`. - - * ``build_number``: The result of :func:`distro.build_number`. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.version_parts(best) - - -def major_version(best=False): - """ - Return the major version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The major version is the first - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.major_version(best) - - -def minor_version(best=False): - """ - Return the minor version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The minor version is the second - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.minor_version(best) - - -def build_number(best=False): - """ - Return the build number of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The build number is the third part - of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.build_number(best) - - -def like(): - """ - Return a space-separated list of distro IDs of distributions that are - closely related to the current OS distribution in regards to packaging - and programming interfaces, for example distributions the current - distribution is a derivative from. - - **Lookup hierarchy:** - - This information item is only provided by the os-release file. - For details, see the description of the "ID_LIKE" attribute in the - `os-release man page - `_. - """ - return _distro.like() - - -def codename(): - """ - Return the codename for the release of the current OS distribution, - as a string. - - If the distribution does not have a codename, an empty string is returned. - - Note that the returned codename is not always really a codename. For - example, openSUSE returns "x86_64". This function does not handle such - cases in any special way and just returns the string it finds, if any. - - **Lookup hierarchy:** - - * the codename within the "VERSION" attribute of the os-release file, if - provided, - - * the value of the "Codename" attribute returned by the lsb_release - command, - - * the value of the "" field of the distro release file. - """ - return _distro.codename() - - -def info(pretty=False, best=False): - """ - Return certain machine-readable information items about the current OS - distribution in a dictionary, as shown in the following example: - - .. sourcecode:: python - - { - 'id': 'rhel', - 'version': '7.0', - 'version_parts': { - 'major': '7', - 'minor': '0', - 'build_number': '' - }, - 'like': 'fedora', - 'codename': 'Maipo' - } - - The dictionary structure and keys are always the same, regardless of which - information items are available in the underlying data sources. The values - for the various keys are as follows: - - * ``id``: The result of :func:`distro.id`. - - * ``version``: The result of :func:`distro.version`. - - * ``version_parts -> major``: The result of :func:`distro.major_version`. - - * ``version_parts -> minor``: The result of :func:`distro.minor_version`. - - * ``version_parts -> build_number``: The result of - :func:`distro.build_number`. - - * ``like``: The result of :func:`distro.like`. - - * ``codename``: The result of :func:`distro.codename`. - - For a description of the *pretty* and *best* parameters, see the - :func:`distro.version` method. - """ - return _distro.info(pretty, best) - - -def os_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the os-release file data source of the current OS distribution. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_info() - - -def lsb_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the lsb_release command data source of the current OS distribution. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_info() - - -def distro_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_info() - - -def uname_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - """ - return _distro.uname_info() - - -def os_release_attr(attribute): - """ - Return a single named information item from the os-release file data source - of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_attr(attribute) - - -def lsb_release_attr(attribute): - """ - Return a single named information item from the lsb_release command output - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_attr(attribute) - - -def distro_release_attr(attribute): - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_attr(attribute) - - -def uname_attr(attribute): - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - """ - return _distro.uname_attr(attribute) - - -class cached_property(object): - """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): - self._fname = f.__name__ - self._f = f - - def __get__(self, obj, owner): - assert obj is not None, 'call {} on an instance'.format(self._fname) - ret = obj.__dict__[self._fname] = self._f(obj) - return ret - - -class LinuxDistribution(object): - """ - Provides information about a OS distribution. - - This package creates a private module-global instance of this class with - default initialization arguments, that is used by the - `consolidated accessor functions`_ and `single source accessor functions`_. - By using default initialization arguments, that module-global instance - returns data about the current OS distribution (i.e. the distro this - package runs on). - - Normally, it is not necessary to create additional instances of this class. - However, in situations where control is needed over the exact data sources - that are used, instances of this class can be created with a specific - distro release file, or a specific os-release file, or without invoking the - lsb_release command. - """ - - def __init__(self, - include_lsb=True, - os_release_file='', - distro_release_file='', - include_uname=True): - """ - The initialization method of this class gathers information from the - available data sources, and stores that in private instance attributes. - Subsequent access to the information items uses these private instance - attributes, so that the data sources are read only once. - - Parameters: - - * ``include_lsb`` (bool): Controls whether the - `lsb_release command output`_ is included as a data source. - - If the lsb_release command is not available in the program execution - path, the data source for the lsb_release command will be empty. - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is to be used as a data source. - - An empty string (the default) will cause the default path name to - be used (see `os-release file`_ for details). - - If the specified or defaulted os-release file does not exist, the - data source for the os-release file will be empty. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is to be used as a data source. - - An empty string (the default) will cause a default search algorithm - to be used (see `distro release file`_ for details). - - If the specified distro release file does not exist, or if no default - distro release file can be found, the data source for the distro - release file will be empty. - - * ``include_uname`` (bool): Controls whether uname command output is - included as a data source. If the uname command is not available in - the program execution path the data source for the uname command will - be empty. - - Public instance attributes: - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. - This controls whether the lsb information will be loaded. - - * ``include_uname`` (bool): The result of the ``include_uname`` - parameter. This controls whether the uname information will - be loaded. - - Raises: - - * :py:exc:`IOError`: Some I/O issue with an os-release file or distro - release file. - - * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had - some issue (other than not being available in the program execution - path). - - * :py:exc:`UnicodeError`: A data source has unexpected characters or - uses an unexpected encoding. - """ - self.os_release_file = os_release_file or \ - os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) - self.distro_release_file = distro_release_file or '' # updated later - self.include_lsb = include_lsb - self.include_uname = include_uname - - def __repr__(self): - """Return repr of all info - """ - return \ - "LinuxDistribution(" \ - "os_release_file={self.os_release_file!r}, " \ - "distro_release_file={self.distro_release_file!r}, " \ - "include_lsb={self.include_lsb!r}, " \ - "include_uname={self.include_uname!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) - - def linux_distribution(self, full_distribution_name=True): - """ - Return information about the OS distribution that is compatible - with Python's :func:`platform.linux_distribution`, supporting a subset - of its parameters. - - For details, see :func:`distro.linux_distribution`. - """ - return ( - self.name() if full_distribution_name else self.id(), - self.version(), - self.codename() - ) - - def id(self): - """Return the distro ID of the OS distribution, as a string. - - For details, see :func:`distro.id`. - """ - def normalize(distro_id, table): - distro_id = distro_id.lower().replace(' ', '_') - return table.get(distro_id, distro_id) - - distro_id = self.os_release_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_OS_ID) - - distro_id = self.lsb_release_attr('distributor_id') - if distro_id: - return normalize(distro_id, NORMALIZED_LSB_ID) - - distro_id = self.distro_release_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - distro_id = self.uname_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - return '' - - def name(self, pretty=False): - """ - Return the name of the OS distribution, as a string. - - For details, see :func:`distro.name`. - """ - name = self.os_release_attr('name') \ - or self.lsb_release_attr('distributor_id') \ - or self.distro_release_attr('name') \ - or self.uname_attr('name') - if pretty: - name = self.os_release_attr('pretty_name') \ - or self.lsb_release_attr('description') - if not name: - name = self.distro_release_attr('name') \ - or self.uname_attr('name') - version = self.version(pretty=True) - if version: - name = name + ' ' + version - return name or '' - - def version(self, pretty=False, best=False): - """ - Return the version of the OS distribution, as a string. - - For details, see :func:`distro.version`. - """ - versions = [ - self.os_release_attr('version_id'), - self.lsb_release_attr('release'), - self.distro_release_attr('version_id'), - self._parse_distro_release_content( - self.os_release_attr('pretty_name')).get('version_id', ''), - self._parse_distro_release_content( - self.lsb_release_attr('description')).get('version_id', ''), - self.uname_attr('release') - ] - version = '' - if best: - # This algorithm uses the last version in priority order that has - # the best precision. If the versions are not in conflict, that - # does not matter; otherwise, using the last one instead of the - # first one might be considered a surprise. - for v in versions: - if v.count(".") > version.count(".") or version == '': - version = v - else: - for v in versions: - if v != '': - version = v - break - if pretty and version and self.codename(): - version = '{0} ({1})'.format(version, self.codename()) - return version - - def version_parts(self, best=False): - """ - Return the version of the OS distribution, as a tuple of version - numbers. - - For details, see :func:`distro.version_parts`. - """ - version_str = self.version(best=best) - if version_str: - version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') - matches = version_regex.match(version_str) - if matches: - major, minor, build_number = matches.groups() - return major, minor or '', build_number or '' - return '', '', '' - - def major_version(self, best=False): - """ - Return the major version number of the current distribution. - - For details, see :func:`distro.major_version`. - """ - return self.version_parts(best)[0] - - def minor_version(self, best=False): - """ - Return the minor version number of the current distribution. - - For details, see :func:`distro.minor_version`. - """ - return self.version_parts(best)[1] - - def build_number(self, best=False): - """ - Return the build number of the current distribution. - - For details, see :func:`distro.build_number`. - """ - return self.version_parts(best)[2] - - def like(self): - """ - Return the IDs of distributions that are like the OS distribution. - - For details, see :func:`distro.like`. - """ - return self.os_release_attr('id_like') or '' - - def codename(self): - """ - Return the codename of the OS distribution. - - For details, see :func:`distro.codename`. - """ - try: - # Handle os_release specially since distros might purposefully set - # this to empty string to have no codename - return self._os_release_info['codename'] - except KeyError: - return self.lsb_release_attr('codename') \ - or self.distro_release_attr('codename') \ - or '' - - def info(self, pretty=False, best=False): - """ - Return certain machine-readable information about the OS - distribution. - - For details, see :func:`distro.info`. - """ - return dict( - id=self.id(), - version=self.version(pretty, best), - version_parts=dict( - major=self.major_version(best), - minor=self.minor_version(best), - build_number=self.build_number(best) - ), - like=self.like(), - codename=self.codename(), - ) - - def os_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the os-release file data source of the OS distribution. - - For details, see :func:`distro.os_release_info`. - """ - return self._os_release_info - - def lsb_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the lsb_release command data source of the OS - distribution. - - For details, see :func:`distro.lsb_release_info`. - """ - return self._lsb_release_info - - def distro_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the distro release file data source of the OS - distribution. - - For details, see :func:`distro.distro_release_info`. - """ - return self._distro_release_info - - def uname_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the uname command data source of the OS distribution. - - For details, see :func:`distro.uname_info`. - """ - return self._uname_info - - def os_release_attr(self, attribute): - """ - Return a single named information item from the os-release file data - source of the OS distribution. - - For details, see :func:`distro.os_release_attr`. - """ - return self._os_release_info.get(attribute, '') - - def lsb_release_attr(self, attribute): - """ - Return a single named information item from the lsb_release command - output data source of the OS distribution. - - For details, see :func:`distro.lsb_release_attr`. - """ - return self._lsb_release_info.get(attribute, '') - - def distro_release_attr(self, attribute): - """ - Return a single named information item from the distro release file - data source of the OS distribution. - - For details, see :func:`distro.distro_release_attr`. - """ - return self._distro_release_info.get(attribute, '') - - def uname_attr(self, attribute): - """ - Return a single named information item from the uname command - output data source of the OS distribution. - - For details, see :func:`distro.uname_release_attr`. - """ - return self._uname_info.get(attribute, '') - - @cached_property - def _os_release_info(self): - """ - Get the information items from the specified os-release file. - - Returns: - A dictionary containing all information items. - """ - if os.path.isfile(self.os_release_file): - with open(self.os_release_file) as release_file: - return self._parse_os_release_content(release_file) - return {} - - @staticmethod - def _parse_os_release_content(lines): - """ - Parse the lines of an os-release file. - - Parameters: - - * lines: Iterable through the lines in the os-release file. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - 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. - # comments processed, quotes and backslash escape sequences - # processed, multi-line values assembled, trailing newlines - # stripped, etc.), so the tokens are now either: - # * variable assignments: var=value - # * commands or their arguments (not allowed in os-release) - if '=' in token: - k, v = token.split('=', 1) - props[k.lower()] = v - else: - # Ignore any tokens that are not variable assignments - pass - - if 'version_codename' in props: - # os-release added a version_codename field. Use that in - # preference to anything else Note that some distros purposefully - # do not have code names. They should be setting - # version_codename="" - props['codename'] = props['version_codename'] - 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 - codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) - if codename: - codename = codename.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): - """ - Get the information items from the lsb_release command output. - - Returns: - A dictionary containing all information items. - """ - if not self.include_lsb: - return {} - with open(os.devnull, 'w') as devnull: - try: - cmd = ('lsb_release', '-a') - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: # Command not found - return {} - content = self._to_str(stdout).splitlines() - return self._parse_lsb_release_content(content) - - @staticmethod - def _parse_lsb_release_content(lines): - """ - Parse the output of the lsb_release command. - - Parameters: - - * lines: Iterable through the lines of the lsb_release output. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - for line in lines: - kv = line.strip('\n').split(':', 1) - if len(kv) != 2: - # Ignore lines without colon. - continue - k, v = kv - props.update({k.replace(' ', '_').lower(): v.strip()}) - return props - - @cached_property - def _uname_info(self): - with open(os.devnull, 'w') as devnull: - try: - cmd = ('uname', '-rs') - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: - return {} - content = self._to_str(stdout).splitlines() - return self._parse_uname_content(content) - - @staticmethod - def _parse_uname_content(lines): - props = {} - match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) - if match: - name, version = match.groups() - - # This is to prevent the Linux kernel version from - # appearing as the 'best' version on otherwise - # identifiable distributions. - if name == 'Linux': - return {} - props['id'] = name.lower() - props['name'] = name - props['release'] = version - return props - - @staticmethod - def _to_str(text): - 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 - - @cached_property - def _distro_release_info(self): - """ - Get the information items from the specified distro release file. - - Returns: - A dictionary containing all information items. - """ - if self.distro_release_file: - # If it was specified, we use it and parse what we can, even if - # its file name or content does not match the expected pattern. - distro_info = self._parse_distro_release_file( - self.distro_release_file) - basename = os.path.basename(self.distro_release_file) - # The file name pattern for user-specified distro release files - # is somewhat more tolerant (compared to when searching for the - # file), because we want to use what was specified as best as - # possible. - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if 'name' in distro_info \ - and 'cloudlinux' in distro_info['name'].lower(): - distro_info['id'] = 'cloudlinux' - elif match: - distro_info['id'] = match.group(1) - return distro_info - else: - try: - basenames = os.listdir(_UNIXCONFDIR) - # We sort for repeatability in cases where there are multiple - # distro specific files; e.g. CentOS, Oracle, Enterprise all - # containing `redhat-release` on top of their own. - basenames.sort() - except OSError: - # This may occur when /etc is not readable but we can't be - # sure about the *-release files. Check common entries of - # /etc for information. If they turn out to not be there the - # error is handled in `_parse_distro_release_file()`. - basenames = ['SuSE-release', - 'arch-release', - 'base-release', - 'centos-release', - 'fedora-release', - 'gentoo-release', - 'mageia-release', - 'mandrake-release', - 'mandriva-release', - 'mandrivalinux-release', - 'manjaro-release', - 'oracle-release', - 'redhat-release', - 'sl-release', - 'slackware-version'] - for basename in basenames: - if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: - continue - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if match: - filepath = os.path.join(_UNIXCONFDIR, basename) - distro_info = self._parse_distro_release_file(filepath) - if 'name' in distro_info: - # The name is always present if the pattern matches - self.distro_release_file = filepath - distro_info['id'] = match.group(1) - if 'cloudlinux' in distro_info['name'].lower(): - distro_info['id'] = 'cloudlinux' - return distro_info - return {} - - def _parse_distro_release_file(self, filepath): - """ - Parse a distro release file. - - Parameters: - - * filepath: Path name of the distro release file. - - Returns: - A dictionary containing all information items. - """ - try: - with open(filepath) 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): - # Ignore not being able to read a specific, seemingly version - # related file. - # See https://github.com/nir0s/distro/issues/162 - return {} - - @staticmethod - def _parse_distro_release_content(line): - """ - Parse a line from a distro release file. - - Parameters: - * line: Line from the distro release file. Must be a unicode string - or a UTF-8 encoded byte string. - - Returns: - A dictionary containing all information items. - """ - matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( - line.strip()[::-1]) - distro_info = {} - if matches: - # regexp ensures non-None - distro_info['name'] = matches.group(3)[::-1] - if matches.group(2): - distro_info['version_id'] = matches.group(2)[::-1] - if matches.group(1): - distro_info['codename'] = matches.group(1)[::-1] - elif line: - distro_info['name'] = line.strip() - return distro_info - - -_distro = LinuxDistribution() - - -def main(): - logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) - logger.addHandler(logging.StreamHandler(sys.stdout)) - - parser = argparse.ArgumentParser(description="OS distro info tool") - parser.add_argument( - '--json', - '-j', - help="Output in machine readable format", - action="store_true") - args = parser.parse_args() - - if args.json: - logger.info(json.dumps(info(), indent=4, sort_keys=True)) - else: - logger.info('Name: %s', name(pretty=True)) - distribution_version = version(pretty=True) - logger.info('Version: %s', distribution_version) - distribution_codename = codename() - logger.info('Codename: %s', distribution_codename) - - -if __name__ == '__main__': - main() diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py b/venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py deleted file mode 100644 index d1d82f1..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index d89fd78d15332a72f416e5030f60548e8c4fd1ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 zcmaJ>OK;mo5T+iMWXf_JAm}vX_`}67Ka++TE9#0!ksD_ABxe>l(KT@!AnVHy zZ!Rw1li+C^C`2g==7g@}R~zRVyE;GLZJ66ti8j^w#wq!FO%rl~@A|-Ch_Hl%6;+K< zohCVuLaPR2^cgQ71M9EAAa{myDD9yptp3s%k4Tj1|ZuAa$+9ZzOUNa9vTFWX}t>T#ADUDX7 z5luq3P;&%BD%v>WbA5?L3r;={q8q56ovJ?38)Krj!9ug$h<{r2F~ExpK35YY{C+-6NJ;En5e)Z$mfZVk;~TWOvfmqQL%ADI6Fk z?bkv7PMGtacXtr#(JjKyw~UvA?)W}$v@C8cJw-Ge-qKl4%mhQ5sTVUZ4!!UjZssUH zjb0=#eqBE9rqs^@rCm&E*}B#MrN*zi8F_(!1W`HD-%csu&Q{ z_?DLm=pL0xiKugmGmG1;YfAr)%!$YJ;vfEYm2udD)J@hHT^Xhn4pG+Z-3Fa2;j#+n ziQ0x0kl`e5Go19yVqwqFbcO3-Gu(;nW+$?5%aBnjYT+nNnteBW)er4!-v@h)V*K5c N;gi9U{|sjb{{o!sn(zPs diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-39.pyc deleted file mode 100644 index 646aee0efeddbba541edc2b80523821ff2e041d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13770 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 diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-39.pyc deleted file mode 100644 index 154f9f8209640b99ca91368aaba97d84d6fa3f23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39724 zcmeHw3zQsJd1hC?rl+Upq4&eGJeHp$JVG&G93zBm%fd4D*x<1-gUq-!w`SC%p6b!< z8p-O6$gFL^5JD6}2q8`~A}m4V#S)URyDZ6Ob2w~Hl4S{Jk5kJMCn4GOo}5i~PhiPx z(Cqj9x8B`78aXDr$w4}E>sHmhx2o>{{m=X8YJYz@gMX*$*Hr)d7Ax~-Jc<9y62FQ{U@ zGS@%RFZmwi2POt2UqXIxVsLI~Vo1(=alT<6?yH19?5zIWuIEGy}k#vvbC)a*QQ+Dubj3uD^J#(>Bfr|pJ91} z&H3t-efNo~u1=vPwo|elx8~ODCR(agn^U#g{kF?{-jJL}tC@hqC!`U9(5BFXr&dFZLjr!e8Pap}~JmmCa=A%!H*f6Io?VaY*e}*WkE84XbN$+^F`b>u}tpu2(nUxLMt( zZo+Ykx>=3jxK-^{ufTDex~ua2lU;&_9) zR~^OiMs=Th6OK2j`_%(D-mJ#dgE)?;ht!*K+^gQA9>(z%YFs^n<1Ok@^;R55)nn>y zIPOyu>g_nbQXNx|V&G{c$=D4 zCvkkOs;fC1Z&!|L;Q0M&UY)}64y9ES$JZ%WE#P=SomOXXe7$;7oyGB>YN;Q<@eOKG zox|~vdZ+q99Pd<1>Yw3wmwHM)jpNW6TAqk6yk zVI1#OA5cGn<56{9{V0z2sSm0j!|_e(L+ZzIy#GC!d}iVSFzH9Uegai6U2A~_A!9Pb z<0op(;i-DH*&KGOCvD`b+8%C94+|^QS~X{8nAP@`%ftA$cerWSr}s@QXbm=yw&eQo z@V$+?LK`P+QxmzWJIuCC(fZlp<2DTeZw$?&H=6ti{ZvwU|W;jzyZA$so-yW@ZaG7Uf!x;y{TYPiL3=E@U8LGoV9u?8rz(Z$_hD(Y&ZvoUiJpttZNMbE-OTAE{SoCi+1W_ef(w zQ`SIOsj6Fjn4RPmq_4c9DeP6^#K6r3$U429&6g%2IBV|Y`LpPGXA*Mr*i3cKo)j5; z?6mEiK31%GUel&+1{k!_D|> z4k5{8H(JG9(JERcIkvVYfVwaEj45h>;2-lO5hZK$AtY{QCiAo*O=dZJA*1gHL2|Qs zeVbcQ)(((^XUj#Ey#Vq0T=r2AI*P42 z!)I)?cG@1U8piQaJ50c8+g;F7;%v>X1Nb3#ojC!;IXquoXo6*94_bgCtV=n^e$q{~ zi0{x;vrU)W$Cu_mulx|vcaPQ$t=X#=vtHhX4)pTG+}KD-7je~Bj&EMD7i_%?7X(Z| zA?r2u1{TT9H|D(_Bz1e*y=ducS?q=|xshcEN~q?^$=BknSwWKNDd$Qc{Vo8Y1L>vk z6tracuNS!z{_e(K^Q(AeH**f0crLeS>CLW%eD)l8@*FubyPUg_IagRLEM`w<^u3D( zH@{%vm|w=V3zkJ#_+?J*af>Rq+_RX!U@hjJ&YmkS7TpqRJ?oYhi#sysdQi4^x!?jG zJH#YgEY>X5^IVSYoVT1^3gz;dT;`;upHsajt>!13ES^wQ<&$~+CDpff3(nV6C9MB- z)qm1DZ#56H1vL;}|CSnzT^|arpSLvhf9%f2*qyyxs3# zs#S6EPET9sdfu9G4&*a#|9R`|$1JdpeAkxknR6w#g6}RV>kXN^z<@a0inDEp zhaY*xkt0VA4>z>HeJZdAhmTjGT!v8|r9zM^d#W~9t+O<&zG`p^lTO=BXtFAwuy6RN zI}FRTF|2A3#8BkJdtSF^xHb(AlTs1W9GxC^8g6jiC`A!)!XNuYI;fj}U=R6d&mD#j z#jbq&o`~D_JbrG3Dl*Vy;oH7Qx8g;LMlYjp!l8A2tzNfhs`XKt(DT%2qtgvN>MYFJ zx;8Z`_U~D*m%VUj^Qhxq%;^!-(|g%QiF|w-OkT@8pUKo#{}_$0t`23sNtO3kzxi)8 z8R|uH)Qba5u3_?nOnw$g?aSXm@>fVku6vORv36;dtuVQ?YB7i8(rT7DB$rlm%ptk7 znr9BlrPTs+NG`1wnL~1EwTC$*msU&6A-S~L%N&wRt7YbpTw3j84#}m}3Uf#RX8@+gf;-x@=ir{y8;+)0 z8X45=2|dV!O4G};YqgN1XsGMuKm{*93u5R^EcXf~A_se?b)yCKV7p!p{*70Dv|3*< z64om$I5W08(ksGoqEKtzYd`7rKw-c;QC>k;RqaVbNND@1lb$uDU(JROA@Qu!X>qz~ zs^K(&g0Y3Uwse$d%BqG;1Wk}2jb|9>{0FIz)a*{bA*MA}xYtW~^J$!)cYtJ!Sc zGUw&Ob}PSHva+k?Z2nR?o4r)d<-b$TWxrF-5By!ezmi3*@09Y{T*VrI%)Sw=qULHT zTgkSrO{(nxop(I=jqWl|Pw<^r@%#hygHP2y?6qAw@}*2d(tjs4P~jya)p`) z5))F=nfBYyEkFzC!*2ibKv3cW^}_!1)~Unk@4&T6>w1(OG-VN9D836lc)`NE6kTWw zUy^T!B;No@zGNi1%A70uQo6`KJ)hMFp|#j2{UWnJo%o7@@GGJ+Sv|0rMZJN={9+IK zX(M$@^MCkf=%wfk8qAdRY1O$8oPF*l(Ym>ycY|_^IrDXku(8e8y%v3z>gl2I9oKw{ zyz__fgw1LLzLsCSv5&G5=#b866=1; z*ot+dm{BX%ffehzBQLJvA7TsElb-e1xRK`D>?h~pdDto?z(w}xSAlW$8<4biJFvBt zFWuWk)r$4{)|RNLSXq(#BG$dZhm+wFuS|!+51ni=9>F0#kvc~NoTmKHcQO(ACz9|1 zo`w=mkMflEmsb(pgV+m09uu2SRGX70?X%5E3f4*J&FR{c69bT|a131k+{@K%$1Ab zc#5e#kS$ufP`-%gw65wXMa?@V%wU?t^nk<+-iQntWzm8t$^I~n#vF{OeCwzfQNHKw zhp>#F?%1%CU_}h?F@1N`2|HNym3W(bBAaJ?B&#Rz82xr6V%z&+S$v;rsEc>66Hpe-#;i`8kW<4$%X%R(~FO2)^a43*(&m z1JX0Nn^(CV8K{bRT!k5bF6+WIfLP4AMIMpnp0;4FpID?TkVOCvA-H#;jtF+R7%CrY z3!)Bf@o8vF{|w%vwA_nlKrpCYRrZCwrTTF9^NG8a@UGNZgoqX+7{2IapDKWM{jFb) z(+-AWb$G^hXz;;fbW|NiFv$nY#dVFB2^Y0G(~Rs`SRl>Ns-*WQ&L>^VJ+uk;AdWIc z9}>25)xC*st{jLAV52$>-wO{F2ErqoC~iApd-B}4Cn+YUm#5J3No6D8^VNe9i;adHtBY$HF{5-!}401l?6EPOo+(FL?F}^3h&S zSI-z>n!@%Fzy9u680;IU+@$T8DHOrj8^PdoYKO9$EeeQ|FA9QV#cJ(NB0t?=0`WPt z8@jw-!U+*iGs&PH7~F*`3`ymjPZICAvJY3_0^`buaV3W<3ReotMYkt#U_)cXTm_n8 zUKPz%=ZQtjEiGj9yed5m?s0p;S46le3v&jB7vG}n0_hjB+n_%Enm3y3st;xd-pQ|l z)=?u?PL+Z3%9tL*_viG z&3%$7gVe#FZy7_%m$N0v_ENrL4Xu`o6@Z}#z0um1gaCO`-Yr3Uw4I@_6luq};bLYv z!*C*cmhrBvvK~gzW^8;UCn8zi$b@KKiPGu!ox`=O`M#8(83AeQ>g0Q*Ixq1ye{UqZ z1t9SbY9~rfsa_vVVR;`-eoK^V7yHIUq^*r33_3=o z#$owNfc_A^!`lwc<06LJ4i)KEF~#phK~Zu>cy)zJ#cxZna+n>z2Q@R@Ds(Y&G2$`?O@cL^zNfq(7P$An`$Z1!Ib|!_!FFy(c(CF zsqME?3-}0^k&op(#y!#q&&ky!!uO!9@Vc+lWt0ROJwP-pfRWy@%SgrXk)8;^29hb5 z5}_A;kAW&REz<@t!j7mKU@x6{f}KgY3slqMj3Fp0(OpT9CYxyM#n5l4pz(MwDhs_B zSy6xK_hn>7d5{DJ*g%gO$+2i5jGhY^)cLPEf z*REKv)Kzr&k&%LlAU}ZTrLUep&AcCK_ zlSLQi58D{r)Dqs0EI&fZ+dz-PhC32nmq3IVgY+rHTx38&uozR$;w&&o;%zwIm|1Av z-I(K~5L4_2a6JWU?cmxOV)-C4k=Uh~SVYhuYh@8q#hD*Y*h<0d=POn@yjnr|R!Stt zE!yr_|6M#57zsTFhP3p47ok+zPQY;%Bck*bIAkV+*y1zLI(rOPdX`Hlo3_q+QNHLn z;EFQ5gbydmm10($scpiak!@#c?@!d~Q$RL`)cVbk8t!G5`$DW&_&hZLqz;bh`;7azuD_hsDS(NsRVVl?BZN^9XBWUU* z%=9yS-IP)nh>1-o!MJy^NGD`HjT;{&vi2imkX2#;AHk%+^ow%96|sb{KhXs&U6YiY zZ4A){sL<58fv$@4PQauHm@q<5K=d*^!&y$D zP-NgE?;x75=pdXxIf|ydbJ!QBA5GMR3mewN_#wAV5LxMxgD-%4;>{HO=<80qx!k#fWw-k@u9>R?r$ zy=!3_^M5e!PFyAvI*Mdi7j8)MLKi=+ zd#^FD6z?_R2=r2(Jq8qJVH)5*g=_(%3W3WD0W88daCtM!yBMO{~aM1$RXH>l3J*q0*i{V* z3=DlCP75)De3r+PS;Vx&B1Lp7yNLKKbQQdQJq}9>LWAX?u_!v&nLLN>HCaO33(;DL zjwO^`>ROhNEIErPOB?O8DErxNWtYo-l!bz*)6QX7v>M#t?1$G|a z50-Oe?d6sS7X$JRv8BL2d;*G|Zl0zY%_~EUIJ`8E=#=NdED!P|7ZU_^K8~p(!Und;yKqiC15f1y( zcF9ARbjurYGz53D1dSwIwgzxQv?hQ<$0r2NcSADi_u&a~2_)U?ZS{TK6sWs%(vxVW zql!L*8whN65j&~jk8VzX_dfY<${qc~?3>P#CfPwD@m@j)eGm^RfX*?w91}Iyr$mj3 ziloSr=$`M%8Z(j<${PJ6B%_fb`aJS4lLQgS|0vr_NsAxDwINdU?z zg6{`uytX0p7MPbD8@Uf9JCBXftIvzdj_&saV;$0dQe|WGPogC;gXbJOi9#K|?zP6! zr1>+R;4M+$JEAC13gewP%i9?%E^~*)m^7B8Nck3@+{qd`iyOC)Mq7~ytsz)K@Dc(w zKa%9V=vi%%v+hLrekCCQJYohtir02w1mC_}{F zOO5Jue3(4wAF6ZoPv9Nn0|J-r5XH{8q7L~M~n=xV6hM$^kk;iSm#PS>aKQ1n)kuIWhWF|ddUVFfWi ziI^^8rgt#B%0X9&txCK!79DJlt(HT5FVS(vR!sz>5{n3lCo$Y6P*UcoVI3KaNQu%| z)x(X2<8?b`8W@2p7J(3`6PuBcze=)f56OZ^D+sd_F{9AC*uS)ch;@+Z8fE%6wDr3C7+pKczNJ8$ztaO!Q~eMB?05t1F4(PsW3_nJ>_tL|?(<;v|w`xXU?(&-o@k7j;I;9&_GP zrUGY~(4;sYmRpbEf6zDlKbNQ#HzkZaur<7&06;MA(aB)wU@NR_^M_~+^*C4?&_6a{ zn4-ED6V34+kIXa?&ECyjAhDK9&`NefY$}jh zgX8}5XiAf2mvIz6fg%IYo3TmVoynS*X<;0ObxD8-kKM_OMLg{ipqtz9RiCUB-kmw$ zI1?m4IX`mw!J}B?l9mu8Kb?t)*RRBx2+03J_%^Ivjy+|4tPtoVF_uWh4q`+9 zbKF?d&kztqe#ScB@JTdz1L1HhGLfILZb;m^E^bfYwL2`*#;z!a+ry3~IYYNw$$SIc zD?&pDIyX5#15=&R$whyD#-sQ?GeE(a8i}bHDM@R_Nn`QDxa5L48dI*KQl*FOVMqH*`G-k%a+;+9Emq@ivAHgr0}-e`NxSOhplm%`oj{^zO4L@;1Wr05V1vY((4u3uyhY zPHci(ENI93!A1mSuDG+(>q@&#)=Pl5h-a4YcQ^i;-$;NLTNB8(G5`rjiy83dgg7qM z-{->@zyxV!YZ!>&qAVjfE98n8!~xj1W&FvA*>hRv+h~dFN@ls~f%D(d2DcJeL>n}q za?bO(&mj8;aD`TN&iNv)FxHCsN3-SSK7iZIAg_eBed_6|KlZ$5QF}l(e8D{0Sbc02 z(5-$rd6MsYZwT?*67`2-^$GEuM1WIo5^o7h?k!EbAXWx5zy{qRtkg|h#X8&I92N?f z`XA0be(+fKTpn9A1b1XsG9t}zO405IaXspr4Z*un%$)iP{ywIcUgD|vp(!(i&ZsaE=1+Z!`CninJo$^rVNt%BTN?6(aA9kcT9~ib zrZC4U;?I$d5r=s@QYejon!CKmg10%j8lg5?_UBy$yL>9@C zNk@v&GRKLbx?Meug|}RMEJ}Q$mupkUxf!B<0;N4`GCkwtmvH$E`Su;ikZ-x|2pt~s zZUwWyu(wy9`+Eg^Y(laU545nU2xgJ_d07%)&hE7G*JV~VP|t<(Wwv6qWFI$q z8*XE_FYM&-(-SWWN((l7Z|MI3SC7CRW2mzGrQ!dQlK!FE5Zn0K{+a>uO`ZsqjIzT+yFsU@YgRh z^#_b%LV0-;SuZds%4vI|jiK&s1S%zLSFr3u`WS58fwrIIst= zAZFp`kpX@}4ixX30#nREhXGisj{Pt(X!LQu1Whk;9yu$TLWpfe0zQJUmEa2aqgVK& zZ1}?&1EzbiYK9yb)dU}gHK}BB4$aY28~#F0EUDt2QobSBFaAXg)B;H2Ikw8Z12o|* zq%9hQbtS`tqk>N0SL`6+7B)P7F*YdaZBGijv~4rVmq;Nc1rjlOIzn_kfupuC!VN0||lW~P4%G-G1pEe#o#l8>878|k`L-$JXzztjKc8G^$!{eHB zRyxi`{WaXk=3hn%wn?Ej3Wkmz_DxT4wCGfFv{~u&*Wg~RWg|z!a~F>On$P9XG`=zT zyX0}-fivsd#1V{hYLdqTjU&2`afe^W6Qi059#7U(6<<1Ft(@Bj>G1VL&HmUk;p$=P z@;=-zC)@C)L%%zqu+h7ly$jnLg;HV=Qew#83}Xp|!BSvhY@ueTqV#7-Owon=7qHu` zzoS{Wal=}A%LF7+z?x-yCz(imVz`UQaT*3*O>9gnm|bF(t}n<|$J^r=&$5!3i6VGJ zC#^&J$T(vs5%gKKw}k+HH8Mt71tKU?PLUXja#T!Z?9I_iO}0)7q=edSgL1e)=3{s^ zh#e}Y6qM;bB$s8*`#?T~S~SJ-&N~3A9)QZl74Bt)m_5`|e3y*$np`tCJ}O%br?v1+ zqV>DNPKsN*mi&d7;w=b*u8$!Id-0E^Jp$1-f|}OeSkVY<9V@i2+SC!BBdj0W9c?R*s?b!O^?({pKjW)J8}8yapDRoZ{)hnSuEdX zu!MUZ!`>hX^B^Gyfg`ISZf~U5XqMMp-hlY5KO0oW`BgR|;kce+M+ptDixDQGA$|{{ zrWVACg#%|uI1($FCSkHXw)ctxkYWx9*~D<{N-<$;A#^9&k>q!gcEiX7oGMh4FvQwa z>$YsSJJl#L4Ap22a=Wf&1QJ#5Lb%Kk+jKxzfD!%8Hl%csltfNq-<;(&f)%t&Xv++F zQ9^n>{>B5+so^YdT1j4yztdmZqB_JD1lH0?o%-ipC^F9ek>MEZ7{rBsmDPNKeUx4@ z-nRciq9f2sv`^nsOwD3*SAVxYF_y6gXPGb-xg}78oPyM$A^i|0ri2oR5(?#HB$J)u z{4Yv0lw|DmbE=3KZ3!{Lo4FNurxq7;r!76Lde33t;new4(~D5MXrFP^JT^<^?o)lw zv2{L0CRNH)-tRvJ`*I+9co_FevQ4U=pY5G32iKYB8!^^1Tf$jIHc&k*@79lZ+t>Zw zq-55-9b%QY;t#7#{g%1Y2ewi8HZ^9kVx*L1KTdrq~^LW;?-p1p+ zXFbHD?OFF6@p=w7rnuX6eBThSG>_SXwW*`ZD>ctz+xa=hPW{_F`HxJ#%tWNh&d{<@n1^pSN3rd-@*fq8otphhH?SJT1a|ibH|6kW+K9II zDt=w#;qGM7Jbo?0_9_i*40lgme%=K?x8Pvk5BZS;Z%EnG)rGpt@S?f0K^CMxjBmh} zB&H#eMWQoC`3mGAezPFSAx+Q^L$(pH(GXq3uYULHA)1gJ!6Vqk;L4k z(8n_NDU>Z>Rt9{d)jv;6L-4l5F_~IXl2T@(>O@Xc3gb6ELNsH6b|m+8^7E;~oE2`O@TqZUdBbQ3DnY60n z3xc|m>yPnGtzbT=-wm>5FpYu)v*{O5v^$xEts+`=Vz56!17Ge&rj029Ds0vE!v}4+ z=}s;DZeTmL_M(R|iI4s4t2{Azol8FLl(~FLHE)yj^JCXpM7l}P=In$Bm4zC8`Mr33EdF>86V-IL{v_&oDa=3 zv(AkYjN_8e`WPyu$0cVm;azI_JA$E{K{q8Bu^OP;)Qpc*cETzpSkPiVfl6sLFdLWf zoko}JMXr?_9lf>_NEbNE2=`z#w60D;ha=sB(I$WCZJp?#yfV`}BH`8v4S$MqSujWQ z7G&aRh~prhH@mQa@?GUyh{5jEe;=L|r+z9VN$F7lMUJ72*_>G%|6rmp=daE}O373p z+~=7u>8M>y=rO8?Eqz0&(>3%+qkbjYz0Y?DlUr4SE)rEaqW=R*x3+Uf{891#Lh&Kq z?sy_VRYqBFs~J@E-QjRjicv|zsu7=u{;G+|hy&S)bbpA3caU_$$fPX?{?0@q(wMRu z;vR2zI;Bl{q0?s38w?qbqvy>gv7BEV?%Sv6U?D6a^uc|e`Sc;LmK;ta=VX_6C+cHz ziJ_AM2cdph>XVyF4uV0#qhCza=nHFH?ui@4C``1eDu|z9d+#N5o{1{FB5=clSVEHg z?K_nkAQ*l=$!5e2e1f?@Ly}}w;vgM)ONw+v6-*2x!bevr{tdLYm&A{T7P6reC&Z7P zMRMH0LV|XwmFArR+8rABq2YEGzLn&Wz1y(Qu*}@UnPF3qu}9`F(i=F@wH!tacrV7z zJzw40kx90I~ya@z6D%k}_~O$kpSV0BkS?SARQE69PU4G(`FgP&>YNr}x=t z-kwhk2J8ZH{{)G=#AKF9DpWvtv^M$TJuYGlkUA`36M!f-#c6ro7O^=xOOZ%`T*dMt zMgE+*t{CFo!^F^jWQ+g_7B6(S2+ZoXjcvbFk%n#pIWRY(nD4!vkh9gynUz=pXV@9B z5&Re&Dn^E}K1C=O-yV_TDEukLQ0#YT&G{_~Aw-D3h#&Vtd=*jH-H5`* zOcIF;e+WMt$++-mv7|Ape+TzD+<_lnMx6ODS}4l|B^V26qpwRF&--nB`_%IixrLIN z6?}%f$47fbMemQFa+ZB>2h6^=i7#f{SKfiU-Y%hYeMux*EC@IG6cLrBzlcKPBZU!! zW*0o`5gw0w)?GZ-J?nlRYo2vfe*xt#;-u+W4+rQ&NQ@HRFb^^ zumqM9_szD{;RV|g+hYkp1xV)J~W4o0MWu?cqM+yP-ew8=AHV3RrW{wm&7s|5SS zUasQ(6yDg3%?n;TxkCYNI0m8rE0RD$#)tmOxbE#qC@zDGql!OPGF`K^@rA@+if|^P zQGg|)F@jwuE9;wh$a#{VU`Sh8h{(j$tg*OY8mCsu#0lCC-0qb9HXbPS@k8pq_4NWN z3U#<&L;?oFgbuK>FpZcVJy&AipSVZyS&%(M=poVDH*-qN+D(7vrdVBpGQ@q9imTy* zC{xZX`MpH_zF;QhW$WLZsE56nJ1Aj_#e#~@NRy$c-$zfR=31`ohWY@JCHF@qfN)T zi$Q8+P1?STOnsJYrS{OcJcD$HAk9pWE$OC56B`M)D~s-a5H*4oEK#^H3^^(4#vavY zAl+f4hK>LyKmGyAMfJnL(q-$@c1w-)B;YoS4^EqHf<7_rmw5O8Ac>)C{9>-CJ!D|%osm2*0U7!dDAkeG zzk?fp^j#)qn@H+T%=FKmq-==4^fk@_Fptsq@j=(T^LxG+aLj$|EPv}mM1 z;I&UNiCZUWf^D|R_mHusM{yZs=sXp7C-+b!#CMsPZRTTlVtyDx40cc2 zMtkRFY&5P?;N&mYx0zDE2qq(o82Ay(t&@$%QF+>0re6H_!030Fka=%x%ulTM*r2W- zDvHhcT2GLAZ5yfplD&_VxgLEIg>{lfbQHo_+f+{TSLbOKIXp;a=S`%@AO`YYbW*1& z4Y#24xypx=z~YNRI+evdd<>uFOjm}>3=ZLOvA|a(gG7mmAbKN7a92eLwhH{XNd-!{st#AGAVhPnB-auth$hhwH02$8a_XUZE?kn{Kym| zsRvIzbt;b^hC-ODdEb4Rr?^DHc()mDJ|bSjY5y7)4DcGy4rHVr+n3dWr!a#F;jCb_ z2Y&t&>ppUeIRwM<`VZWm#oW^thL3ih<7jzlIRgZnA4lvn=EkW{U;;m4?pV3YH6oV& zZ(+H9d7@tqSLrWT{GUWzu^ulHNS9odHR!VLeC#l%1%!h@C%-w@KfVQyudDNDLS# z{Tqhz8|tyC`6Cv_A;yl3jCrNWNe6TICnvq~Oipr{y?>`?auV^f$w@uT zccZe@4={NLlW3)&eC`~tEih>^d6G$s$s!Yn$>f+$(Bpt%M?e}xGr8Jj7{f5O}gOgMi?{~?oaF!^&Pf5GINOjelu9TNt; zG{Xs+E~Wk!bF@x%(oWoY74BV)_P3+P&M?2JG@$v0VYHlR>jt(>4R*-r9$wBh z&o*_5x!$RU({!tj+cavbk7ZGrAu{AZ^osG z!lbJ)YPN-C-pVq0Rhz9-|UeTCCd+`uyZ@JyR)=VwIWRl0M%{|^0o@iU1#fc_jyIt`rob_gb zS#h;p^J<)Z$&!mUQ_lW6XY^;rCd#opED=|TV#oFNq&L}acn!`}L*ECj5>K_K1y;0Y zyjjkY)!u@kzA&K95f$8DGu;0=;(lUXxkro1>bKlG)4QbRW$loAXVro_t0oUc_8(B3 zRUxfb+Ti9|oK!yhZS;Lf*Q!_)8`yW#a*p4YhP=c`pK=lGDJaRSoz{az@TR zVBUH8f}F$mf;=PV@x3U|$_0F1mX%wqdG0CcxM>wL!Dg1m-CX%myOZj?aAdR>Wl@?G zv)v>LQ>pwo%9Re{tjUY|%~W<{b$h>~fYojWolcarnxdG<)&1PhK`*S&@4U0#tQJ#J zZ3W#p_f@WyDrRr0d^?plqO23-;kMGnOqAW~YMr)%Tzwuyx>(G{(c9^D?A}SEBroRM zX5Wv4Fi-XV;6w8}By{G-X`=km>a6E1Z**_Gcjd}*Z=yTwetbKmLy!L~ARnM*mjD#= zxMZG?+_Pj|TGD>NJzG{}6>6(M>5iNLr7CMsU_+DJ1|2x%jVR3Bdr`jazU^im6-Ghq zc68cNI*(L#wO)7e`%U6TNt8!H4%J?Ach!F8=G#H;23omsl;znaH&c1$rrOQBomgdN zButY%@KMsuQ^ThXg+>@IIb^9DgrUkZ7{LvaeHUtQ(=BjTE{xXBu&F^(9krq)hz$?g z?s6RMV(R9Og78}9U7e6X%59Tzh}~WgcU38TTe{cWljeK#cW*9lrRnk|cX>0=%gw9! z^p+2rrI_-!X7DTb+BF*QEti}=bO%mRvUl%oN8z>`28p|====~tr`^`J5oI_v$a5WS z!bevO?#9WC1fXt4v)=Qr3_A8m*O>%h)g-^zI|ax1sD>_eef`xZv$ z4k~@|sM4?W?Je<`b9VQQyN;n)BZ`w(AJzJ-FCGida;MJ@IiNV?yCRDzR3+;(e?qcb z>`cX5Ma3A?Yxp#KErB{zR@h0}Uy#=402sGkuQzRNq zTn{N741d(8W~8E6hZ{knLot+x7iT|8yNNu>5`r4JoRK3`(tC;0CuOV|8GZi~@E*#y zc#;`32Kjuy$<6X6oUBIPLZ*ke)P289jOaIf|86&k2P5Dv)6n;gk@RcWL%&I2P1+I()1*tJNqnm&X)>>dggOb_ zkqtS8?}VI25}nbngH7+lFLlsCzI!IcTyi&~L{c(}kQvJ?RVEJPs?_~@sNt`lu^h>1 zEJvlM(xM9U~GGhXM8=q;Tt8Uzb*eU5(AAK7gX zacqYlj`Si-meWQM$U{+fVtbQF@mTTwuP``_s^=TYO#MHF&`Y$hagQsfNPxgY3iti5 z#{{@=x&j6>pGk(tlrXf*z&Z2^?RknrQ2gVykOv3~^u~5ye%|g!({Xj_CNcgAfwu@y zLKsUPWLN!D0&f#|hrp3Xnx0EE3g};>Wzzu2CET%{ic@tgWE2{EM%kl?pjF7RxMC%) z*YvX-Q7gp~;nr^D7;f+K0bViV)zNr~*LLAEO=tZnX;PD4J!OAqEc)>u=#}XAg#HuP ziZJ#ptW-<9Xl)tf!PvoEVlWA?gEqM58hrXkK}}5mK+TLFI~Q$BDZ)fLDN=Ge+3+-r zs5<7^IdfV$IKd+D1KuaOYwHmrr<7a2i`5Y^(?3H`{~Q2!!F%)(nl9hM3AY37;}vjH z>;^_VXeO;Qz5tPJp^5s8uw(>k*#bbs{=mOs-|#KGgr#`k48*e5k1eAo7u^>x)3Sd7 z`7Z9#5zTpw<}IIg0CD>;Mq zT}h)|K(8L{h_SyNjbYqgW&OcAN`NI^Wp^MIRf@(k1?x@vuV?;NS%_rh8e_P=0KBjR z-O7sU?mhZ8C-e&->IwmhvBIV*Nu$;MsW5XHP^?8wiNP))Y?H1FE=2VOmU;VaV`~R2R#xLQM2-0V%CS+iB|P;8cA1$FUG%iZvQ>GVs$UWlZf?EQWf_TW_ z3M+67axPBJ1&0%>j3C{EbU?#ZLspsK#tT_)t>=xy7VU8>Y|>* z`%s(wM{3Zd2h<|)yv(>_F%zb7jN%XFXtok;hMF$yV)9e-Ux3mbC~GbjdD2F1Wi z7TwpB05oNQ;_Ur)ykd&{m9<#4Rg&MPg1=JM{gY!fJ%Rb&!qNP2Y|v|rV+AhKAdV3W zwnB3Agn!=zQZcc1KU5u(Thkq5ssi&^HTR22#wN)bH!?~o6=<}06amg^>8S71eUOoN p%p13-+65Jiu=zZKfZTu4awY|gRu^Qr2EMj6>&{-ptv2CY_#ZLgO633m diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-39.pyc deleted file mode 100644 index 48a2a79e4e3a3039af6a570e541b631dd929c1db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66339 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 O{I(0uH@ofg;r{@)x0?9? diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-39.pyc deleted file mode 100644 index 48c33d888912dafef4186cd9875f0ab3776314d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91010 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 P-TxE0^$4@N)tmbT{WrHm diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-39.pyc deleted file mode 100644 index ac650889a5c07cb75d881dd7a17e196d1293a6d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10812 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 Lc~^T^`@#PJpqS{i diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py deleted file mode 100644 index 3ff803c..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py deleted file mode 100644 index e0bb376..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py deleted file mode 100644 index 5f00253..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py deleted file mode 100644 index 07bad5d..0000000 --- a/venv/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/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index c9de591af837f2e18cf5ceb86f1c6769b4955866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmYjMJx>EM3{7&^4^>n!urn74HWq{s3o8pur$|=XgsUOBgd}%Te-eKwD^vdh6HX^A z`Pt8YmY&smyWvOw(gnlR&aOhuD z$1Hp045XlTMowm!q{XdFAKVqN& diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-39.pyc deleted file mode 100644 index 0849fcc261708345d4711fe8ee0a100533bcb72d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1595 zcmZ`(O>Y}F5FK(?(n|h_Yr9EZB(9M|Q5`Dy(o0|%{YY9AMSZb>wu=pj)sm7I+10K| z%8iBfrFM~=`wQ%2{t~Y}B>qE@H;6!N&gN2{-nX; z7vbPbZ02V)5+p02WHBpw%*!AS7|hmimKR~!idzhRg2{FWs(tn~1NwPiXYTt2CVUsZ z0~yHh5@e`a7eO4!)*TmEN)FH3u1AI2_XmZ<^V~fd$JN zxZqd(8qWDkOv)7WwhbD7!4ARWVUk})4Sx(Y(+>_Zwy+^>-omzl&3ugJ7#euGe$E

Q@vtu=BkXxdmN|rfRE6*9F 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¹+_{0Q#ZWvRdW#-eK?(EkBlFh*cC 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 P##gmR+nd@OVu<^{$i=pQ diff --git a/venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc deleted file mode 100644 index 0d52beb0ec8448a844a4e7be475a20527d4062cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26944 zcmc(H33wdGb>?)>iNOGbz)Lqr2PJ|cM-(aQBq^REX^9X`Qdg7mXfV|P2N=u@s|O@8 z1}s~UE#dBSFc{ZdR5hxfq{Gizccl9mF8O$iNB^N{yPBAZam&SD-sEna1zQ= zcHNq`9or(DtS6nMyi-m}-f1T-?~Id?chcN8v)vpTAB~-y(w~%y-ok8~ox44j4u&l)6 ziN>|5gnQ!!Yc^#i_z%-PnP}v<&^N$bP8QXmTJc=Mxk(MFEAYMXblFsW+&yKu@cR8WX6hlyU_cR}<>AKs7a~rUa_1Y1I&@ zsaoocKw5dKEzpcQtIi2@UY%F70(Dd;fZnLy7(jDsPR&c~o76MXf;X$T$opBfAnzyD zb3tw2s@^6c&#M>Iw@8|ARo|w*U7)wCcc^y?bV0pKy<4E~Q14OSDbS1Rz3P1eyLm&LsQMxG!vg(?`q7|_|K#4L zer#<*{kVkx1bqJ)zMmA|$Kd;^wF%=&$WN=EQ9mot kRzaY>rs{f*XX(2hW*D0Zw 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 HDf|Bc(n&wq diff --git a/venv/Lib/site-packages/pip/_vendor/appdirs.py b/venv/Lib/site-packages/pip/_vendor/appdirs.py deleted file mode 100644 index 33a3b77..0000000 --- a/venv/Lib/site-packages/pip/_vendor/appdirs.py +++ /dev/null @@ -1,633 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (c) 2005-2010 ActiveState Software Inc. -# Copyright (c) 2013 Eddy PetriÈ™or - -"""Utilities for determining application-specific dirs. - -See for details and usage. -""" -# Dev Notes: -# - MSDN on where to store app data files: -# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 -# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html -# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html - -__version__ = "1.4.4" -__version_info__ = tuple(int(segment) for segment in __version__.split(".")) - - -import sys -import os - -PY3 = sys.version_info[0] == 3 - -if PY3: - unicode = str - -if sys.platform.startswith('java'): - import platform - os_name = platform.java_ver()[3][0] - if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. - system = 'win32' - elif os_name.startswith('Mac'): # "Mac OS X", etc. - system = 'darwin' - else: # "Linux", "SunOS", "FreeBSD", etc. - # Setting this to "linux2" is not ideal, but only Windows or Mac - # are actually checked for and the rest of the module expects - # *sys.platform* style strings. - system = 'linux2' -elif sys.platform == 'cli' and os.name == 'nt': - # Detect Windows in IronPython to match pip._internal.utils.compat.WINDOWS - # Discussion: - system = 'win32' -else: - system = sys.platform - - - -def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be ".". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - - for a discussion of issues. - - Typical user data directories are: - Mac OS X: ~/Library/Application Support/ # or ~/.config/, if the other does not exist - Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\\Application Data\\ - Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\ - Win 7 (not roaming): C:\Users\\AppData\Local\\ - Win 7 (roaming): C:\Users\\AppData\Roaming\\ - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/". - """ - if system == "win32": - if appauthor is None: - appauthor = appname - const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" - path = os.path.normpath(_get_win_folder(const)) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('~/Library/Application Support/') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be ".". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of data dirs should be - returned. By default, the first item from XDG_DATA_DIRS is - returned, or '/usr/local/share/', - if XDG_DATA_DIRS is not set - - Typical site data directories are: - Mac OS X: /Library/Application Support/ - Unix: /usr/local/share/ or /usr/share/ - Win XP: C:\Documents and Settings\All Users\Application Data\\ - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7. - - For Unix, this is using the $XDG_DATA_DIRS[0] default. - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('/Library/Application Support') - if appname: - path = os.path.join(path, appname) - else: - # XDG default for $XDG_DATA_DIRS - # only first, if multipath is False - path = os.getenv('XDG_DATA_DIRS', - os.pathsep.join(['/usr/local/share', '/usr/share'])) - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.path.join(x, appname) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - if appname and version: - path = os.path.join(path, version) - return path - - -def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific config dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be ".". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - - for a discussion of issues. - - Typical user config directories are: - Mac OS X: same as user_data_dir - Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by default "~/.config/". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -# for the discussion regarding site_config_dir locations -# see -def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be ".". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of config dirs should be - returned. By default, the first item from XDG_CONFIG_DIRS is - returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set - - Typical site config directories are: - Mac OS X: same as site_data_dir - Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in - $XDG_CONFIG_DIRS - Win *: same as site_data_dir - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - - For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system in ["win32", "darwin"]: - path = site_data_dir(appname, appauthor) - if appname and version: - path = os.path.join(path, version) - else: - # XDG default for $XDG_CONFIG_DIRS (missing or empty) - # see - # only first, if multipath is False - path = os.getenv('XDG_CONFIG_DIRS') or '/etc/xdg' - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep) if x] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.path.join(x, appname) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - -def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be ".". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Cache" to the base app data dir for Windows. See - discussion below. - - Typical user cache directories are: - Mac OS X: ~/Library/Caches/ - Unix: ~/.cache/ (XDG default) - Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache - Vista: C:\Users\\AppData\Local\\\Cache - - On Windows the only suggestion in the MSDN docs is that local settings go in - the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming - app data dir (the default returned by `user_data_dir` above). Apps typically - put cache data somewhere *under* the given dir here. Some examples: - ...\Mozilla\Firefox\Profiles\\Cache - ...\Acme\SuperApp\Cache\1.0 - OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. - This can be disabled with the `opinion=False` option. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) - # When using Python 2, return paths as bytes on Windows like we do on - # other operating systems. See helper function docs for more details. - if not PY3 and isinstance(path, unicode): - path = _win_path_to_bytes(path) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - if opinion: - path = os.path.join(path, "Cache") - elif system == 'darwin': - path = os.path.expanduser('~/Library/Caches') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific state dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be ".". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - - for a discussion of issues. - - Typical user state directories are: - Mac OS X: same as user_data_dir - Unix: ~/.local/state/ # or in $XDG_STATE_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow this Debian proposal - to extend the XDG spec and support $XDG_STATE_HOME. - - That means, by default "~/.local/state/". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific log dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be ".". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Logs" to the base app data dir for Windows, and "log" to the - base cache dir for Unix. See discussion below. - - Typical user log directories are: - Mac OS X: ~/Library/Logs/ - Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined - Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs - Vista: C:\Users\\AppData\Local\\\Logs - - On Windows the only suggestion in the MSDN docs is that local settings - go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in - examples of what some windows apps use for a logs dir.) - - OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` - value for Windows and appends "log" to the user cache dir for Unix. - This can be disabled with the `opinion=False` option. - """ - if system == "darwin": - path = os.path.join( - os.path.expanduser('~/Library/Logs'), - appname) - elif system == "win32": - path = user_data_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "Logs") - else: - path = user_cache_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "log") - if appname and version: - path = os.path.join(path, version) - return path - - -class AppDirs(object): - """Convenience wrapper for getting application dirs.""" - def __init__(self, appname=None, appauthor=None, version=None, - roaming=False, multipath=False): - self.appname = appname - self.appauthor = appauthor - self.version = version - self.roaming = roaming - self.multipath = multipath - - @property - def user_data_dir(self): - return user_data_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_data_dir(self): - return site_data_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_config_dir(self): - return user_config_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_config_dir(self): - return site_config_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_cache_dir(self): - return user_cache_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_state_dir(self): - return user_state_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_log_dir(self): - return user_log_dir(self.appname, self.appauthor, - version=self.version) - - -#---- internal support stuff - -def _get_win_folder_from_registry(csidl_name): - """This is a fallback technique at best. I'm not sure if using the - registry for this guarantees us the correct answer for all CSIDL_* - names. - """ - if PY3: - import winreg as _winreg - else: - import _winreg - - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - }[csidl_name] - - key = _winreg.OpenKey( - _winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" - ) - dir, type = _winreg.QueryValueEx(key, shell_folder_name) - return dir - - -def _get_win_folder_with_pywin32(csidl_name): - from win32com.shell import shellcon, shell - dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) - # Try to make this a unicode path because SHGetFolderPath does - # not return unicode strings when there is unicode data in the - # path. - try: - dir = unicode(dir) - - # Downgrade to short path name if have highbit chars. See - # . - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - try: - import win32api - dir = win32api.GetShortPathName(dir) - except ImportError: - pass - except UnicodeError: - pass - return dir - - -def _get_win_folder_with_ctypes(csidl_name): - import ctypes - - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - }[csidl_name] - - buf = ctypes.create_unicode_buffer(1024) - ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if have highbit chars. See - # . - has_high_char = False - for c in buf: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf2 = ctypes.create_unicode_buffer(1024) - if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - return buf.value - -def _get_win_folder_with_jna(csidl_name): - import array - from com.sun import jna - from com.sun.jna.platform import win32 - - buf_size = win32.WinDef.MAX_PATH * 2 - buf = array.zeros('c', buf_size) - shell = win32.Shell32.INSTANCE - shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - # Downgrade to short path name if have highbit chars. See - # . - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf = array.zeros('c', buf_size) - kernel = win32.Kernel32.INSTANCE - if kernel.GetShortPathName(dir, buf, buf_size): - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - return dir - -if system == "win32": - try: - from ctypes import windll - _get_win_folder = _get_win_folder_with_ctypes - except ImportError: - try: - import com.sun.jna - _get_win_folder = _get_win_folder_with_jna - except ImportError: - _get_win_folder = _get_win_folder_from_registry - - -def _win_path_to_bytes(path): - """Encode Windows paths to bytes. Only used on Python 2. - - Motivation is to be consistent with other operating systems where paths - are also returned as bytes. This avoids problems mixing bytes and Unicode - elsewhere in the codebase. For more details and discussion see - . - - If encoding using ASCII and MBCS fails, return the original Unicode path. - """ - for encoding in ('ASCII', 'MBCS'): - try: - return path.encode(encoding) - except (UnicodeEncodeError, LookupError): - pass - return path - - -#---- self test code - -if __name__ == "__main__": - appname = "MyApp" - appauthor = "MyCompany" - - props = ("user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "site_data_dir", - "site_config_dir") - - print("-- app dirs %s --" % __version__) - - print("-- app dirs (with optional 'version')") - dirs = AppDirs(appname, appauthor, version="1.0") - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'version')") - dirs = AppDirs(appname, appauthor) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'appauthor')") - dirs = AppDirs(appname) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (with disabled 'appauthor')") - dirs = AppDirs(appname, appauthor=False) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py deleted file mode 100644 index a1bbbbe..0000000 --- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""CacheControl import Interface. - -Make it easy to import from cachecontrol without long namespaces. -""" -__author__ = "Eric Larson" -__email__ = "eric@ionrock.org" -__version__ = "0.12.6" - -from .wrapper import CacheControl -from .adapter import CacheControlAdapter -from .controller import CacheController diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index a3bb605726424ed235e6233705c1ec51e9091ad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 548 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 diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc deleted file mode 100644 index 5a2a826c169c80afa1646e4aeb9a8ee882979114..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1821 zcma)7&2G~`5Z<*N$1x2JEx!lA2SADh5g<+#LWP1*B@`ingorFzTkj@yYkSSwiIgfQ z+IwFCj(H_tIq?ddm{~VJv_Y`ePIh-DJKuaWW3y({B{06kciDZDkRP~N9u{o2Vdl?3 zaMB~3awDdR(K9G{OSs9c6T&TF9-BQ2_BC$9-WC?@YrOt}w4I|p_v60sLKcFQdj}#c zyqE8Hy}ndllw`3;L|R1Ypt8t29$ItJXT!MgqTFL%v9AQLKe z8;IP`qRbCK$EET$(V$vRRb|K zm4oXBh_W_f@lfb^Dsc%<&0G{sSgddfn*XJ9;ZoJnAqKJJ#O5Lvg=j7LX)Qvllp#hl z8@QfFhv8t(Dkpe#n^tk1b5jdrnTt&@m_@U`@S=6ycD;0hAjMn-r5gl^4!D89Lo3Dew5}%NOPH1*H!j&(ue3NTSliG<_8L(d6#+KuQkc3vfGw>HZlMQE1)&Z-+L+_%%nUBzLSv2VGAt(K zfP4c~oP0OVQVGs)fTkjQMcHV@ZLpYSv$=4(svR%~+TYfhzf+H*U;53M(1{Vz@05~H zP)Zg&$0j9d>j}JW9z&(!^BLwcSIDLYSlYu3$Px(k}vsFE)3;7-bwLxGGU3%175Lz{1n?i@E4KPsHM(Qex zn<&n8#Hwbv26mXxvu1EDXa-B+X}4{c^&sFfgidQzUkZ4AR^@0{pBvpZ+IorNd8d`m S^Qu)};A=t0U|DNsYyCHH!C5Z= diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc deleted file mode 100644 index 1f977908d180c47f1d3331a884197cba9f3b7847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 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 diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc deleted file mode 100644 index 3147c0455c6093d03d410998600fd835c23ead61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 zcmYjPJ#W-77`C0y>)lmQ7R17almWU|2vHp@47boJvJ| zKPM{_{{VI3b*`22T7LArA9?fmwb^ocg22A2m+Ut|=udE_mVxsgwtWS_5yuL(xWqVc zqDUK+5%7#BJpF;om`9&ck^jX|T;So^iq#vj>N{t8b;+4_!a#WTLDp_et*`1FN*`?o zB={@X_7i}|9Bq*~b?7_lh{p%)Q~liGL+VqHJ@Ju`ed05YZ_`8W(H-H$=RXNXBaa?A zh>F)mGR*5Bs1lAfb~v%ZNT%dom|?aNTO+NL_3)%V>Q%y2wPMx|Psgv=wGve;+@|Mt zpKYAe7w6~uJP-@4h)e{E4Ga+tN!xEbSIo-T3TTjw4NM&JNq{s!7;U*^$FUrLWy0x) z>>>6GnFaXw&BqJM#ZIVRQ*HXju(p+5L-h@a>8eIL+OSqsRzBlb1>#nBtZ>K5|~?#x|}UTbkP^HgsQ{jtu;G za&Ii&%4vrL{Ua)q7kU`Fv415`Ow~;F>T#W_|EIL1e6Z9}TgrF1y99+Z+7Kb8pp$gY zcn$GTcEJm63TWw2-#jTxeeAjnf8!LoS@zNBD(A%hUcnp&p^*^MiLz~RJQij*-?6WG@}JPYw7=OiDat-#XTN5LGqW?l*?4oa!SFpv zejIDNHWe!FHAwI!h9z2gJ1eTny@H+i3YeK?-)r z7orsCsX2F8mn}r$7BKWg==bc7w^|ce`_!)av^L)=*lDd~XWSZi)n!Fc)Q94DzcR8i z4m^#Lm7?Tl&cd;0HcCf2XW|iiV4cCC$7!>4NY2;nrAx5ab~~ogjXK?X-JPB8BNKF^ zJNG-E@9r7#bici6M3&Rqqup+2XV28S(f01$&mS7U8{PfW_KvBI;yf-2t$kRkYaqtg zYLXo(Q@h{2t97Pv=s`7bv#CmrKa{rj21%BywrhgnI8kXlQ9W-s$)qygFo_RxBZl%j zrr(6j|30~UyD!y|O0sExsMp+sijEnvO1Vs5X9;p72N{{-I z3-v23J&q4l-k*-A{Rn$9)BOQm<)FI3YLfR!jmU1?m>!!eQLY9vts+u3da5Dn5>&}U z5GH)Ti3|s4aR#f{>&MB@o$jMfUaTr zQRY#8*>LR@-dDr7v}$J zglk`?`|$4V@O~O*S}F}W_OBo+TzN1&&Sv3cmKWhDK2jG>lLizV;W*8U7#S~bgnQr~ z#OZP=92eoyI1UkGw=bLxX=%l^lyrfm-87A_;$)_5mh^%pll~#B>|I?>Z%oL*2`!CJRw`+{X{?L<6}$#(jk98VgeP~#qR`lnTpH@EdTK4%Tlw49@Y2_poX(V zjXm%`V5q~D$wugXm_u&UmqCoHRV>YA(y)^i_p(_kZCEdDb{?x^{Tt#G!_jNT0v8hO zLFKVd3 zx7RB$&H~`h_&0x8xCKD&5MX!MurBjT?{uRSRRuqHTH1okjxM_FmEC`=?~>zm8)~+j zmD_BH1e5r&LRRPc18f;ea0(8ay_yP^#*2$pnM+m4=C<){JwwD%IBCjL;~fzMRUUQ; z9rW*LkIHXFY;HTbDrQ*9Nh%!e2!0(&?Te;pU2rz|F2ol(eidIAlLe0A`7JzJ#Hq7% zQ+frl;~w8!ck#IcyvhLAT(7y9+)Q%wH$WRzv#G2i9jDvBnPJd{(Y}BopZ^Nqvo~Xzo;)+P2zmhEk zvdqJ?>I?MkOZq)@6+i}sdR9Eu@w6&_UL~3MP2=V34)1fTkqr-1@8I&Pa(SK{HZREO m_7B!{T3v|=KB?~dQ>sDvRgi!Oya|M9qOQ?s%L&@8hyMrnk?;@z diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc deleted file mode 100644 index 994a210381b547623aa6236685bef049c3ee63d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 zcmZ`(PjA~c6emSVR$Mzxv2N=wD+lZ%p!2yXigsu>Y`gf-V8CE#5Ll6Mw9=A7(ry!| zr{;si$9yGScj{N@Y41@M;szZ7ijRDJdcWWMLouC>35+xSQ2fOR`4>0)BZSS*FzsXb zNFu2wE4rW*N8OrFA$Vi1B*dmhgF-b=s!J4GBOJunzZCO`d z7EZZxr9eJ-A*^~Sic?kK&HVwWdIZlvP-HWjvi@K`PpbM?i zCuRgUu8BE-<&*jKNhZ}s>AJ}pQ!kBJt;%YdHRtZMuJUE+vZYw5+%}?6*+x~HOqZ`S zTRQa<9K8`sWwWMivK(}>Hd*20P*={>y5HE$Ane?0X3cq*pG%`i~LpL@4YL1>x1Ke%p#EmTnTW6NA{#kS-DdC$BqY^jS{b`@{Q2MV_s*4Y4a zw1a7tGsvim*RH7Qw~Gi))Vq$AmFuRic0%V?LF%MULr=#X;`L}F^jdWz^{y$6vbX8o zg*!Mc27u6z9t9J6u}>1*{C{YVz-ZvN^}RCS-i0@oN&`+ag^Ra+e+_5fz#Kw*Z!fgH zSwTTP49qVE*aw$`&^z9eU&!A_@1ckx!vSWPlC!adJg33MAHOTzD8o-`!wap1fpX05q`Jtv`3}_9 zR|Y$z7e{-QTC{ooczP^R!29AN)d*wcA8&hu3**Ba$Xo}aCS?ltBP z{u`UbU@7&n`4*)I__^`yCEryMDDY*mXq5yBOW1e>-`JpLp2q0yWbM`lycx`VU;N+0 l>oMEC9kTC9hrbv?uTk!)>uqCs6GZ_8;(}SJD6g diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py deleted file mode 100644 index 607b945..0000000 --- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +++ /dev/null @@ -1,146 +0,0 @@ -import hashlib -import os -from textwrap import dedent - -from ..cache import BaseCache -from ..controller import CacheController - -try: - FileNotFoundError -except NameError: - # py2.X - FileNotFoundError = (IOError, OSError) - - -def _secure_open_write(filename, fmode): - # We only want to write to this file, so open it in write only mode - flags = os.O_WRONLY - - # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only - # will open *new* files. - # We specify this because we want to ensure that the mode we pass is the - # mode of the file. - flags |= os.O_CREAT | os.O_EXCL - - # Do not follow symlinks to prevent someone from making a symlink that - # we follow and insecurely open a cache file. - if hasattr(os, "O_NOFOLLOW"): - flags |= os.O_NOFOLLOW - - # On Windows we'll mark this file as binary - if hasattr(os, "O_BINARY"): - flags |= os.O_BINARY - - # Before we open our file, we want to delete any existing file that is - # there - try: - os.remove(filename) - except (IOError, OSError): - # The file must not exist already, so we can just skip ahead to opening - pass - - # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a - # race condition happens between the os.remove and this line, that an - # error will be raised. Because we utilize a lockfile this should only - # happen if someone is attempting to attack us. - fd = os.open(filename, flags, fmode) - try: - return os.fdopen(fd, "wb") - - except: - # An error occurred wrapping our FD in a file object - os.close(fd) - raise - - -class FileCache(BaseCache): - - def __init__( - self, - directory, - forever=False, - filemode=0o0600, - dirmode=0o0700, - use_dir_lock=None, - lock_class=None, - ): - - if use_dir_lock is not None and lock_class is not None: - raise ValueError("Cannot use use_dir_lock and lock_class together") - - try: - from lockfile import LockFile - from lockfile.mkdirlockfile import MkdirLockFile - except ImportError: - notice = dedent( - """ - NOTE: In order to use the FileCache you must have - lockfile installed. You can install it via pip: - pip install lockfile - """ - ) - raise ImportError(notice) - - else: - if use_dir_lock: - lock_class = MkdirLockFile - - elif lock_class is None: - lock_class = LockFile - - self.directory = directory - self.forever = forever - self.filemode = filemode - self.dirmode = dirmode - self.lock_class = lock_class - - @staticmethod - def encode(x): - return hashlib.sha224(x.encode()).hexdigest() - - def _fn(self, name): - # NOTE: This method should not change as some may depend on it. - # See: https://github.com/ionrock/cachecontrol/issues/63 - hashed = self.encode(name) - parts = list(hashed[:5]) + [hashed] - return os.path.join(self.directory, *parts) - - def get(self, key): - name = self._fn(key) - try: - with open(name, "rb") as fh: - return fh.read() - - except FileNotFoundError: - return None - - def set(self, key, value): - name = self._fn(key) - - # Make sure the directory exists - try: - os.makedirs(os.path.dirname(name), self.dirmode) - except (IOError, OSError): - pass - - with self.lock_class(name) as lock: - # Write our actual file - with _secure_open_write(lock.path, self.filemode) as fh: - fh.write(value) - - def delete(self, key): - name = self._fn(key) - if not self.forever: - try: - os.remove(name) - except FileNotFoundError: - pass - - -def url_to_file_path(url, filecache): - """Return the file cache path based on the URL. - - This does not ensure the file exists! - """ - key = CacheController.cache_url(url) - return filecache._fn(key) diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py deleted file mode 100644 index ed705ce..0000000 --- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import division - -from datetime import datetime -from pip._vendor.cachecontrol.cache import BaseCache - - -class RedisCache(BaseCache): - - def __init__(self, conn): - self.conn = conn - - def get(self, key): - return self.conn.get(key) - - def set(self, key, value, expires=None): - if not expires: - self.conn.set(key, value) - else: - expires = expires - datetime.utcnow() - self.conn.setex(key, int(expires.total_seconds()), value) - - def delete(self, key): - self.conn.delete(key) - - def clear(self): - """Helper for clearing all the keys in a database. Use with - caution!""" - for key in self.conn.keys(): - self.conn.delete(key) - - def close(self): - """Redis uses connection pooling, no need to close the connection.""" - pass diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py deleted file mode 100644 index 33b5aed..0000000 --- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py +++ /dev/null @@ -1,29 +0,0 @@ -try: - from urllib.parse import urljoin -except ImportError: - from urlparse import urljoin - - -try: - import cPickle as pickle -except ImportError: - import pickle - - -# Handle the case where the requests module has been patched to not have -# urllib3 bundled as part of its source. -try: - from pip._vendor.requests.packages.urllib3.response import HTTPResponse -except ImportError: - from pip._vendor.urllib3.response import HTTPResponse - -try: - from pip._vendor.requests.packages.urllib3.util import is_fp_closed -except ImportError: - from pip._vendor.urllib3.util import is_fp_closed - -# Replicate some six behaviour -try: - text_type = unicode -except NameError: - text_type = str diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py deleted file mode 100644 index dafe55c..0000000 --- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +++ /dev/null @@ -1,376 +0,0 @@ -""" -The httplib2 algorithms ported for use with requests. -""" -import logging -import re -import calendar -import time -from email.utils import parsedate_tz - -from pip._vendor.requests.structures import CaseInsensitiveDict - -from .cache import DictCache -from .serialize import Serializer - - -logger = logging.getLogger(__name__) - -URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") - - -def parse_uri(uri): - """Parses a URI using the regex given in Appendix B of RFC 3986. - - (scheme, authority, path, query, fragment) = parse_uri(uri) - """ - groups = URI.match(uri).groups() - return (groups[1], groups[3], groups[4], groups[6], groups[8]) - - -class CacheController(object): - """An interface to see if request should cached or not. - """ - - def __init__( - self, cache=None, cache_etags=True, serializer=None, status_codes=None - ): - self.cache = DictCache() if cache is None else cache - self.cache_etags = cache_etags - self.serializer = serializer or Serializer() - self.cacheable_status_codes = status_codes or (200, 203, 300, 301) - - @classmethod - def _urlnorm(cls, uri): - """Normalize the URL to create a safe key for the cache""" - (scheme, authority, path, query, fragment) = parse_uri(uri) - if not scheme or not authority: - raise Exception("Only absolute URIs are allowed. uri = %s" % uri) - - scheme = scheme.lower() - authority = authority.lower() - - if not path: - path = "/" - - # Could do syntax based normalization of the URI before - # computing the digest. See Section 6.2.2 of Std 66. - request_uri = query and "?".join([path, query]) or path - defrag_uri = scheme + "://" + authority + request_uri - - return defrag_uri - - @classmethod - def cache_url(cls, uri): - return cls._urlnorm(uri) - - def parse_cache_control(self, headers): - known_directives = { - # https://tools.ietf.org/html/rfc7234#section-5.2 - "max-age": (int, True), - "max-stale": (int, False), - "min-fresh": (int, True), - "no-cache": (None, False), - "no-store": (None, False), - "no-transform": (None, False), - "only-if-cached": (None, False), - "must-revalidate": (None, False), - "public": (None, False), - "private": (None, False), - "proxy-revalidate": (None, False), - "s-maxage": (int, True), - } - - cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) - - retval = {} - - for cc_directive in cc_headers.split(","): - if not cc_directive.strip(): - continue - - parts = cc_directive.split("=", 1) - directive = parts[0].strip() - - try: - typ, required = known_directives[directive] - except KeyError: - logger.debug("Ignoring unknown cache-control directive: %s", directive) - continue - - if not typ or not required: - retval[directive] = None - if typ: - try: - retval[directive] = typ(parts[1].strip()) - except IndexError: - if required: - logger.debug( - "Missing value for cache-control " "directive: %s", - directive, - ) - except ValueError: - logger.debug( - "Invalid value for cache-control directive " "%s, must be %s", - directive, - typ.__name__, - ) - - return retval - - def cached_request(self, request): - """ - Return a cached response if it exists in the cache, otherwise - return False. - """ - cache_url = self.cache_url(request.url) - logger.debug('Looking up "%s" in the cache', cache_url) - cc = self.parse_cache_control(request.headers) - - # Bail out if the request insists on fresh data - if "no-cache" in cc: - logger.debug('Request header has "no-cache", cache bypassed') - return False - - if "max-age" in cc and cc["max-age"] == 0: - logger.debug('Request header has "max_age" as 0, cache bypassed') - return False - - # Request allows serving from the cache, let's see if we find something - cache_data = self.cache.get(cache_url) - if cache_data is None: - logger.debug("No cache entry available") - return False - - # Check whether it can be deserialized - resp = self.serializer.loads(request, cache_data) - if not resp: - logger.warning("Cache entry deserialization failed, entry ignored") - return False - - # If we have a cached 301, return it immediately. We don't - # need to test our response for other headers b/c it is - # intrinsically "cacheable" as it is Permanent. - # See: - # https://tools.ietf.org/html/rfc7231#section-6.4.2 - # - # Client can try to refresh the value by repeating the request - # with cache busting headers as usual (ie no-cache). - if resp.status == 301: - msg = ( - 'Returning cached "301 Moved Permanently" response ' - "(ignoring date and etag information)" - ) - logger.debug(msg) - return resp - - headers = CaseInsensitiveDict(resp.headers) - if not headers or "date" not in headers: - if "etag" not in headers: - # Without date or etag, the cached response can never be used - # and should be deleted. - logger.debug("Purging cached response: no date or etag") - self.cache.delete(cache_url) - logger.debug("Ignoring cached response: no date") - return False - - now = time.time() - date = calendar.timegm(parsedate_tz(headers["date"])) - current_age = max(0, now - date) - logger.debug("Current age based on date: %i", current_age) - - # TODO: There is an assumption that the result will be a - # urllib3 response object. This may not be best since we - # could probably avoid instantiating or constructing the - # response until we know we need it. - resp_cc = self.parse_cache_control(headers) - - # determine freshness - freshness_lifetime = 0 - - # Check the max-age pragma in the cache control header - if "max-age" in resp_cc: - freshness_lifetime = resp_cc["max-age"] - logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) - - # If there isn't a max-age, check for an expires header - elif "expires" in headers: - expires = parsedate_tz(headers["expires"]) - if expires is not None: - expire_time = calendar.timegm(expires) - date - freshness_lifetime = max(0, expire_time) - logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) - - # Determine if we are setting freshness limit in the - # request. Note, this overrides what was in the response. - if "max-age" in cc: - freshness_lifetime = cc["max-age"] - logger.debug( - "Freshness lifetime from request max-age: %i", freshness_lifetime - ) - - if "min-fresh" in cc: - min_fresh = cc["min-fresh"] - # adjust our current age by our min fresh - current_age += min_fresh - logger.debug("Adjusted current age from min-fresh: %i", current_age) - - # Return entry if it is fresh enough - if freshness_lifetime > current_age: - logger.debug('The response is "fresh", returning cached response') - logger.debug("%i > %i", freshness_lifetime, current_age) - return resp - - # we're not fresh. If we don't have an Etag, clear it out - if "etag" not in headers: - logger.debug('The cached response is "stale" with no etag, purging') - self.cache.delete(cache_url) - - # return the original handler - return False - - def conditional_headers(self, request): - cache_url = self.cache_url(request.url) - resp = self.serializer.loads(request, self.cache.get(cache_url)) - new_headers = {} - - if resp: - headers = CaseInsensitiveDict(resp.headers) - - if "etag" in headers: - new_headers["If-None-Match"] = headers["ETag"] - - if "last-modified" in headers: - new_headers["If-Modified-Since"] = headers["Last-Modified"] - - return new_headers - - def cache_response(self, request, response, body=None, status_codes=None): - """ - Algorithm for caching requests. - - This assumes a requests Response object. - """ - # From httplib2: Don't cache 206's since we aren't going to - # handle byte range requests - cacheable_status_codes = status_codes or self.cacheable_status_codes - if response.status not in cacheable_status_codes: - logger.debug( - "Status code %s not in %s", response.status, cacheable_status_codes - ) - return - - response_headers = CaseInsensitiveDict(response.headers) - - # If we've been given a body, our response has a Content-Length, that - # Content-Length is valid then we can check to see if the body we've - # been given matches the expected size, and if it doesn't we'll just - # skip trying to cache it. - if ( - body is not None - and "content-length" in response_headers - and response_headers["content-length"].isdigit() - and int(response_headers["content-length"]) != len(body) - ): - return - - cc_req = self.parse_cache_control(request.headers) - cc = self.parse_cache_control(response_headers) - - cache_url = self.cache_url(request.url) - logger.debug('Updating cache with response from "%s"', cache_url) - - # Delete it from the cache if we happen to have it stored there - no_store = False - if "no-store" in cc: - no_store = True - logger.debug('Response header has "no-store"') - if "no-store" in cc_req: - no_store = True - logger.debug('Request header has "no-store"') - if no_store and self.cache.get(cache_url): - logger.debug('Purging existing cache entry to honor "no-store"') - self.cache.delete(cache_url) - if no_store: - return - - # https://tools.ietf.org/html/rfc7234#section-4.1: - # A Vary header field-value of "*" always fails to match. - # Storing such a response leads to a deserialization warning - # during cache lookup and is not allowed to ever be served, - # so storing it can be avoided. - if "*" in response_headers.get("vary", ""): - logger.debug('Response header has "Vary: *"') - return - - # If we've been given an etag, then keep the response - if self.cache_etags and "etag" in response_headers: - logger.debug("Caching due to etag") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - # Add to the cache any 301s. We do this before looking that - # the Date headers. - elif response.status == 301: - logger.debug("Caching permanant redirect") - self.cache.set(cache_url, self.serializer.dumps(request, response)) - - # Add to the cache if the response headers demand it. If there - # is no date header then we can't do anything about expiring - # the cache. - elif "date" in response_headers: - # cache when there is a max-age > 0 - if "max-age" in cc and cc["max-age"] > 0: - logger.debug("Caching b/c date exists and max-age > 0") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - # If the request can expire, it means we should cache it - # in the meantime. - elif "expires" in response_headers: - if response_headers["expires"]: - logger.debug("Caching b/c of expires header") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - def update_cached_response(self, request, response): - """On a 304 we will get a new set of headers that we want to - update our cached value with, assuming we have one. - - This should only ever be called when we've sent an ETag and - gotten a 304 as the response. - """ - cache_url = self.cache_url(request.url) - - cached_response = self.serializer.loads(request, self.cache.get(cache_url)) - - if not cached_response: - # we didn't have a cached response - return response - - # Lets update our headers with the headers from the new request: - # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 - # - # The server isn't supposed to send headers that would make - # the cached body invalid. But... just in case, we'll be sure - # to strip out ones we know that might be problmatic due to - # typical assumptions. - excluded_headers = ["content-length"] - - cached_response.headers.update( - dict( - (k, v) - for k, v in response.headers.items() - if k.lower() not in excluded_headers - ) - ) - - # we want a 200 b/c we have content via the cache - cached_response.status = 200 - - # update our cache - self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) - - return cached_response diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py deleted file mode 100644 index 30ed4c5..0000000 --- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +++ /dev/null @@ -1,80 +0,0 @@ -from io import BytesIO - - -class CallbackFileWrapper(object): - """ - Small wrapper around a fp object which will tee everything read into a - buffer, and when that file is closed it will execute a callback with the - contents of that buffer. - - All attributes are proxied to the underlying file object. - - This class uses members with a double underscore (__) leading prefix so as - not to accidentally shadow an attribute. - """ - - def __init__(self, fp, callback): - self.__buf = BytesIO() - self.__fp = fp - self.__callback = callback - - def __getattr__(self, name): - # The vaguaries of garbage collection means that self.__fp is - # not always set. By using __getattribute__ and the private - # name[0] allows looking up the attribute value and raising an - # AttributeError when it doesn't exist. This stop thigns from - # infinitely recursing calls to getattr in the case where - # self.__fp hasn't been set. - # - # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers - fp = self.__getattribute__("_CallbackFileWrapper__fp") - return getattr(fp, name) - - def __is_fp_closed(self): - try: - return self.__fp.fp is None - - except AttributeError: - pass - - try: - return self.__fp.closed - - except AttributeError: - pass - - # We just don't cache it then. - # TODO: Add some logging here... - return False - - def _close(self): - if self.__callback: - self.__callback(self.__buf.getvalue()) - - # We assign this to None here, because otherwise we can get into - # really tricky problems where the CPython interpreter dead locks - # because the callback is holding a reference to something which - # has a __del__ method. Setting this to None breaks the cycle - # and allows the garbage collector to do it's thing normally. - self.__callback = None - - def read(self, amt=None): - data = self.__fp.read(amt) - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data - - def _safe_read(self, amt): - data = self.__fp._safe_read(amt) - if amt == 2 and data == b"\r\n": - # urllib executes this read to toss the CRLF at the end - # of the chunk. - return data - - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py deleted file mode 100644 index 6c0e979..0000000 --- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +++ /dev/null @@ -1,135 +0,0 @@ -import calendar -import time - -from email.utils import formatdate, parsedate, parsedate_tz - -from datetime import datetime, timedelta - -TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" - - -def expire_after(delta, date=None): - date = date or datetime.utcnow() - return date + delta - - -def datetime_to_header(dt): - return formatdate(calendar.timegm(dt.timetuple())) - - -class BaseHeuristic(object): - - def warning(self, response): - """ - Return a valid 1xx warning header value describing the cache - adjustments. - - The response is provided too allow warnings like 113 - http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need - to explicitly say response is over 24 hours old. - """ - return '110 - "Response is Stale"' - - def update_headers(self, response): - """Update the response headers with any new headers. - - NOTE: This SHOULD always include some Warning header to - signify that the response was cached by the client, not - by way of the provided headers. - """ - return {} - - def apply(self, response): - updated_headers = self.update_headers(response) - - if updated_headers: - response.headers.update(updated_headers) - warning_header_value = self.warning(response) - if warning_header_value is not None: - response.headers.update({"Warning": warning_header_value}) - - return response - - -class OneDayCache(BaseHeuristic): - """ - Cache the response by providing an expires 1 day in the - future. - """ - - def update_headers(self, response): - headers = {} - - if "expires" not in response.headers: - date = parsedate(response.headers["date"]) - expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) - headers["expires"] = datetime_to_header(expires) - headers["cache-control"] = "public" - return headers - - -class ExpiresAfter(BaseHeuristic): - """ - Cache **all** requests for a defined time period. - """ - - def __init__(self, **kw): - self.delta = timedelta(**kw) - - def update_headers(self, response): - expires = expire_after(self.delta) - return {"expires": datetime_to_header(expires), "cache-control": "public"} - - def warning(self, response): - tmpl = "110 - Automatically cached for %s. Response might be stale" - return tmpl % self.delta - - -class LastModified(BaseHeuristic): - """ - If there is no Expires header already, fall back on Last-Modified - using the heuristic from - http://tools.ietf.org/html/rfc7234#section-4.2.2 - to calculate a reasonable value. - - Firefox also does something like this per - https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ - http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 - Unlike mozilla we limit this to 24-hr. - """ - cacheable_by_default_statuses = { - 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 - } - - def update_headers(self, resp): - headers = resp.headers - - if "expires" in headers: - return {} - - if "cache-control" in headers and headers["cache-control"] != "public": - return {} - - if resp.status not in self.cacheable_by_default_statuses: - return {} - - if "date" not in headers or "last-modified" not in headers: - return {} - - date = calendar.timegm(parsedate_tz(headers["date"])) - last_modified = parsedate(headers["last-modified"]) - if date is None or last_modified is None: - return {} - - now = time.time() - current_age = max(0, now - date) - delta = date - calendar.timegm(last_modified) - freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) - if freshness_lifetime <= current_age: - return {} - - expires = date + freshness_lifetime - return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} - - def warning(self, resp): - return None diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py deleted file mode 100644 index 3b6ec2d..0000000 --- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +++ /dev/null @@ -1,188 +0,0 @@ -import base64 -import io -import json -import zlib - -from pip._vendor import msgpack -from pip._vendor.requests.structures import CaseInsensitiveDict - -from .compat import HTTPResponse, pickle, text_type - - -def _b64_decode_bytes(b): - return base64.b64decode(b.encode("ascii")) - - -def _b64_decode_str(s): - return _b64_decode_bytes(s).decode("utf8") - - -class Serializer(object): - - def dumps(self, request, response, body=None): - response_headers = CaseInsensitiveDict(response.headers) - - if body is None: - body = response.read(decode_content=False) - - # NOTE: 99% sure this is dead code. I'm only leaving it - # here b/c I don't have a test yet to prove - # it. Basically, before using - # `cachecontrol.filewrapper.CallbackFileWrapper`, - # this made an effort to reset the file handle. The - # `CallbackFileWrapper` short circuits this code by - # setting the body as the content is consumed, the - # result being a `body` argument is *always* passed - # into cache_response, and in turn, - # `Serializer.dump`. - response._fp = io.BytesIO(body) - - # NOTE: This is all a bit weird, but it's really important that on - # Python 2.x these objects are unicode and not str, even when - # they contain only ascii. The problem here is that msgpack - # understands the difference between unicode and bytes and we - # have it set to differentiate between them, however Python 2 - # doesn't know the difference. Forcing these to unicode will be - # enough to have msgpack know the difference. - data = { - u"response": { - u"body": body, - u"headers": dict( - (text_type(k), text_type(v)) for k, v in response.headers.items() - ), - u"status": response.status, - u"version": response.version, - u"reason": text_type(response.reason), - u"strict": response.strict, - u"decode_content": response.decode_content, - } - } - - # Construct our vary headers - data[u"vary"] = {} - if u"vary" in response_headers: - varied_headers = response_headers[u"vary"].split(",") - for header in varied_headers: - header = text_type(header).strip() - header_value = request.headers.get(header, None) - if header_value is not None: - header_value = text_type(header_value) - data[u"vary"][header] = header_value - - return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) - - def loads(self, request, data): - # Short circuit if we've been given an empty set of data - if not data: - return - - # Determine what version of the serializer the data was serialized - # with - try: - ver, data = data.split(b",", 1) - except ValueError: - ver = b"cc=0" - - # Make sure that our "ver" is actually a version and isn't a false - # positive from a , being in the data stream. - if ver[:3] != b"cc=": - data = ver + data - ver = b"cc=0" - - # Get the version number out of the cc=N - ver = ver.split(b"=", 1)[-1].decode("ascii") - - # Dispatch to the actual load method for the given version - try: - return getattr(self, "_loads_v{}".format(ver))(request, data) - - 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): - """Verify our vary headers match and construct a real urllib3 - HTTPResponse object. - """ - # Special case the '*' Vary value as it means we cannot actually - # determine if the cached response is suitable for this request. - # This case is also handled in the controller code when creating - # a cache entry, but is left here for backwards compatibility. - if "*" in cached.get("vary", {}): - return - - # Ensure that the Vary headers for the cached response match our - # request - for header, value in cached.get("vary", {}).items(): - if request.headers.get(header, None) != value: - return - - body_raw = cached["response"].pop("body") - - headers = CaseInsensitiveDict(data=cached["response"]["headers"]) - if headers.get("transfer-encoding", "") == "chunked": - headers.pop("transfer-encoding") - - cached["response"]["headers"] = headers - - try: - body = io.BytesIO(body_raw) - 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 - # a Python 3 str (unicode string), which will cause the above to - # fail with: - # - # TypeError: 'str' does not support the buffer interface - body = io.BytesIO(body_raw.encode("utf8")) - - return HTTPResponse(body=body, preload_content=False, **cached["response"]) - - def _loads_v0(self, request, data): - # 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): - try: - cached = pickle.loads(data) - except ValueError: - return - - return self.prepare_response(request, cached) - - def _loads_v2(self, request, data): - try: - cached = json.loads(zlib.decompress(data).decode("utf8")) - except (ValueError, zlib.error): - return - - # We need to decode the items that we've base64 encoded - cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) - cached["response"]["headers"] = dict( - (_b64_decode_str(k), _b64_decode_str(v)) - for k, v in cached["response"]["headers"].items() - ) - cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) - cached["vary"] = dict( - (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) - for k, v in cached["vary"].items() - ) - - return self.prepare_response(request, cached) - - def _loads_v3(self, request, data): - # 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): - try: - cached = msgpack.loads(data, raw=False) - except ValueError: - return - - return self.prepare_response(request, cached) diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py deleted file mode 100644 index d8e6fc6..0000000 --- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +++ /dev/null @@ -1,29 +0,0 @@ -from .adapter import CacheControlAdapter -from .cache import DictCache - - -def CacheControl( - sess, - cache=None, - cache_etags=True, - serializer=None, - heuristic=None, - controller_class=None, - adapter_class=None, - cacheable_methods=None, -): - - cache = DictCache() if cache is None else cache - adapter_class = adapter_class or CacheControlAdapter - adapter = adapter_class( - cache, - cache_etags=cache_etags, - serializer=serializer, - heuristic=heuristic, - controller_class=controller_class, - cacheable_methods=cacheable_methods, - ) - sess.mount("http://", adapter) - sess.mount("https://", adapter) - - return sess diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py b/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py deleted file mode 100644 index 17aaf90..0000000 --- a/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .core import contents, where - -__version__ = "2020.12.05" diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py b/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py deleted file mode 100644 index 0037634..0000000 --- a/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +++ /dev/null @@ -1,12 +0,0 @@ -import argparse - -from pip._vendor.certifi import contents, where - -parser = argparse.ArgumentParser() -parser.add_argument("-c", "--contents", action="store_true") -args = parser.parse_args() - -if args.contents: - print(contents()) -else: - print(where()) diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 581e52b10720b4de5a60b62a5cc3c5399517ea6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274 zcmYjLJxc^J6il*vaGV@i+F5VmvM$(&95%K#cFThhljmMAUnX(o{73$!ZLRzZRwkVT zZyxjJF^t&ncckFWT#7^4-&OnvE8@OPx+tWGqJ~&HQOhPqiDFZunkUk=KeX5#Tes4? zj4r2j^Krz8pSy7whyHr(hnvT)om%N5#u^%%LhBjl3&y0qep5+gc{T?BI;pBGn zVe$xiwT3~Gh)60~P9yp?k)GsNL~_MeUgTYTspu(Rw`6NWqqb_B1KF0HD-v~-w<5n& z*yrc|q8kN^Ueu#RvZN1vAiIs%Q&N1&iSo`%O7Q!M6d%ES=lsuRF85?l_OEEvlY?dl zc(8{=?#Nw;vMbpWGJNMk1*tMNJIO}ndGOm!3xeZ$R)q^Km$?d!vP)A`p`EKRD=M4h zd15nNgt<-|L!X3cf+vkiwFtEdGh2nJF03kSH46TQWRPi!he45uLc*A& z0F1f&;wUSR5}VGI95)almYNPd=L=CJ3nhdLglHgw-5287GRd1iuZU^Gnf35mOg@XH zI#anWl;yn8~t}?4WhNWMUnX2M4D`Nrw zq&D$3WpS#Fg1i|9p^!p_hEMCcyC;qwABiW&htsbPzx#eV5#z}Z$8Sx+7`Jj5ECK3t zI-~|=^oBuWbzsf4ew{0$?&A&&MyTn+2>Ie=V&|@FR3e2{&+Y#rdEi$^`Vb5Y+FTOz zfkmCM6-$`)EL-ypS<$4y;Y}~@0_o9~^k_@^b@1k*hb_qZ_z;PSqr>BGoIg`m)IfUI z>*M1eomW}ox#A+H309l39iSPFU+GnnnRB4u_i2b@@qR^-2asY-Umad@A zE}3L6y+8I}c$eOqZOBu?fF*}-xy+iAj6jp8;${tzN4Bi97 zl2f{d8`#hnjm_Ok%@(CL7K(FZ zRHc_DRZUI|Vs8NLqBX!%dyi}Hi80!k5SMSBgvM&X9yBk==N@=eSR1_UdwZPmKIPPB TZMMfa<*dICbJlMK?Va{N{^e7i diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem b/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem deleted file mode 100644 index c9459dc..0000000 --- a/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem +++ /dev/null @@ -1,4325 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -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" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -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" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -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" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------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: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -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+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes -# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes -# Label: "EC-ACC" -# Serial: -23701579247955709139626555126524820479 -# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 -# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 -# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB -8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy -dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 -YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 -dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh -IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD -LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG -EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g -KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD -ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu -bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg -ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R -85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm -4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV -HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd -QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t -lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB -o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 -opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo -dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW -ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN -AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y -/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k -SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy -Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS -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" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -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" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -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" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign Root CA - G1" -# Serial: 235931866688319308814040 -# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac -# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c -# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign ECC Root CA - G3" -# Serial: 287880440101571086945156 -# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 -# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 -# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Label: "emSign Root CA - C1" -# Serial: 825510296613316004955058 -# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 -# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 -# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Label: "emSign ECC Root CA - C3" -# Serial: 582948710642506000014504 -# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 -# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 -# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Label: "Hongkong Post Root CA 3" -# Serial: 46170865288971385588281144162979347873371282084 -# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 -# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 -# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 ------BEGIN CERTIFICATE----- -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 -mpv0 ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G4" -# Serial: 289383649854506086828220374796556676440 -# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 -# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 -# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw -gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL -Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg -MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw -BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 -MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 -c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ -bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ -2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E -T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j -5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM -C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T -DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX -wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A -2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm -nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 -dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl -N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj -c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS -5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS -Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr -hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ -B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI -AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw -H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ -b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk -2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol -IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk -5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY -n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== ------END CERTIFICATE----- - -# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft ECC Root Certificate Authority 2017" -# Serial: 136839042543790627607696632466672567020 -# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 -# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 -# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 ------BEGIN CERTIFICATE----- -MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD -VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw -MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV -UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy -b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR -ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb -hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 -FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV -L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB -iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= ------END CERTIFICATE----- - -# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft RSA Root Certificate Authority 2017" -# Serial: 40975477897264996090493496164228220339 -# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 -# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 -# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 ------BEGIN CERTIFICATE----- -MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl -MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw -NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG -EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N -aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ -Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 -ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 -HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm -gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ -jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc -aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG -YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 -W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K -UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH -+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q -W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC -LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC -gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 -tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh -SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 -TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 -pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR -xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp -GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 -dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN -AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB -RA+GsCyRxj3qrg+E ------END CERTIFICATE----- - -# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Label: "e-Szigno Root CA 2017" -# Serial: 411379200276854331539784714 -# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 -# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 -# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 ------BEGIN CERTIFICATE----- -MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV -BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk -LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv -b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ -BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg -THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v -IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv -xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H -Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB -eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo -jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ -+efcMQ== ------END CERTIFICATE----- - -# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Label: "certSIGN Root CA G2" -# Serial: 313609486401300475190 -# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 -# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 -# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV -BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g -Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ -BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ -R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF -dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw -vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ -uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp -n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs -cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW -xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P -rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF -DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx -DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy -LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C -eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ -d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq -kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl -qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 -OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c -NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk -ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO -pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj -03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk -PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE -1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX -QRBdJ3NghVdJIgc= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global Certification Authority" -# Serial: 1846098327275375458322922162 -# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e -# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 -# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 ------BEGIN CERTIFICATE----- -MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw -CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x -ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 -c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx -OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI -SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI -b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn -swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu -7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 -1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW -80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP -JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l -RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw -hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 -coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc -BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n -twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud -DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W -0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe -uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q -lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB -aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE -sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT -MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe -qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh -VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 -h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 -EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK -yeC2nOnOcXHebD8WpHk= ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P256 Certification Authority" -# Serial: 4151900041497450638097112925 -# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 -# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf -# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 ------BEGIN CERTIFICATE----- -MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG -SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN -FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w -DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw -CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh -DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 ------END CERTIFICATE----- - -# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. -# Label: "Trustwave Global ECC P384 Certification Authority" -# Serial: 2704997926503831671788816187 -# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 -# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 -# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 ------BEGIN CERTIFICATE----- -MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB -BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ -j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF -1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G -A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 -AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC -MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu -Sw== ------END CERTIFICATE----- - -# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Label: "NAVER Global Root Certification Authority" -# Serial: 9013692873798656336226253319739695165984492813 -# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b -# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 -# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 ------BEGIN CERTIFICATE----- -MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM -BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG -T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx -CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD -b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA -iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH -38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE -HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz -kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP -szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq -vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf -nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG -YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo -0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a -CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K -AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I -36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN -qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj -cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm -+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL -hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe -lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 -p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 -piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR -LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX -5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO -dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul -9XXeifdy ------END CERTIFICATE----- diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/core.py b/venv/Lib/site-packages/pip/_vendor/certifi/core.py deleted file mode 100644 index b8140cf..0000000 --- a/venv/Lib/site-packages/pip/_vendor/certifi/core.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem or its contents. -""" -import os - - -class _PipPatchedCertificate(Exception): - pass - - -try: - # Return a certificate file on disk for a standalone pip zipapp running in - # an isolated build environment to use. Passing --cert to the standalone - # pip does not work since requests calls where() unconditionally on import. - _PIP_STANDALONE_CERT = os.environ.get("_PIP_STANDALONE_CERT") - if _PIP_STANDALONE_CERT: - def where(): - return _PIP_STANDALONE_CERT - raise _PipPatchedCertificate() - - from importlib.resources import path as get_path, read_text - - _CACERT_CTX = None - _CACERT_PATH = None - - def where(): - # This is slightly terrible, but we want to delay extracting the file - # in cases where we're inside of a zipimport situation until someone - # actually calls where(), but we don't want to re-extract the file - # on every call of where(), so we'll do it once then store it in a - # global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you to - # manage the cleanup of this file, so it doesn't actually return a - # path, it returns a context manager that will give you the path - # when you enter it and will do any cleanup when you leave it. In - # the common case of not needing a temporary file, it will just - # return the file system location and the __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem") - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - - return _CACERT_PATH - -except _PipPatchedCertificate: - pass - -except ImportError: - # 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: - 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(): - f = os.path.dirname(__file__) - - return os.path.join(f, "cacert.pem") - - -def contents(): - return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py b/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py deleted file mode 100644 index 80ad254..0000000 --- a/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py +++ /dev/null @@ -1,83 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# 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 .universaldetector import UniversalDetector -from .enums import InputState -from .version import __version__, VERSION - - -__all__ = ['UniversalDetector', 'detect', 'detect_all', '__version__', 'VERSION'] - - -def detect(byte_str): - """ - Detect the encoding of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - """ - 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) - detector = UniversalDetector() - detector.feed(byte_str) - return detector.close() - - -def detect_all(byte_str): - """ - Detect all the possible encodings of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - """ - 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) - - detector = UniversalDetector() - detector.feed(byte_str) - detector.close() - - 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() - # 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 len(results) > 0: - return sorted(results, key=lambda result: -result['confidence']) - - return [detector.result] diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 8b76e194f1e7e40d75c69aca0e15ea7fe7a6167a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1898 zcmd5-OK&4Z5bmCr#}g-;WS3pSL(CCNBtk++AzDQ|Vi8LufpvC)k=gOs)0s>%uXMMQ zbr@d=SN;J)Hk>%}EBFI@YH{PVXKpK@rMf5HB%C=gQdd`X*Q>j~stM-j9R%M=@>cMB z1ED{qaQ)Lj_z(u$0urJSCn&`p#*)_(E!90;@p@vUre~&>XJHhf(D)g9wa^T$?~!MR zwa|vS9@aak={&>Ws)@zY!z?}}lm*Ea;bg#b3X4uVD~7zo15TQnnDc$95$Boji`t{s zgHC&Iw`o$Dm9Ro(CY);agCwB_Y)})(Kn9t8Qe7^70)uS>;iyC$Uuf)I#c9C3&GisZ z3~rX_0#ES;{tjn0$5I+2Ze5@;F7c#RqA466ID3lVFxvSqjtgIP0+$~Wmt=!HjI+qi z50o6iAv3o>;>2Z~!p54TOg4&u2C3TcVPiwOarePNrAkhQ;EA|Acgd3=jWe=VnekCk z>0DX4y`D5;y`G!XOCg{%81;I}=J|WACk5Ov3EjMZ1dPgU=7&imX|GJ)aig4XxZjSO zb>YM;&KM6M4^e-qAxsra)c3(di_)A5>ma9Tz=a``t6s-AAS4v#Ajz40Nn6^;jD=l2 zS5ALL^ftW3^FeE)8J4bcy9L*hT^l5~~8pw?;^vzdez0@c3Q@OuzY|zK0espVW zNIF@ZqOn<;lci9bV)_$kEGv3@a;G#)W2%9kHhHB4ZRJ5fx*O_0>Jq6ZkNLe)yTG9V zKA-YeORXx(u=a!2k+D`H3^=yWf4h!jC?$p6B4;e_Cs&{bto(0KO>KCUb311F>iYWo zA2fAg&uULNgFHKkLs>z>PJ%2N0!p5N{>{c9n}lo*9T-eD!V)^%3Yt@;y-V-Hioz%~ zCW{g_Ot=y&atC&WeLo4(ei&?i0n%SE(D@rz{b=oek`ID}Z30uNfhYZ#jGC{}I_Odv zlg>#3%@@&mNfsoLS{LowQ4+G|( z#hI__-J5H7_WUo~yZ+8cp9>uV2rDQGC^>o$@)3GMGGVctLYtv0u+p^X5=>N9oTydT z$2_Y_k-iD5-m;4NGJBcHzb=@{8eE0J)`8q8Tum0Ptu?R#^MWj6T^6;CwHJnFU=4WV zZ^vxlMNN6xZ93l4aQ4rcbs=@ro=LJ{%GAY*+T}0j>SrQqzWlrRzG@T7*|juf6Qh@4 VNb_)*kWIOy@YKK%UWYET{12E$|4;w` diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc deleted file mode 100644 index a415b655b083660ef29649b99b44a89ba82957f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27177 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 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc deleted file mode 100644 index e89621a76bd0b79adfe6e7a39a6f47ad2dae6c85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6218 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 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc deleted file mode 100644 index 9f2265ef8eac3d14101cfed76103400aa45d9bc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2259 zcmbtVOK%)S5bo}I?Cg5iF~&(u0L4K(G6*7(3l9YX%1cCIgJQ#Bw5YY-ZclbS`*8QH zB`;$xv6Kr)9QXnDF_-+HxgkzDapwYG^{j~4~I!f>AY&_{;duqDFA>!Sc?B$QfBboN|PTC!6X(!#D?(FK(ZYS$+c5FY_ zA7W~|n`+yc^d}vOH8nP!9ulN+lpj0srjD{zsP7{RqGOQwR7NEq!G~Ha~q-oKvbHtX2y#n?g z$dbnRBHV3opGO#%_-yqI$K7S8ye5Ol^IIUh1_lqAT`kxlC$B4wd?0Bc){*3P>^bYo z#Z>3AHy&;El^*qU*`)ly8#zK&pK@n=W$p``FW`!g=q^{@B6QaJe0KQ^Yfm2c|BN;( zxN>f`IS;vvs1~L`n7Ih`Wh+-P_bKRQE6)Pc@j<65m4HO#!um4=3Lk*;)4nK#UD^o? zG2nKU#zTPTi0^xaXRku{a&O>o3v<7qN)AZF7~=h!KthlR+7V$#2uKPESORu+B|ah8 z)v>Rxylrkm+I9L(oQ_k_4gB_9heQX;xZ!|jmSJV-Z)vRz0iulVKKQPETYkM!B|DUs z`Xm~L8^ZR34f)L-2i(}NU>a@i<*4S|m{)Otd4rhC{EPIzhPkgm_FXXM;3@!DF_#*U zBgix^f=9f`XBW?a2AO#Z64ZaFs$9T-gFpeND$V&oAXqDkBXp#B(B4u&vhwzYt5F1a z5Fj}ZT@r5WTra#qXg4TWhmrE3)sF;cG=JDQV*9k8Rsvc9EfoHdk6IChzs=0`!bg(P zDWs1#&@b$-%ER5bF%H}5vwOeKR-XNNGyQRe#DkkDjCIef^^RQ|jq|mt1I*4t#s5Wt zt$hwXZdQS%9GOeR-Xuot;zS<9Y@7nyWuWxtG&NLp4)=zT9S2ouQi77Y>*;if%Ua?) z@ujp;$$Ss8?}ITUhx!bWKbI+qOGsnHFMz5ZgsQ%BM(R#CjTr4@fxbM{Gw|hUNI4v< zX-0BW%AIL9t5#flcP+1s&<^p@%J(Y2$R$I-sw%rR{{;1PmPvU6fUbMG#z~dA26Bxv z;)`Lk0R+~FqVujVx8tA;G`@b;6+_aR_o8_trf-DXcjEYeL0(2TDi^+>09(4O$(!Ck DD`V+Z diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc deleted file mode 100644 index cb52558fac9a64f41380f5a3378853990abfb879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3481 zcmai1UvFDU6`#3(9LIIqZo2KV*#!m`#G2g%5E2qm>9(X{TPX^t2|{vRZmvCJ`!?72 zI&;S{uDS+n@^CYO$MV`tztUCzE{(v$uxCVl0-beq29 zJFHQ8i&Jd-El1zrdHpv!ZAVFO$Am_8Xz6@&F}aUlmY`D%>{-*1yy?o@(v{vT-h=>I zdBvK(s>lUdeZ^k#=7L<5HPEV{U6XZ7Ta-)kI%qX@P2P|eJ%?VF8(hVo~G8K3A z0tCHbdI_KZ^f%XAQXQ%|9kzx#?dfnZ0HfA$Z2D;u^di&h5tnQjc2w(7C5NpzYPYh; zs8x{m!=B1o!)VwFuqIR8>cDKNjQwWHfG5mf8;(hzD2YrE{D6$Dpkus(zoR>Io?4r2 z>(C|78jZ+2ch9=@?^gFaC3KaWB2j)*P3L!;hMHvV~g%O?eevP za$jPY+56x}x8}95>+h*RYFHI0j7!l4-w!~#D5g%{fFOGlKPsg;M=SHv&To4!K>ml& zhGVVE-S((^QMT7rO8&Hz$&Z%jWzzE129ob4?0M;3ZoR25Gt##K`Lj}zbJ3S}{c2Ix zmxOL-y9Xw=UG38Ai1473Cf!J?q@&iceRhSP&Ko$t@jdwzH1;l+F)-|uOXQykd+i>> zaA@OhXH~3x{*h**6*r*^);_)xA zGb2NpbDbZ3Hm~TVC+74eUFk-wzAX$4d&!Qu;ipJw(Ahb5CeB0l?EbMk;ivAzrA+!K z=VSJobA}n_G&}Yt-l_MRWm^+ZdizXoNgp&ifjq<6!JUcCvZJ2^6g4qzzf(f0Zj>lt z`dXnM4^<}8t|05O^>SYr5Bp(TnRTI(UL0k8F{5PSX}EgyV72+I+#DsyTS;i5GzsH% zF*g+ihp>YUIQZ9-)xZ7a?A##K`$|K^q0&fENL50`nG#QbUr3m4FXim^6_^i4MgSsR zr9~%9M4L=WN4>rgCKU)K6Gn*$MW%FAnD!#oGK1N1G(e`4CA;=m6dGh}Vz(bz%#29k*DI`F6A!?I)Qftfbd*8AgAoP2_5M_k zl3l2k&}tYXPfJ`4nFH^{O4!sb!mJZTXP#ZFl?Mwu>_Z~L;V>o_zz#AX>*#1`GV!7x zb^1c4B1w%H!QGqF8$P?KwUS@e0g)%6OI}fbFnD6}g($Oe)$lF;@@nC5C3D~UJNM|*T#Vt}fb_eF z(3L6P=DZ%*v%iGI><&71qvBV%^Uiate7RERH@U~_&e7+W0{0R|bLb`HmgxO6CIxyW zKX#;Z>>9lE6O*O7|mXG3!r!VAaugX@643%*X7JtN`=ATmXt!CjO}l zRIlKiyYK0fiIbfG)x-(NF7p5=vT8Ge<$mlQtYGKqY^Pj2+ll;F3;&LkSKjIqWkx#5 z5LTUZI41b-?EzAIdqsR}MHoV0BH4k0s5>94({L%7%@TtM6DcTD+FWuLom0?INK?ci zsk~4s5qIyM+j16g58^CE=obpiBJ=-?hz0{CBh*syxKymIx+#RFoz6(>5^DFZK+80j z6rhopgJzap+NtT!U{i`agOBw@5#fOEgPo1XkI&iqC9;LA20pfq1{4YFCBMDB zEu_@sCq>b@w|C~FUuk;3G!;7*Z})6}cUOOt$b`LZ0P0)#qBcThi8n4*iT)0)3UrN1 z@!EYC<7OpF0u%OfZ>ZH_?vYZ>DuUrsxP3B(+l$EbgXzl<#L7^5r}sW1maJX@!aV0D z{;DVntK4&MI(2v1sqvcY;d|7$6nmF(ZJd}iYDp|6kZXj zKOs8hJWciFxokrPwx)7Z)64%Eei=Eq>Ud7gueuH_JJ)-df6w7|FT72)N09-2m5c^i fQQcP3_H)%ScGG2&^6K5f-g|Vfw#u&ZDjfM=WHEpp diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc deleted file mode 100644 index 9192be8e033d165e1bce2cd0843ec87608cbaf5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2908 zcmb7GO>YxN7@pnr$Hs9C1zJdH)#;_eDp*K8Afc*-0_~-wRf0IIEUhLxV|&AT*UXF! zLE!|yp=UVqm-gBdf1#K5d1t*zoVb;`(M)!}p7)vO{aA~wtq#NUJo`$tdW`)^gVRp~ zgL`P^20F>4m$8URUj~^s^&{V7zcAU5&9_W8Rq!T=8q(Wi{nkh9W;-7}^nI`FJ{HL& z&DEY2RwcA_`Ux<&hh`q4Q!Mf%i+t%t0hxKr0O<@wP1%xdj9W648~ERr9l44Bq1upL zx%HO4@uH6G!Tg2t(t|>#`Pdm;8W(@yE**~NJ~u>!Pb*g37JQ*}Iy&Tn?;m2psONK) zCyI{>jk%f7HcjT4&>XW4c)))yv;$KBsZQC6;!@#)7N@jIRJu^+CQmJYk!BemDJ8j` z2)o=}a0RQdnOJOeSgW+eLZq44&(uv`Pq+`cd{ zT;w#(XId@NVs4fvMNX8K*dSW7cIaAhf%e@A7NB$3U$yG4L>r3{maWptSdvs=>)aN% zYDw;P9MImA`@2snh`YE$3QXfTRH!(J7fqVk2`*0hXKF06RnIsm^5yY!BOO2#!51P+ zC5M+3pB3QKcTR*f8bT}0C&KW3r67k?xlKo@l7oub<3}~EC9hnj3F3t4L3h$=_2wrC zu)7jCXX!Zr+|$fd0+R{pLwH2XC`&PdRjEum&fzQSp!?VK(cPg$ZOe+;aHfl~7Sk!N;Y&c72!x(F_&_kk$pc+=C*O6S7?!oMksHJ&o*7C3Gy}Ew> zOE9QUBqUS)&^u}GbSD_g4oF+5y~jRyJN-bDTgs-ZU^>M62T$XhSzX)RU0e?C#PQ4Ys)0g(x?-LA;*a5u04gYVm*FHv`^$&t)zP>FniW_b{z`Bpd;wJ5I zbB%3w1+!P#>%fhhSf_o6pCi^_2MyV}gR43O`dYVlqRk`|#>AFBH!gUhUL73OWYn#8 zj8H`j9c?-a`v2$$!eC;y0Y*4--z?`b;JrFfYXd#8wf`)|b7ocllQ!VEt(=EzjNO>(W_r>|q-=`j_5Z6ekvJN-?)iM?ef zriwMssM2)f`1xF9%evE!V_76|tUn=xlw$fb>aJ4vIl3}Lv6(4t51r{#EtM_9`-=1rUl2AK3H@&H E51^0=oy0XU6u-_?ypsX=#zbI8smfyAB~g(P)nVjQ23jHV8ok zRivN^rKo$#EBwTFy03yFOhTszDk?fjhmuc3gd#d4B9h_EPh!y-l3x6aLZ}{X9`AhX z?|$9Rjn(;RV)Lr}P;xajxq-#iekJm9Jha@(0nZNeQiAv4V4`gPacX7%kn5qe`??xQ z4J*t2{jJR{HXN|Qm+hU;8Kk&1{42|Bf+9&m1xdVfazF(Y-dUXZG7!E9&d7`=A?U7d z(4%t_kOb@QG!)KeWph0kFcR0v(Bi+)T`9<<=w zxW3|FI3kvPJd4Z|6!7u(n$R89E8x;y6i##E9+*uR3xSKX63Tx89)lne@8nTCXM5BC z<&AbLEqVFx#IfS#cmlY*Y9+mO(d!Mp82gI#G1e?HR#al5Q13E!G~sH#;-G6{fD+hX zr}{pG)oUP{rK?6}QYm1@4FJoy1yOM1c?OEXCmqvn>;do|b$;a7ifdPkH*+ej&Z%Ya xsTK35=7`taEk;+6&0DLnB~1ig12jZhy3nm!ZaNabnP2ej6D$aM(53G4{{YUB6G{L8 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc deleted file mode 100644 index 8dd78dae49bb62b279c719a048b0557e3830a04e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2646 zcmbtW+iu%N5G8e?D8^147bsA)X!fB6Dj?NEAKjp^F0{i~rVNn|8bSa?bJr3Rid1$< z2Nuw$Oil?W0jDe@ zvmksCj9Jq#_JTZ{qAdyqZcQiQ5yB1MX)0LzAmS@f zOz~8>e~GGInU=f?Eqhg3@ibb6^J;}*C9^zpvLIt~#~{$$NhAn^lM~KnoC%g>cn3yk zbbih_m_*=oK?0H|(FNlohzZ<*g;~l;2&X<{BubicwFMkOS>TBlB~W&wR_MN;1XJew zh2i_tl;$z^w|xI)9>lAWn(xyz#3?7I1JiFg9m^`}rqfw>A6tiy{q{50{8iywu&`8r zjLf|uWfv??XTup!$2^!$qhvgsU4ly!e;j4QF>Wou-E4Tll8a#+oef2lvF}$A5W`tC z8~QLtQ$AdUXNdj~&DkZ#o9G|{m9AFG6}6(uryF6w`|jh^N1#3&2CqgnPp37n&MK_h zRy>0lOlvEw2K_r!hcMNPyS*S8=Kzp{D9#w4KmXWJ0bt~NC>h-+Z>ZPI# zkFG+!>}}(IcR}3;5xbxuBoz$F`lqXMd?PrYk|SFuJUs&#EwkkCV_p9?O8|*yY$G!` z;^WG>kQp~Rvfedav*TL!VWA)NPwlR6xrJu;UH{m;(H)<|vIOK^gyPfx=Y-=RoJ0v* zI>G*ACrEFQ>2i_xS>hvoQFYwbz%8ogV9+0Un&mnla>5sI-NuF!@acvV5Z?PZ^&zO+ z(v;~`qqR56Yt^f-(sI{fFLRcJtQWmtaWqL&I{*20*TipUVwDI8GE5LcPLuOAj?-6w zGs(6X19E2ss0`r< zyI(s?2#h{Xc?7f`CGr4Bc};!~mXR=Ps6{!9#Wl!b@)f&dmiaK#zgpl&+#bQLl;_`W zI;gq%hTSl3#J+Buhb`B7YI^#q-LsC&-ZM{I{p%-v2RP)ZS=I8hUacM0^A4He4*}8$7KS_dDxoc9#CUod0$^ z9IlG$l>^CJ(uV5DVgbnDa+T4@0eHl$eVH-bNw5s5iSf~hKo!5j5(Y6#;bQ`E(@LQF zA*^C1|Al)m{z3IOs=rYE3CeENZ;VzQ z$jLka*6(^o5B~f%(D{+4InR#U{hn9tT8EYke7@ZK#vl<`z6ByMZV)7GP2(I#?1nCj vOQEG_&*5uBmR(8j9O;c?ddpbK**9%a=#Q2k96w=n!J=UEH&$mh4dQD;bI!!C9eOISI^cfPYbS0Z zHe9doN20E$)#q;18@WBP?gxpGX&LorYH4|@s20_YwDiPb?G3iExz>1|)|&0j`=8yv zzuLMkd%AU9_H27D^WctG8afAC{0$I69LkBKaq8%N;U(!(u5;t0;24TWqb(;VOrGb~ z2|1=t9{2(;D&FEHUOpjCfme7H#^Ot25T^vLSxgrjv3JESWKwLNV@IsF-s)*}IYz?c`fam?5``I|Q$bhtPW!C=?{1ofmF zhJcsO@G$8QBG&VhPR|YD3PaZuodXdabOL|36Z?ty6htrJxVSU)haCoUd>}h`FSuj} z-~{_Yey2G}d%{*9{dD_G3F>8n@bfiMmQ($I@ zI@K_S81psq-SQEg(D?5D5{Ho)6PnHLFC{tDI0g(dQ$;_os5OoKPQ4&2u&Ii*Tt*Jc zCIlyoN2&)Rl1nJQiR2cLx+ZTUk9zVQBxtI5>p%BxpwGf&Hr<@ zv|+nCRp!fkz-K03oNdhj*}Qb_^#ISb{`*Yy8`>+2oVMXff{sb5w|cK0|1n;A_19ND z&`?dj55vFSrrHw;q*2tx%H@d-&{K{i5CTIRzjw_aSM{$Hv>YtPuA=c9FcS)J`{hW( zTLSmfkv`F7b)xSf{9ruQCfXT2GA2f%?-?&N*#}7K3;<}5y&Ts*CmLZ0${g2UQ2A?O z?&SfT7Dx&j1Ri^vz)rZn2YeB^w>amWdY6*+i_8~aqA12Esti?Xi7p%e0L89yJOBUy diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc deleted file mode 100644 index ba3b0606dc77f18314eaf9ad2f0bf674cddcadaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7080 zcmeHLOK;Oa5Vljtd8hBvLlt`9&>Vsw+z>*25Rtx7lGDnPG1*NTaGYSLmD*pxkKhmR zkC3mN{0l(sg&D_o9OJffRW(vctX=OsJu{yDva*uPr8)S0Ri7&PBFFtg!vCuRu?fTY zIm2<3qrA#>dBXD?jgc7RKhMArD9-*NAU9;hffqJhUE2q>DT;am7411r;|_Ny6DVA^ zWHh6`KL&5zdO<{*APE)&Zz4<3Bu&xucabD%hNRHSjvqaFHi5PM6yV)-56dga^X!Mw z2Rzyt`+1PHoxh)V&H5kPTl8jHniA^G;Q=be816`u3_|wY-dOSqCd| z9qsuWzJJ$iXuXEr;b!jMJrAy}b9bNUm)~ZCx~`7h8?7qI(>XHBa&(^M*(_b4i*_%~ z(Iqku+Tm66KhwW*PF8)O0Yz#^N6j#^-gbeXQ$aWBy) zb*{K-@vz5>yqP^znkOBN)d$LeZE(QVQDVX1bU=W~O&G>xBbaFVkNx46;J#lg4l66> zl6L=1Cubv03-Qo}uxQ-~_JW+I6Wtu|^n$l%vQdP9}snT|E83VaFj0ch44=yJr zo{Wb-4^p*90Oxl9O(#yD)?gAfD5fH9R4WAtbCKDtAD7B6%H`6|(eQM8KPWnCfje&O zC@5-$fn^x)jQFF3H5;w8~1Cb zxZl&6q8$~N%{bFeyM~V6wuo3I^3FlsjMp1mwT2n5)N03|yxXYDhZPbBX}v+_QK`CB zlMgCKa${@zpkiiFaws1jzpEUO9GqwIIJ^i*YU*Wh`^H<+?9;aP!S=L`G_T!l*^CB$O9cU_5zp&T{V`862pe}v3+ VI;eqqaQzmt;aUaMxDt}%(!ZWfj!Xam diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc deleted file mode 100644 index 0f630675f08bc2d9f5a11b3745f39402015cfbc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2445 zcma(T%WfMtkmNqJlGn20#EBggtphX%0ZouYQ4~c`G?mpn5X*+894e?_*CHjay}OdR zR1gcw$u4s3C)kG`a_#5v*q(ChxtDZ?YsYen09~2G89ru)^K`VhSRwEoCZ9#WRSEeM ziTTe3;yW1m&j17wG$ASN(v)=>MVci}>ULd=JBgS2UEktvQc8nvU~w-grbtwy_XHf-xiOA~HJ{k=Goma0>8b90jD z`1>O*8+(yzOO2Vl+Z%DNRlGaV@hE$gMafYf=dgLhZZ<}l zmap{OdeyG;_9oxl+GsxSgJM@c=bXy70g?G(q7I%aTxGO#33IBu~ z)2@O?v2%GsG>9l*Y(CndT*5RVXS+@D3v@PM}66QDYKWoB;M`iv6lB>=^z@)yf=== zJq~+fqkI&4)75#2^N0SIU=uux#!&`7 z{aU^(9yj zE&tjXdF{@aV6gK046=F+(rN#ia312ke0m+JnR^D65U?BbG{`7UfQG_ZB?xbkUy#H6 z`H$?vZ7SSzY0OGn0ZnfnuwSWqU^(A9BL#lCdWO>14qT)!-UBNu5FK7?dgpGw4u3^H ztnbBo9TIk=)+4>X3k4MR-l4@6hSt0H@YQca;)2(taT1xSMOZhL3~D3Ku^1~XJH~77 z>}>5AKN$^&QW;Ok-N{hhLPl!{(3!?>ZFTr&)A+?r<3H`Rkq&;?dePe8PdmnIcOLC@ z%=IAzXMduU%wUFK1;M7mp;Q#4%_8Ftq!bF86o|K~nDR!m(`|~2DOHDyU&F{B0wA=;YPPOa-n%TIzQqw@t*O!)U1qD4!5%{2sj?~!X^3apv^JlF z_{1y8ht|enGvQM}z_a9(LS$luGm9~8GvSzBRv}wPsDF2uGURL7ZVPTVRv76-BnQ9ma#n1T%)Adr@ diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc deleted file mode 100644 index 43fa3ea6c1c5909164a53a92ab44996a3bf6dd35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12061 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 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc deleted file mode 100644 index 8c3cb1de6c924304bcd645061fa6825575ddb540..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1140 zcma)5OKTKC5bmDWPS#C~A&P<^=xM>^l#__4o8TdClq_C`fu?u5vl-I!NOx~wm)tgx zzY&l5Kc435$-m&qs@{Z55Wya%=Ig4SdVE#QS690P)~R~Ie?)}*#7%nzuz3%!*##kp zpo$bUp%k&Fyuwd>hkX?kVG=qVsHo^99ZEhC5sK)7h)B|fpTwdwBK`Om1y_CAJQ+@v z%|Fhp92|2!lJ={v#!`c2V^E2_oQy2Da>%peyp*7Qw)btYf4G|)tMl>H=2iKj!o7mRV+4#O*?i0q`}iL0DqxIazpD-giQY^=+_#JqvBLAn@&+ldBjlf`DUs z&|hgnGp(i8&;ruLjOAr+8Pn)chp1c093{*Y8e7sl7A+naMNg#7!UF&+rw&7Zb|wh#SR z;3nFywB+T#1ILP&lPM6h)e3sA(%S?57#oZEG1hb$D=INnh?$)ah}^9v0&p3YNXnNK&)0 y94&*ltytbRH+apuYj11LmZKMe7Xx#MbLm{Sa=GhB{B~L3yXTk?4nmK*$NvLRtQE%q diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc deleted file mode 100644 index bc8c6cf336bc169233a1b196ed4823ec4f46f945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27181 zcmYk^b<|gNvjuQcLK*}_8bLrp>5%U3Zpnvkqy(f}x*G(fySoG>q!gq>I0_hu1?oMY z-@Sia*Luf^J$v@d_dKHLdfOyS7(ZJ0N3X6K+Ke6?E!us-|NkR;7?ckG*C$D6+C^&` ztzGn{(c8sn8lzpzdeL&k>KJCjKOUEgiuOjdXxW)SOH|xAp}7}34F40(;hhYX(c{E#$ih2A{8ntG#n>%u*PFdr@W ziYbQbi*Q`j)KGZTMAcGqp9-fjB_agjazQm6x0od$Hx23ZTrq}=co`Je4_ffjoPXfA!CLar^$_Jx0hiq zcoo4}aAsHyrU(bwV@T))=Y)L;%FNq9U;B_WC@pNRZ5Gml_SkLs9=!`xPYOqaj9@B; zH;9@ITmwrT!z;thCT))4wT1mdaPW-Rf%=Dz69;5nxK>no%hb2@Z%CJ_R+OuW^a#=l zdgr-DEmYftdF}g+Y9HaRq~)jdgD?#8$<4Rr7+yAms)O7z<2kQZNFQuhy{}rygDw=l z2~xwf&Aho5EJf~{q`eN@+VB{v6`d)k>KU)lk#{J}1x-=SuvRf`b3$+saz=}qfS{TM ze}PLOH;T8DmjdZ_hn;8c4Pk2pw|pfTc$1ipp6pE>aVf|c@&&zwQz`hES>zhO%GGws z6>v%Mt@8@sfviTADf}Fx=7-aQejzvrf5OAB9WE!ONkRUw@0$oVqFMm_G2CscjskxX z@&&Wy+6%u7uMt!dwzTSRE`BEj2h-&K@iGl~<;?h=ma=Bt0-kQ^e5d{Y%HXWQzJu>Axg_S^<|XrPuQ5e@O>c$0!Mg~uhNMx=sGlg@OmlM`U-@Wu z82*KgG7z*9q_I7+o3V?GOLC{NycbRjjtMh{;Hb)`ZMNVRCbPH9gyjd2cg)63tM!{AcwGdP?Z6O6|RXfPNAF2u-U>PnvOX(#_mqd({yvEC?qi6^TehR@sR~@&s_m?gYSRcE++aOZr9HB|ShE;si~c#*2O} znNe<#m7wjy9n9C3$p|tW%S*i(c~y*j#N;RUl*7(cO@gI&=mp`h@aNJBzZyP6+bh!c zhlQY<>T?92MGoOTcDVRI%tu&`koy&ai&k9?x09+hyyr-NMw(S`HX9vB8edx+1Z&|w zXO;<5dBMLxc7=0;Y`k@<@90?1O9S_g8!W*5r?ck?aluyL4Mrxl>IUG-Hs2U}!PQ8W z@Jp1w9kK*jX!-+OxuKSGtZEwfei10CB?)l(=YSD4&yn9EL*M%!CVQ8OMJIh2>$Cwf)kg>V9@ zhH|yh*Tv)Winhhx$UGqbmvua^Hq1q#llwr zSzS-I%0Oy(mTX&!e_uU zu{5ALJ5}E^1#Q_xZ)aLw>F6rAlgNJBlB?zb-mNz$?_H)La6-aM=sio-7{V_YbWGcE z;WheJAuXUVRw0uPe@7a%9;CipE=oUwyRPFqrhQll!me;jyL|&(l~)^XBYl0yD2Ta? zTtg!BQq{$bb5!jFNdnSUE|Y2TfKT(vDC~C0)^giG{?V~16cnsByo}sR)qfS@l98I( zPr)7|A34bw(l*;;55C88dwB=L-ryms8d!E=8I53phuVz(4OBNQ-AHvfRTF`C3;Qw) zfrH2cgw7ac!FE+iZV_sqNP zfh)>9QB9`smcj_$zh*3_>Igxf2-hPRuKIq63oeFt2|je3#BjgSx6cYkb!@U_54kg{ zjTLekREJ2vfCMA-9s^$NLZ2A^I`b`6*OFbvxAI+F1&syL{g(DII4KH)N(r-Zv`nZa0=0C%P33-sN1e<{pz@nZHk#p^(1 zd~#324FM?_hQW1w2Mu}??vB@LO8o^&5Ac3Rx`jETcd{OB)r(_Z3_f zq)nJ-4*QFd&G0ogBQrsF-6fv6XLX!XIIQro1<%PnMUV?*E3XT0nQ2d)Bsb>cIyRtB zj^JN~-3ZDvvxxi&?hr^xkQN~4(dR;Xf%i4@0DXVe>e|YN;2_FI+2Bsf-BSI}VSg6> zF5IYE3G+oPKbZSwgh2I@+(DaX(ss|%KNHl?CI14xFSp!Um$e=CP#KZ7p*b<{0mvlP z{#feiy^MJ%NO8H@)R%XSD+(oe52$(%K{O9_RiQa8*%5prj7`DW2s4v041=kberV*k zAlE_@ERxGZ_|HcE5_&;Vxyston(;dY-)nosv@oaw`c<@?fx9HU>@FLCGYNl1nwP$d zH-0l)v?@rY^I&$*UIb^f9blddQxW-I$P(lyGOj{qXIib0Q&<;O zvd{z@KpxZF2u>93+AE4?*m1R^+u_~LNH(N4d9#1E#}Jzy|x(iMYqfj z1UYOpQZAnrR^S_l>bABYFyGbDO_4^6yPCtxfcjFhrPkD zup=m^tsdMfR4v_QwX=@`E{N)P9e*%oh4)lj=~#;NLmSl$3&D@5u4!v*-{l}*@K(9Y z>~Pg!FGzKVXsd0n^$&aLc$TTAcL36yOdDY()AEz{592qLqn4@uNl-G7_t6(Z`hxm= zkudavnx=gwT+O^rP&^&^4gZ?7V&?vfxw&dD=5JKfL54B8;ePcoq~%37JU_mDwEPHi zQQd+`l;c6xqWX}`%SfgK?k(8vh)kN20H$-%zvr}2`U|tAy-iDB1j4>%Xu#q zV(^{<=e5zh!a~3?d9OgyDEw~5CHhtZuOa-1;f39*DJ{t{e-HAvxkZEp;8MDMIk`Wu zq;QwNZS)AZE3*~2HNJn0{MC#b=1$@LE7t_>&yXNk6`mw`9=Qv?f@WOvP=n>xnHEjq z74L5yZz~kGRx~U%6dGFaJ#%{tM;dfVZjYzvC``^YWY(Hd1i^o_6y@atZc5}=HkyQa zFup7Z8b#R`w zzVNUauL)mZiNouw_Z9VVg`c}sJYGz>SV)g!$%o(%1o@0C=7{;_GCFadhz#miV$KJ5 zMIk<_bx6l4ycS9ePS|&*FsruMX51A1W8~{P5-fqU8|vt+Av~c!L>Z!40S; zYRhlSlnSYs;yQX8o?7@OlZGj*qY0|&n2S5z9^Q2<-!X5&#X+Ao^n&5ms&B#OyeCxc zvrIa;4-h;?(2##gH$ z)z{=&m>WxPR=GcD&f{sbMIgNVSPI&*EbuJeK!tZeZsFTb?oPwwAl()5KuX%E39pTZ z|B%V9ZLSqwca0pvoJ?9_a{H#TZ|qQ2aD-Qkf=v!q$nbq+w4^kyX)#S36FHd8v)l5d zLGL1c7cLe^Y~~|!b1B5rn@2|{ki10ZR(Q=d;ut>O@c3{IjeHHkMjZ)4K|v?gbEFN@ zn@4X-GDfQYqdHyqf!;rPPnqHr;g1dPX|2L=tKqJrFCuIS_W|>qpoR)XZN7(~ zLX6-1imDQh3DF)nL@B3I1 zAxO-W)!|6Ix*4t&WGB2ezPgc- zdYgEUq)4k!aKo*>hf6^28jwPU??d0tz9o_Vgy6c4_Hw1uum_3w69AV=eF*s*({tRiOfwZgS&+OGj>? zx0vHBz?TGHe5Q%;s1ca~QVRWkgH~cmDOXv? z4{(z#^M-xrs@Bw&3S^UT64F|7wVBik6@7nQ5Y&+?iupijf^R6js_nLsf9dU~`lh!2 zyfnO*dQ(|-8@X@E)kRg0S%u({^@sXsqB&SexYu|1i0XOlM?Vh4j3K3bmM@m?2CC zh3({C#a9b+DPcn+TT}I?85!Z0s(ws!Tq_J<4y(RN=}XnpdNTokBV46g94>L_1?eL{ zhz6z6(a4M+;4X_v6qVa4w~J|~w<*5A@wFFj$FiTkZxu>gE0ebDre&tS1Kg#MFZhk1 zboRIgoJI9*rapp>aMi4z6l5JpR)tT)FleN=234KlViI}CpeW&f8+}d7P9`hT-J#~- zJ8dVmjZzrTi|OpGDIF~w$P{L}G1V#PjI;~0o{VDlE$O8*IoNenKZf97H~QB@NKlrS z!_r-~4WVzC!tV;Pj2vW{E!ytMMaiAFLJcE_8}zfyzgAdo#%`ut$QP{8(H(O?kX{7! zxAbX{i#lR6IVq@#uLp2XX1V)?sjy907(pJUxA0d>5477Q1SyD2qq@+Aen;OyIGHzs z$V0$=^kyPspcO9btz~XJ)eUfC74GSMm#W&To#C!9CC#1YOgou>(I3{EK2#7iA@>t3 zWqf*lP1^$3kC&CS*RX5^=`S~ux7tYtVaX>PppeV(qm5O*TX@<0bXu{;%nPOb6v~>QJsqnqQ0olr!Bs# z_}=lI=Ft{641*q6vdfi4P|<}-;p+5d`?C^RG*nv#I&ZWLns}}R5asVy$LMy$h1t3__1m}b91Ry zRH$w41T5X0WEe<%e8YL|>Fc9<1VK6ajuX^dTUxmTri}o8U12{+8-@G^HKjBwNNyuv zq51^)9_A@n3c!t&8^v4(DPy<2ywP%tTj%wS7{)D9`>MhM1uXh5| z&@)ct<)!MFwwnkFA#J2uMn_@C>4E;51+UXrn|V*$Bn0pCHksBPWOA4b{tmx`pbb;U z7m*KS3UE(U#So+ny z`yk8(FHn_GE$*S#;(LpN#J=&3kr#BA#-3uD>I%Jy!a{ILZ$X+{k+xFdw%r!%y+-|C zdav`Y@P_ieI4K>ymD5^MSV2kHsCXI+j*(%cGoqU6I7kj zy@vM-JN&EE@YhCdcWF7LxZolvNPE>UDXpP*D6g;u@6oc$wCLzRLr~s~>6ZQr^KR8W%wDDgs$w)h z#hlilnn;VwEyYp+K}F_I)$Cy|SZ4kCqEEN?%mJDA@F?(34V9Bi5D7Pyo|wo&~G!8+anZIvyZguYJ{Cc)jd zU>#v*EFSVRXu8jlX8jmjzHB- zp)}?sAyx3FxgT2LG=fhpcuGeSEOq7X@Xqk2gsOsqI=%qeu5g++7eRHK$3rl{w77|#s73Q0g*h z7Zkp8@r%M9cKcfHlCUMxxLAhT^0M3&<|;D?xQy4&<{SS;?ptOIf(JIbCcMscN03{` zZ>Bx4ejRJYq%TS#soY~%TSDJ==GF!I4naR_oiyl%a6Mc!xUv-7l=~LdLvsf*lT|O$ z(qHcYrYuM&%)JOYC0s(#aNrNfn29+j69rd~g3PM*dF4zisW*pQGJ`(C+(31t2fanh zYNQ_vZwpuIxDoONgFL_;xrREnDXcQ>uH1Q#T+ShKkk$*qDCQ_^@uk}VWYw@xYGpvL&gjW z?kbG+fy_~;Cw#_hOk{GsOXMD-x?*I&>!&w`Y6+y3Onl_mCpFul>Ll6vQ>UoNf zdB16kbe5qx6gTH(czASgp=Cy?Y0(S|vNrH~ny%=jDq z%g_X2f4EFo4RZ4?7@i!sGUis4#&*~{_I;t65c7D|S6D9NOJT-8!Yjgmc|#&!4lgIZ z4p`3FC=sfwaEY<3R4va$3x6v=Dh02)hiatbg=x_hlId-rErxI;ToMF-z`YF@c%FoC zsSLlOTGL%(>WIbEHN1=5AsrR4d=>d|(Hk4&HKqmyw;imWj(3w8#4MBG}7%W zVo4;NU}PJRp%h#dexaHjL1*`iizOcOF-SvHWy9W}S>!2PvXR_9-nYCD@x|9s1>Yzm z+ai5kZWxxWmKkiVYdR+Ay=&xCxl_EhScU_CAxxmRom@iRD10rf@QsdRHXm(J3E=i{ ziQt}sB<3Yy#(<30dpJ}OJhj3b!kX@vSnpVn>r{2X(vcYh@|czp%mKIWq>vP8GA22b zf;k<6gA$m>p=yjOJsIPLZ-8v_3H&3s+KCr2vyiqk=#Xk<7b*v`N-oN@2?*-THL~sLqgD3)5<=HpMrQ(yj=;6V_2^#_NK4l4>{A?o3_P9=x`M|7%(z(w61Xe z3$Cd06uhOHmPyC-q%S?M7cX|$7IeX~f#z;{r;s}eK{Y4I0Q`@KO6THlgkG>%$1lQ$ zv=s5(|DYoy@KU?=roJ@wjX-*v_9I9+ZIx7ahbCB#>ae*9<)+cx(zMaQU)bn=NFNk| z>#LBAs$x36<)wkkWbPQf-4*(nwv(#N3Qs_?@ZM%xIA>pwjh4Ljy%903F|B5G9wlR zF||#`k{9GX=8lf< zleu?IYbh)O@-O;qs7}Kr59bD>Jy{A0ijq4pa@g<&K?a4Ca^s!u9;!jAbt%}v3>MBX zcOu+zg0h>@%E)gG`he!5hR=lS>bg@*yMo}l$7_W-Bf0euv=(;Z-Gpm~Zzj20QSDL~ z3;dBnG0aopit|2TGO4}|TtfJd8AB*dr}saFk_zpFKLfvkpp;yDs!~~IDy8>ndBCIu znPr9Dst@JTTksbIL(!K;P=+bXoIsxk%g3s1bky?52^AhFKst~%(nj;)nkclx+@4t&$_;Xo zk=n=$)YmejGL})=vJiepTNb9ck(1=^VLoQ$LW91izKXWy!qTdv5sYDOqwj;@ZN0xS zwGFDnybx~DF_~9at~0)Ry!y;-r0+6c5!pa)Eary1y;L1_*y;}PJC;mvGt8|TQ57l; z3Rty~jz>CT`OF#%n=nn8eU9CXSCZTT7VJVx2M0T>Rtj>NRo5_Um< zhWf6&=&GOTSS{Dacd!8cWc1xYZVDIp37AAxceypdoAmZG@^PeKk13H`F{fZ0#J%L(RANDypt&RfD3=*Od<%B#ZkMOs4d->CWtKgZXf z_lc8yYSo{3J!~{h_!rZ~3b_=z@&@R5M`11Itv2eWuod$ZxJ67w(^@l=74AheM-Ik} z1euPdp7pB=Kf=7oz5{uKnC_U@QCdBGyx_Jid(u}6=}&sogv`M%g&Ft;YkTUY_ZhUp zNy-p85cn|j1A+!&F8D>;5FJCAkC}>2w_k5BxI3hMiElQRALXW7D~7^ia?{cBmIaT> zEpnG(sCx1i%RSLn7Qtu0J**X7INfJ49C$>eLm`8<+(tg2zPH{_RF|06%L={V?qbev z>F<#CmRkxk5_lP}kKAn1?g8ItX6hIPGMf3ypzM~;!|P*O4v^&t`XWe+-~qXb49}_h z6t17@KD}d5)sK8qay3v5)-hIL7JYqnj0Snf{qAX7%8Uc~8|f39j~7m0CNc|wel7wp4`Q66VD>(D13KUK4()Z6HX0ZQF$R z3HlUdfZQyCrU|Dr^WES_s~#}zU*1cC24S87GF!(RMxMo7QpYn?6U3>Nv}L zqPj}BfQ&>&ehl}yYC@W8nl?cN^AarUL%yJjeRpEn#f&w4H*cY3-qLoSf<#Eml5tRO4@d!FA2a6IW3Svk zWEBxIoJva?3!LGk*#Xp&F_8Fz*Pn zLiH%`81ovIm2yLLyidU@VGLn6%ak+nIPeLktC5S0Tx#Da9YaA*s+Lkc#ruMZWsgO6 zJ1rbVODEtn!V3thSnx~XSIlRIH`MW(8E54-c+hja(FoSid|ucR!5FyaJ5u7Ya4I)T5Z3YF%0QKW`e>XxoSincuR4Xdfxg%v(=9kvZXs|xE8Np@*|dia)|fX2?!H1%kgpwV zBbE%N9fy0M+5m1-WPRa8y`M&g3#+S66Xv(uBe}Fzc+A@<7n8_e-<+?W);~`~lU6PP{?yZ|HZZ{;2Rm_&YNkRUBpn^COlg zAcJ|+3EynDr*hAjpO_g6Kl6TJwt)P~%jc$Bg~P3I%(wPj;S=f;B zwBO(!P`?eq3*l_lmRNoley_J7mYvKWa&tg-AvmEr-!*m%A8Xr=>I`o#+#ZFIw8Zr3 zZM#9;l)ek`mNKp|Qd|EPtB2OSOz67Es*{H-$GJB)>!KF#Ipz$G{5| z{uVAlwNQ9L$4j}}UTd@Pm2jkY`-{j?q`hMPQFx>`R>&8e_H9(wwg}a1%lr$n*OveB zqJ_T|9TlC4!Ng=11D7W^RwQ(sDp>mP-lAY9;k%ec_PC>((cIl~>-8QcZ3(IYywQ3G zyIM5WVay&Twi(+M_EDABA-cO-F4fmm<1lfV3v%&z0o)$b_A>G1_VHfly@@XYFCi1x zaSBjc7V}c75-BX>)wWSV)n9qbeA!cZ3(YtoT&%jEzIdpXYfFq^h*$XCZiC>G$R%aA zE9{R*)A0`B2ZRMNkCsaYH-?wV>9#x5($EVAdbh82{G-|sRdV1J=Kf)Yv!os29iVC~ z+%UKwwf!r+;JFW~9`!sa5RA~a#4>LPQ!=^TDiv=f`v3GEKs5}(b8?g0Z42)Q1k1>M zPHuG5QtSO%brpils#y`dsW1-Tc%~{D#%OZ(&KxELBKl))9cN^ zoHs2auMtQB(x$^@lG}|S2C9S#zv(Thqlg(3^4{yjyJEa~IDE z{4R6Yt&U>(#=hnC9+6v%Di_FfENhrFdOw3Zj4Cm&np|$UJWO7un9Yw^;XPqh-skvU z)AqjH5N&^&dqi#qdjEAx)H=BJ%n!l}gy(ePeA>3T&=fy@Nu6W^TpR>PnaT;DX);vD;Z88csqabOQHS_In801WXVNf#VfhV90R#n^czPE( zdm-U;xLV0^lQJPnVDa$Og%#Yd*U@jqiqT^>*o51w2+hVy6Aot`_n0C=qTr}en z^9jfjrX1$i$t};D2%N=?NxbD|lw>9gD}XGp<=+NX6gCB}fNHZxnF9Az*i7MVX1kH6 z%&4TJ6uuM$J%jtrg}x@Y64GC2{sMT1L8XB!YkR1pjIcS<>e~JQnWu2Zlbv$46(Ch~ zq(+|r)f=i?=zD{{(R!ogs=_UWdxCVO-q(cH6sj{V6l(BlG70e=BeFAsbw1lV7F?yb zEK>`vHgki%`SjHh{tma5j4vpyEBBd>dc69~Bhs?#xQ00;x!ZJn-dMsdU6;E_>RH^sSD(jNXd8*Wi*1J0i&KLKg^1tu2#|6slj#bpjblb1xS! zj&zl2`^-HHx1ZP8Q_PBtQ(ej#B8~!2G9N9ASTugL;=y@W6ssfiJ+d2bt*xFH{Erf5Z%A4rx2gELXiv z-yns-Oldb5!uuN49yc8-oJHDR;S9oW!DY2fAF5IsS=Z7>Fy}G+D6fVYrIP!Hl75uaVjCc`zg{tkOg5l&@3Wu`IHnUj`jPDW*$ z&yZ_}^pm_zqUctz;g8 ztm1v{dr1kB!@;_TYXyBHe~+%3N+GRdua1D7sfW$4Fja&!Fe;*3D+|{5j?cVMTgiRcS^?~`qCp!jc=nu1FO!It4hHpxv^G#UvD+J zzUFRL*urdOHlX@F#03{3!{M$Wy^pV|lbm#>H|44uz8~K#gH9=I!?K;(!R!o8%^WeW zXROemT>VC^>NlxfrCgcnt;$!aSHEtRvJL82sa3O8-7?{yt|$3FM47VHE3~RtrD=uh zssA@qu5y{Wt?JimRk3b`I<0EeEnlJT+GxFFhe{&m?{*c6HE-9xfBUXIdN%LbyGO^~ zZMt=f>fW(=&w+hA_2}NJV^rVf9ouwk->Of~Hf`HC@87C%a#J`v*I@u{s})ZC;h{ORgp+ zH{e`zPB!SX{^y$qzA~+{AnuMUcxFenCav>2W#AK)PBR#skT#X$%$`C-7~gh1(J@r`0$zg(p=-2FV>*4X1mE_e z#lLVwEPMDbwkas!eZI#>yG&Pu5NC0L9Hf_T%%%So3H z{a4~7+UNNxFaMo5R=gaI0T>+nBI&J87YDjA4i@WUtZ6e=RAQ`9?=W^e=4$S7*flX= z33RX%y#ZnMeGtv+^&~T?6j0*^fHgdVC^+^!2gTr>j%g?IXxsOwvm?pw7Q<@@=CjfW zQnN9qmciRr%x{|`UbF7TyTr3O^&*I3fQQIS7ka6dn~B74<_*4miUlDNI@CShAFi|& Av;Y7A diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc deleted file mode 100644 index ad7d80ccf967ea57c35cf42ba70f17a46f74c587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19105 zcmYk?1+Q}FvgH5&6E`H4!k>Yu zLg*Z)Rh-UoTgB}huT{Lx@tejekf7Ud}^KvYf#!xcu z>p4}?NC46}$VU%ZdjNNWtHvDsC)}1+$4Dpb%H-SxAtWMo-`or!H`9c$m#f9Voz?PN zYZyo()4p^ntoy7x_{;F58r9*tghuow8*^g!)o6lo)1XcCMxr&b<$ngPb-G9;o>NQV zHf|4lR3|Wj-HhZ5VKh>U8}y?044OwYzHlklRX9a2Y8VOHoy z^MJETyXe+}Tkm-+Wc*vFaU8Vepl9k3UXY#x&PkvKf$w!!bAOckzlF9|y`(W!y2{<3 z4ql?u7!_Sfdoy0w$jxMN^50YWLt`&)_Gdz9F1=xy;%a9NU%*;7++Ga*%yUnoA%76J0o)P}%1BF^@fnpqYT49Y zH?1b8dAaYX)*Y^xD|z37^_gry{yDX)MkYmj)#+P%TqL?Zq*0g{CuT?3D7xqLb?8QU zosPgYrjo^}j6K?-b+`VH!Ws_h82PTW5tCnoJT&bT#sG~^sQjn993!LjI%~fP&A2KO zyOu^_xYu#h+T)t;9b4wsNC+~Q=t~$?;8JPiHn)Onf12n|a6?(E2l5I=8rO6!Z3umU zv%2ixoSJcU)r?j|7lPc;J#P32Hqzog_67B&+WMdzJ?ENI8}z0ds%X#>_g74#BdHg| z+^CxLG?NJeINB%OfmYSXrm-}q=CLb~AF107&CPH!UN9=S({VQZdw`e<^1QbEE7|&CwPIMzmMDk?34r zKBZES%1frb$LUsjf2m~(r|1zzVztXuZV3l~-!ScfMh;Rf)mE#`Apfq~cCH!|?MCk{ zyImr%Ti5~eI|l>Mwvk%v4vt~;$9)51zQ%c?!_C;EF&($0RWtJU1I8JRFA1cAdk3wJ zw3Fe(jZEv5z{oN#@f+`2JB@^1t_f;Yja&he*Za~zqn6r8dc8PJYT5#{myO&4Je9xN zz>Pr80srVDKH8})TzkXs;|}3|hH1xin-N&R=@*Re2bqn#0PP0lof=b(Or$njZCs#5 z7p?!Aw13cxmP_M-d}l^CqRWG!Xrx9}*2ZYOi}4c&4TRdP?e#NsoVlgdX0eu^)Lpda zoodmmtC7^zEeo|Mj-?Y3cm!7tZWml_VSH>uZKN(EIHyqt5VKUr&W5QxIW@DYbg zDSW`e4*R}CzHN|-M#t`kmWlf%l=oO>mJ53sqovvcgG!>^{i&*VHcCVpeAC${EMI{M=T=xAG_%p-nxV1mk`l#(CpT@K)3}r+6 znP>&IDnd@L&n;n*MhCZh(?$_j^^L4c?-;%0(pPjh7=GDfyeH(KJiw_2r-hvEa+*X) zruG-^P>-<|sXFZL3$^H!^tfqn2ql7zsIJ-#j3$(GTPvHi9I3fP2MIq}>ygtR8Yj3K zAHdNf0)OgeB)ZvJ`=qJOoki+x>*oMkO%0pm9xuo|(hd{yPK+rn^)3gC{`_y8n1?k4``c#L(_ z@&f+HR9Qk4tbFobm~~gx|unsHeHv(EbK~%4sh7 zyCFoob@#c`a2bJSMppN7n$uN6_uw?DqT9~zj$6&G$WTgp-C`lqbL{40Z6cNF8eh26 znLhSUq-hNQ4DF`Vl-Ow+>tY{SXhfwAYGavy(UQUaM*a!fbJE9w7TtlHy!xq98>*(hIrShg%MBIhZz)uepA&>MYHm-UyCxzdng~OmIe0PK|Rk)LI6F7L^wDHm& z;Yy++AVnF!g`p1K`s(>P)Yai|AnKWN`I`;#RF^ ztx9Z^0R9whh_DiP5L#pJK~j+C$$v>NyY4aF(N14;Fq!)YAgeu;nKpVJ?Wh@lnbywS zT;z|tgNEEcq|y+sW>AhMsohuWN%S>(4Kex}^cBdDAVtWh4I%nO8prU@$>$)o#2wtT zQEllF-P5jarFUZl(E&u?fGbM5yRYyiOeWW8Mn0QU!T^qfpYRoF^Lj>hkZweKfKe%& zq8Vz-$R9BGffa5UxeKJ3+Vey|M~lPNUh+42NoLitLVZqe2rM%ztwH*wO~`+3~VfB?V;UHXO?EkBu(zH8;KkuBsXN(HdzK7M9v$ z6ju!m&nK-XZ4La8$^*45!b*e25=cj{72GdQ6MQrVGMNu#0;%Rs%MJg@3cI{@`_vk^ zl5iQ}yTq?Y^XTm{ZHpOeh}H)_j{7V54{Y?6^p13LST*{Az!7N-fnN>p7V7}`Q{l8U z5ihqvk_Lh3qd47e9fQ$YZ2`L*4k*~2DRiEQ-WS}Ksti^2Il@k{y8J#x%TShO9s6tD{dX&Twb3KP3r`=jQp48 zCLx+ToTA%srP){rGSoe1wp$xB{xsvLM$e!U{SJIf_Y{HeHC8z_BD#c)^iJ_{6YCD( z>YyJE_0T>QhGTTrm|)ubz`30M^>!xVR+$lpp%l8gbj$dd zmSA@%S{jDB#$LAYovX{i-wVQskVZ#Hy+hzt0yBd^6yEdjc~dLI#wVnfGPz4_HC%Se zSA=kg`6yiDb07#S6%yvWs+1L=U)Rd@%a zpi?`d6LFu$Eoj<%c8iB`*&VEB?JJChrWFxVf^5+pg}Yk%9^7fP{b~j2O#>MeW<(2k z8Km(-s73vy2RYbn3kXivRS01OlY9A0iMsFQjK~k&uTdYymsf638;I(Lqo7m|v+;)uO9OQCZ*wMswJX`7ww2URMB|b_fl-6rvjno>76z{1!U}PfTsHySMuS>~MpV+}^bac0 z$4=jaFnUX)G^vkCeHB!q zCTgXqoMo-HZU%c)bBX7i_E7%8w13bJ!!2~W%l#wEOh-#Bj4tI<5Z5n$sm2KwLz4IWqdH&j3C1anFX;%pJvUyxH+S_BOZp6?DqMxZf1kMFA z1>;}ckLeW)X>^Inf6aJH_=P|{;I(K^*l29upLLrEQ`9OlnV(*7wYP=#>>l!-mIQf@ zwg1?7R+?9LlaPsnr^yebTn%mwsbYqA6uRHiYX`np)woK`U`j5G`v)E2nSmyF&O3crB?% zRIb_gq411!Gw@#B3r?4bX4d^etpWMnHkwE!AxJ%b^?P!8m-d!H3&q{I~^jGi1Iuy z;V`Fy7z63$6$;^I&^>0~0z{wjJU-RENZ=C=9`KT!z#HywEnF8}{~9OePWliU^V~)) ziF$jO=}95 zS(=V$YM}+sf1_P9Ewb-c;9rE|rsWID(Rq4n2-Lu6ZCYxcN2+~l&?~^VJd_{QMut0$ zCZjba@QTxZxPs=UcWS~*FW^SFxj6XTMk$3NX7qQv8$HW2;mJgS6+XWNCVEh%gm=(3 zv%A|K>qtFu>Of@+l}B8qvfE@o-YXG3NTnrOjHjQ+_vBvbE_!7_N@^5l@}b5kdK;bg zY5W>aQD=sR8u^!vj^gHWde1ezpmEkUouyZlt8_e1CQzBwL5(A51DwtPzsp(^(>i0^ zwtiNOLLiUTjtbwhwm@x!OB_L^mhc}3nKaHxud=aAco*XcsZIpq!==DoVcL0j^^rzl z;2A!HwHf+etrO!JSo@Fh8BQP3o2mOU@OHI2MizA{3|E0vLbc3JtIeo~(M4!uw^IX6p_qyl1gUKfD{(wd~ddpnIIFQt8|2Z9T z+Gg{LPUX$G?=}u${BBxfGxG5=ko${HLx5is_7VL`qX_q7r3EzR!CeoHsJ?gO7L|({ z57_e@ z%T_H8QeSP6?m|*?F`n0G3eq|38|`6euUcQV7wGkbdmUpU?mZ5s_z1lco?A2mBP+;I zH~9+gVGrPl`%C9uZfH#9c_@Ll8fOA7nvVOL8HEflBP|bimP&KDx#oW0S>`Zzu|ccU ze&DaD4{R;Zt(o2S2(JojyayLGo+BRzqY`dTUaI=bPy^{D*7c1NlN_XGxUi@r8{^q1 z12USIqNX*c7l*6>Qz$Db2`!UxJhq0la+ayLir>} zLA3H3Wqly>5#4Lr`)=(4+EHm1PAfaLb1DXROLrXZ9#Ug8V(86PtE={>K}$%z4Lr!H zAeA+4_d|?RAhUoYkbN4T!)>MvHZ;VLWSv{n9w5RlwaW{X-ZG5|>I+n_nTH z&y#r=Xi*DNo88MkD!=L;LR-pnPg3!5pXH#nS1NOu5p6=-V%nQt!WE9X?Oxr8`j+S5TW$6yX@4@{V8w@JvCNmTG*_NeTNr&*#MEfcKC@lilIH*K#t1ZM` zgZ2~o-dz1^^LOATO7BXmf@~B%)+i&4lJ+;Knon6N=`A<;I_2loPP2QMzzNqh*uDvH zx4YOHy4N&b*XY2(A~#e^+LzuzwWM&pxUUObS^C5s{7CA&bhvIQn}03MfmTbH6Z>fl zwdgumr9l$=9QDBc!6mjQI#)W~ZBzj%PrhO7{RxNFa#?kESSFf4>Lawyq2{-!@LR4e z^HYA0N?ze}qHW=N+qauqb*?hmvM;BX$>+zdY3bYqDyhYXtBspc?Q4+At|S{TS;8r5 zALd3a4UfxO8ITLW&s*y)Gja=$J;vYBK9Y8)@`eRhXiP@C!Ao;?a~j?(bfYYkFM&Lv zcLJk#=tgg7Tt>^G5!dMmr^m?0h5Lv~cIkMc^^Kfk##t9Ok-$~m8J`Tbin z&#Ey;+)y8TBoGD%MigG+@c&Mz`~uh4puXW0?b6659W4Cr4i2Feb2_V5PWaA6PZimrZe|xjA|Mqn7rh|T80q)XGT23|6r{JMoHXPffL}K!TrvuvaiS=aHsOO z7>5gt~qLci@`BYkpa(y4VON{@(>3LFX33N1Vo<@3Mxw*;NoelTc`ZGPts?z-i z9i}(Vcga2~4GBy#vaD(Q)xN_x$7E5oHX2DtwUBlqa8h?Y2Y1z;RjZ}8f{kVz97o%! zyHsPcjVi#U(EZAw*@l;dOBftPGhNfoAP^OHTF&kPp)2s)9_?e?G~D;%xfutqXw-5l z3Y-tPg5T=<8GcgOsk;m=r`@LGe!*28r`2j#J%HbZ!B!|Cyie~>{?Y*tB@oZ4gxWW_ z-Egy$FC}~e@|*5#tFETElcBfZMyL%ZFxBRJomQxQZrUD@M{3`?t4;Lc32zwmi&I6A zl;lr^wW1xa=?#oJ8f&Q>z`cyIlkzIvvfl zLdFoHu^=hwwHFq-&I-JAv}#k2B8!J|G;A4d1ztq{jQ1ry3x)y?=+ z?E>Y_8Y?LOqkCVic-SbKP4rj0Z8x${_$)+~)J~GWZ`vW;W+3T7riP`Xb07x|Zycne zGt#Oa=rXm*=GGNnG_9wwi{33##|-!V8nX+d9apX0WEb*j)rJVyq~8H2u*^Hs`UG}h z6vY_eayn2>sIgyIDA_%Sb%|=_dUGZ6}lYfS1E9rJT?T&#HZ3)n<0f z<~w2~&!q_T#XS!^i;b2B4dZ#C+EBPGaKGywV<-*z<{?CF>6Irxlc70iH;nvGEk0UK z7naM6A9R1#O~&aM-4BU=?{q-8XJiAX=5AvK?mrm)f?gDy1wF%yXzVcKV{0wcn1oi| zpu@a84VMA#2Q!Z7UboCDVVv5OFfE#j`wFQPxHZx05txKK&b~Eqhj7pr_^v(PqLK}* zKHPw?Q8Y()zUPr#cZXABdY7GQTe^XfdEipG=az7BEg0Wv7rin@o)bD~JTQD4Zo1$v zdW<`h`+SsR(7J=H0~y6j1OA4Quc$Fdcwcx(z8c&=49&%TkD>cS-?d;br++<#v4)Rx zN?=;zkVc1eyAY`3@eI^0L8>76Veapw+I;u-h>gh%ogtOn@QWJ#g(*}Ha8O!0irs-A zx&2UItM&(h`25;a<088{87UH*V-=u}oLpGE`>ie&WIh5P@$k6W=LLY|7+v?jO1A^3vHLm39A;W-;iP?r%=_49{=I zN};zIaYKko8Qv%iir#m6%G^F)(WT@UG1OPu*O%Zr-6h=jc1kY{3)7-ZxMPTx72*Uh z(Q&nxq`M8D&(%x(b>g%tS10*9pqrQI5F=A)+y=>QZgzId!Q~~eQMd+Dz#H41gE!5X zF3n2dJn(vrni?IcR5$lNZh76t8hxqMaK-Cwd613o&=wp1fw?v4jl_LX_kr3hkc31_ z3Z!1ZEjUkYjukWxFUSW&}6498ZAvL6Xc`tD{y%0I9&xYLSqkH6=5j(mqRz|0+(Mcbr=){ zE8#6+a=*Fx(6&e?gyB)J7rx~+_Hr7>?|%m@oytb3iN+Te+o+nkG18s{GCBRMvB~KN z*IC4=uzS7(+(oU7)6sy7W|{Vj6)prwlui1xxwF*zIE@1CN3@KzN9?`~Eq5Dh{aRa2 z?R!`EFo2_&90(W1InLx@&WF6gq;YE%xNndpkz08(u% zUBJk7oMsVD5M52Qra=>Q+wt7bsVCY>dQ*LvQn;Z!RFY|&^N~F2be>cNp<}FoSDYl*(+Q^e^JY%i@fZqrYB?_fLQ+pF`nrT-!_%Rj?_cgs4 zO!f-hs4~V|tleezXN-TGs$ok%Fk%rQG3Js2|bVTPG^Y5(;X{KX@$259Fk@iihzv9T}EmcZXU1b zSi^VQvK>RaT*POj5>Pqh3H}L}nCBiK^+|1p`xvAqa3RVYNF^|LSC|p~1^kEF8Mr$_ zdU_=-{URGFg0-k7TmdGhk;qr-DnW`=zw7P@B{7Ms8)} zIKB9|Ev1z~T63@`sQ5c8;k{?05tYH@FTyP$&_W|F#>*OuOib!A87_0U(`AtrnaK8YVA8OHuymaDzy2e=}mvUOpTep!)5%0n4=HB&% zmrZSl8~RM6i7oFN^fb{lHh%$ltkWgn`9!-rjbbC2Mn#Mv1X7{x#<&8~fnI*Kc}`hF zBP!11S4PgjIBJgy!YrOo;%)@~7j30l8#DHq(GqTejT#BX;0n9q_*@l|_8_oG+TL}p zVDfJ&-@#>+7Nz_&fpi*iD1T)}UY=h8siO7?$QX^0q{;;Os5$quT<3)VjxtDJfm~M47vfN!$VLVZ-u9r9ke`A3q3-LrKS?{p;b`a0N%UgjmYxy!BJfJz;Zcd7hlP;==;CessmQ@YdAPn-5Z2vH1`x*COrEy8Tp zN)a8v#t5}*E;}93TGCH7`q`+oG_A%5XfI2@H{+zGt4qrPuM=K0H@S;_$=ozNmp16S zrIP^17_^RZYohVg#)cLAN3t-|6~Bj;R`>&CO;C;o=xzy^sDaZdqGNE|x{W7JZwM3F zSmTFCUH;NBCZ-L6h|y(RxxD*=I-OdizTq;@{`9b)Yyf$IeNkgrX? ztxv@^jb^}mO&bbwR2ZQ4nEP*BSi2w^Wd`mDx7DkQ!&ow05iNXEOY6 zscNmtP1-eU*seyC>W$kqY*MXylhttsBn%c}!=ox20&*0X*Vmh`S7&E9#kx=T{p<9=M zt^39FYuzsNI`NTK13GsJtd2}~9nhtJ(SF0uBzdWK-_Ec1>QbR#*xTQAijyE- Hf_VP}t^0;E diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc deleted file mode 100644 index 78f2998eb751719898092adaebba68f2bfa39937..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1148 zcma)5TWb_C6i(*0(`9?HQb7?!pIp#_)h7|r?v}o|RoJ&-AY>=$b}(~kk}YiM+ZOsa z>SO;>UVZW}_~bb=UAjdCGvv(4NpddV`NG%Ny9CCmdd6Ku$WL6XjsO;)V45KaK?GH# zpb4d@d&(>P#BX$81x1*IjUK3|=p-FV4v7dwbV)=c>B3K9(HWC|{ELFCK6Q^qGiCGr zxs`(xuE)}T)73<3*x4RbA}^<7%dH&o>?AKGSf3p3@4bDqH_VOI`DAAEs{CAXH8;6| z-OYBFjYn+sb$IY4gCO^Yf4eg8K#?S&f+XG*Ii`XN?=nt&83D&(0|Rh`zlnrdDY0Cif=?MYR#X>QXgFC;TH&t!Tg%d=GFlhou^ zz6R5GK9we|^Ezd)Cn}w0&^saF)&!daE}@0H^<2l0;tQAt6+$;?m&WvbXBEKRWs!d& ziD(Y+G8QT*AmkmnsJ*MVz@~dB8m$ozVCj083)Id^sNf}7j0b{v=a272T|M=GkvjvV zpppL$9V=c=X8;biei`&a;VX%Qm5Qv6C&p|Qxwqx3hJlgd=+Srk4o5kc7gtlKAadO)&zYM;* tqJ4D@``lL3;}x>C{ENVg0Wu;v8`mqj+%+Zs&=&adDJFzu=+Wl${s4ek6ubZc diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc deleted file mode 100644 index 0ae780aa0eb046c26f5e699db372350d3c034f03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3017 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 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc deleted file mode 100644 index 6eadc0da3cf2206dad56b70aeddc0cb99af435a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37606 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 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc deleted file mode 100644 index 836d08b1a468e9af8ae8096a7321791cd5ec0dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21808 zcmeI236xz`m4;u1R8olv3L+{Z1PDlg1OkK^G6TU3kO0x5;PI0EsFbNn6{jkR!GSOj zGS5SpXGFq058~YI(6_qVDbCuhKDFB(wHxi>e)rE_=iaJ{5L2#lEgyIBy>rezXYYRx z=e@8&Jfo@yALJ}|$c)#4l0u*5#z z=&e>6H)j8qHonQ*ROC7fJqOW(Y{uB*o4g%-OJ`%IgtXiE! zSV3N~>rk9}qTIigrfLHBs6>g8Y_km8xhcjkT8TE5~@+cmZ=#A&a zcPk37pH8@K-OaLD zeYrjDa=P*upDTzSPHw-nQ+Y;le;h?Gu7pqT17DLJ&59?AZ{mI* z^^KEtuTb2hQLL*gDCQbl>LPY3hQ2$nBu$E1{b@@H&>u@ZcAP~2l(@@aNjzK7XFoAY-kj9Cx@Z5S8qyGzFp@|7zww)w?6kS z;>PO1tLH=6k%FRU?6NDKa{uV_b$!M-m2=rwW<+^cWPZluj5%-x^29zV&SH!|vB(jForW+Uxe1=}e@L{8Ngs#0r-E zbUp{#t;6eDAL(qq<6-o=sj z!x&jH2in02_uY55tVK(ViaF4n^E|P4T&FC^zU+7oqHW(3{ls^1EsorFF?zk{WPf|b zHCK?2+ZDzb;z;`xVN}t7v?<^Hce(<3b$SGOJBp>h1!+5&#+q^(pQ1&@J|%PJ@S;d{>Ec{`|}IX|Kayxphtf6EiMIb>}S(Eu%llm z{X#HDmAp%zejQXJt&pR<0#$6&Ug8_iU0m^R0b-5*T!Cjn6=8-BSB#a|2hrx{jbzPZ z!n$(cvFewZT`^A06wP2%L6Iq1NY0CoN9}+5kb+nRG;dzq`Q7r2$Ecy`Kfd#IWh1X3 zZ*g)m%4C-<+yM@!NASs^F2u+{TqS(l>A z+qkLd^1e2`$7>!VRv$=#JV~WzNqX`Mwj=}ep6n0A_%4pvM?C1rS0Nwo=8e6pWDzQE zr{_rD0RCOY+x+*z=J_n{F2=6h#x?Z-b7cWWl~~H(#-imnJCki9@_Xpr={oSJOsEsp zC)z(a3fw-?sTReUr9^r6D!Ago_)e7lyiesjt}t@{T2&|Neho$yh#YI`ZAgTk4`p7z z1l$02`g`w#H(T+6_o=h69e-~Wv0_*J>Jh*9+Bujxh!Lv~G)IT>lOM6dI+^esNXx(x zzVWJZfDJ~fg?|UABKp>HOYYmf4n`j+8bu!!Fju`*A$b&)8)+IG1+p7E(fxS!{qAc$ z-wlIt8;MnqZXs3nmH4UZ^TySv3kE}h*ViLsu2{V;K98Sq&tND}XRG3V&-pBlbti~l zqo{#CC~Au_z1b1DR(@TLXP-H5I#G!L^813V+MHF2Q# z`L!nd!_O$|{}fM*wzt?A8*5wJTkUPOjcsdhx9#j5w!OX6-evE$9qc`}qrKO5vYl<5 z?P9yyZUvv?ZFk$l-e-H-1l!B@wtZ}(O|pG$Kbvg(+W~f`)#hxv-!5bj<*wRp)Il#?Ib%nRl3+d zU>~$*JH=Y;R6EVecDhw;i7hp=s-0o2w#?e>L$=)7t;1GWr*+wx7OdNPY^ANT)%Iaq zV`te%?4$NE`?#HLYwa96*Uq!^?Siy_FSLv7V!I^m=}YYsX-8jXm)jL~rCnuL+ckEr zU1!(Z4R)j5WH;L_cB`$k+w69`!|t@Z>~6cq?zQ{uetWP+PrRIVg?i!@d(}R@u`}q4rD=`Nv)Al1_F4N}S}RrQ!L(iv#Yy4fK2@M;zU(~juwY@rHO;2^^vPxJ~ z?U~nU)%IHYw~tB_rq-sWAGL{KXD|-z2KENKgMGlkU|+B&I2`N(CV@Rb`q!9BwFzJ+ z@IJ63*cBWA_5+i_6tF)y2pkHI1V?~FQiQD-Z3{+$?Z8_=_Trt4-U^0+9l#jC-@2-8 z4Mu?BU@RC3nm{9XJ9sa6H`pG$1H1>k3v2@p1bczEfy2O2DFSODi}L?i`(N-s;P+r2 zXa-Axfnz}jSPrUS0eBvq0L}n&!D(P2SOH!D?cfw}99Rub1gC>e@FM62)4^T`{7Z_!^$WX#-N1OTJJ<|e{cXe5KI9FfrCMI8xLi47&sgpk)rl~Mn^LGS4KyHsUT~;f8)i!ga2S{ z8l(RNOTcfyZ^3_o{|2vv-=)~I)R3M?|JAoZylT>%iOfQX!n5$R0JHG3c(d5Dc(X)g z(h#nMWl?4c%VNu-%(9jRm_?qYE(Ae44C9!Rd)@PCj7|qj!Ck;W z1yF_10gg*io5SdX;2y9L9G#*zpAo1X&nUx*Ocyad1$2Sspgl$H10XZSmq%b4TEUqh zJN6+)Eg*o0z_B2cF^|y+;0(|PZcI_jj?HDd7-ao-5~EW=6?CVlWk$9^3%3C~snPGq?rZ3f6(!!0q4;a3`RuwYvdztKAFk1NVamz=MDk*B%C+1do7E zfk(l5@ECX;JOQ2rPl2bwGvHb9T#B#&oD5E5?IrLscm=!)J`G+=5te~Y&;zJP$m+40 z5%mbvBT$b(Jp%Oz)FV)jKs~}*Ks^HW2-G7`k3c;F^$64>P>(=80`&;gBT$b(Jp%Oz zR|4u0s7Ih4fqDe$5vWJF0Z@uSDFUSklp;`yKq&&H2$Uk+38+G#0D%Go3J@qjpa6l~ z2XY_CeIWON+=umGHkbuwf*C2!8a-#xf{BM5GUd>TQ<_K3SlQlM32l`Xtxda(E6-^B z_0*$RlDOomW8a z_MX>!e(wdn7xrG%dvWh2y_fc0)_X7dao0}@_UCSyQTef6m=gszEm1BdRW5{KCca*F@)Y5hSmMo^Iz}( zq02!1{?+f_&~;z^`@eqw>i4gH|AsCD_4`-9e?!-O_20kx{j1-<`u!Wa4Ak#m{r(MI z_tk&@>i4gH|LXT|=rT~hfA#w}blq3~{j1-<`u!W)`?t2VCC_Uk&Ms})v)7RR|M#KH fecd-1p!-Tq^ibpQd`4a$F{<7ff6*D(WM}+8VsW+K diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc deleted file mode 100644 index 2b64be4752034d86d23bc65deb850d25819fedd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20484 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 I=&&>X4VHn(`v3p{ diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc deleted file mode 100644 index 559c7b4639fda1903b9480f35ca9dd18e51f48e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20552 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 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc deleted file mode 100644 index 44523c9d005022b509fd25a9d064406b4b72d8f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2953 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 L*T}a{Z+!MY7R?wE diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc deleted file mode 100644 index eb07ec7b8c0531050b0c1b041638fb1697c8c542..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15716 zcmeHNdv6m*5cef_j_t&GCxnm}5JC*3DzsEkRaHqa6i5KYL6ugPEaP1#ZtWzs4K4Ww z{SN&C{WkpVe=Ak;H)!cY-I=?+-CO63A0fEqa`L`relxSPvvYfw%f{oe5dZtWxS0JZ z7Yh9f9rf=u?|j97m0~m$q9JM&LnVV4Mu_&2K4yH|&wnQTD75^37N_Yy!HZ}iMXmEQ zBuq^*!1}1g!fb$s>A=qxiO>j%I=ZA*+lDCTcB}LY~0uwcp$YPSiTi zGj2yhLp%VF`^&GAVLC!aSe&obFdLzxXzwT;BV&#a<=X1nbSniNrRPVY